blob: 90aec91c48840a81d336f832857dd1741286a827 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070036 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090037 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090038 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090040)
41
Jooyung Hand3639552019-08-09 12:57:43 +090042// names returns name list from white space separated string
43func names(s string) (ns []string) {
44 for _, n := range strings.Split(s, " ") {
45 if len(n) > 0 {
46 ns = append(ns, n)
47 }
48 }
49 return
50}
51
Paul Duffin40b62572021-03-20 11:39:01 +000052func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090053 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010054 android.GroupFixturePreparers(
55 prepareForApexTest,
56 android.GroupFixturePreparers(preparers...),
57 ).
Paul Duffine05480a2021-03-08 15:07:14 +000058 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000059 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090060}
61
Paul Duffin40b62572021-03-20 11:39:01 +000062func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090063 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010064
65 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000066 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010067 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000068 }
Paul Duffin284165a2021-03-29 01:50:31 +010069
70 result := android.GroupFixturePreparers(
71 prepareForApexTest,
72 android.GroupFixturePreparers(preparers...),
73 optionalBpPreparer,
74 ).RunTest(t)
75
Paul Duffine05480a2021-03-08 15:07:14 +000076 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090077}
78
Paul Duffin810f33d2021-03-09 14:12:32 +000079func withFiles(files android.MockFS) android.FixturePreparer {
80 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
84 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090085 for k, v := range targets {
86 config.Targets[k] = v
87 }
Paul Duffin810f33d2021-03-09 14:12:32 +000088 })
Jooyung Han344d5432019-08-23 11:17:39 +090089}
90
Jooyung Han35155c42020-02-06 17:33:20 +090091// withNativeBridgeTargets sets configuration with targets including:
92// - X86_64 (primary)
93// - X86 (secondary)
94// - Arm64 on X86_64 (native bridge)
95// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000096var withNativeBridgeEnabled = android.FixtureModifyConfig(
97 func(config android.Config) {
98 config.Targets[android.Android] = []android.Target{
99 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
107 }
108 },
109)
110
111func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
112 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
113 variables.ManifestPackageNameOverrides = specs
114 })
Jooyung Han35155c42020-02-06 17:33:20 +0900115}
116
Albert Martineefabcf2022-03-21 20:11:16 +0000117func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
118 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
119 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
120 })
121}
122
Paul Duffin810f33d2021-03-09 14:12:32 +0000123var withBinder32bit = android.FixtureModifyProductVariables(
124 func(variables android.FixtureProductVariables) {
125 variables.Binder32bit = proptools.BoolPtr(true)
126 },
127)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900128
Paul Duffin810f33d2021-03-09 14:12:32 +0000129var withUnbundledBuild = android.FixtureModifyProductVariables(
130 func(variables android.FixtureProductVariables) {
131 variables.Unbundled_build = proptools.BoolPtr(true)
132 },
133)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900134
Paul Duffin284165a2021-03-29 01:50:31 +0100135// Legacy preparer used for running tests within the apex package.
136//
137// This includes everything that was needed to run any test in the apex package prior to the
138// introduction of the test fixtures. Tests that are being converted to use fixtures directly
139// rather than through the testApex...() methods should avoid using this and instead use the
140// various preparers directly, using android.GroupFixturePreparers(...) to group them when
141// necessary.
142//
143// deprecated
144var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000145 // General preparers in alphabetical order as test infrastructure will enforce correct
146 // registration order.
147 android.PrepareForTestWithAndroidBuildComponents,
148 bpf.PrepareForTestWithBpf,
149 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100150 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000151 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
152 rust.PrepareForTestWithRustDefaultModules,
153 sh.PrepareForTestWithShBuildComponents,
154
155 PrepareForTestWithApexBuildComponents,
156
157 // Additional apex test specific preparers.
158 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
159 filegroup {
160 name: "myapex-file_contexts",
161 srcs: [
162 "apex/myapex-file_contexts",
163 ],
164 }
165 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000166 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000167 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 "a.java": nil,
169 "PrebuiltAppFoo.apk": nil,
170 "PrebuiltAppFooPriv.apk": nil,
171 "apex_manifest.json": nil,
172 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000173 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
174 "system/sepolicy/apex/myapex2-file_contexts": nil,
175 "system/sepolicy/apex/otherapex-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
177 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700178 "mylib.cpp": nil,
179 "mytest.cpp": nil,
180 "mytest1.cpp": nil,
181 "mytest2.cpp": nil,
182 "mytest3.cpp": nil,
183 "myprebuilt": nil,
184 "my_include": nil,
185 "foo/bar/MyClass.java": nil,
186 "prebuilt.jar": nil,
187 "prebuilt.so": nil,
188 "vendor/foo/devkeys/test.x509.pem": nil,
189 "vendor/foo/devkeys/test.pk8": nil,
190 "testkey.x509.pem": nil,
191 "testkey.pk8": nil,
192 "testkey.override.x509.pem": nil,
193 "testkey.override.pk8": nil,
194 "vendor/foo/devkeys/testkey.avbpubkey": nil,
195 "vendor/foo/devkeys/testkey.pem": nil,
196 "NOTICE": nil,
197 "custom_notice": nil,
198 "custom_notice_for_static_lib": nil,
199 "testkey2.avbpubkey": nil,
200 "testkey2.pem": nil,
201 "myapex-arm64.apex": nil,
202 "myapex-arm.apex": nil,
203 "myapex.apks": nil,
204 "frameworks/base/api/current.txt": nil,
205 "framework/aidl/a.aidl": nil,
206 "dummy.txt": nil,
207 "baz": nil,
208 "bar/baz": nil,
209 "testdata/baz": nil,
210 "AppSet.apks": nil,
211 "foo.rs": nil,
212 "libfoo.jar": nil,
213 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000214 },
215 ),
216
217 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
218 variables.DeviceVndkVersion = proptools.StringPtr("current")
219 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
220 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
221 variables.Platform_sdk_codename = proptools.StringPtr("Q")
222 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000223 // "Tiramisu" needs to be in the next line for compatibility with soong code,
224 // not because of these tests specifically (it's not used by the tests)
225 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900226 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000227 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000228 }),
229)
230
Paul Duffin52bfaa42021-03-23 23:40:12 +0000231var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
232 "system/sepolicy/apex/myapex-file_contexts": nil,
233})
234
Jooyung Han643adc42020-02-27 13:50:06 +0900235// ensure that 'result' equals 'expected'
236func ensureEquals(t *testing.T, result string, expected string) {
237 t.Helper()
238 if result != expected {
239 t.Errorf("%q != %q", expected, result)
240 }
241}
242
Jiyong Park25fc6a92018-11-18 18:02:45 +0900243// ensure that 'result' contains 'expected'
244func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900245 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246 if !strings.Contains(result, expected) {
247 t.Errorf("%q is not found in %q", expected, result)
248 }
249}
250
Liz Kammer5bd365f2020-05-27 15:15:11 -0700251// ensure that 'result' contains 'expected' exactly one time
252func ensureContainsOnce(t *testing.T, result string, expected string) {
253 t.Helper()
254 count := strings.Count(result, expected)
255 if count != 1 {
256 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
257 }
258}
259
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260// ensures that 'result' does not contain 'notExpected'
261func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900262 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263 if strings.Contains(result, notExpected) {
264 t.Errorf("%q is found in %q", notExpected, result)
265 }
266}
267
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700268func ensureMatches(t *testing.T, result string, expectedRex string) {
269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900280 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281 if !android.InList(expected, result) {
282 t.Errorf("%q is not found in %v", expected, result)
283 }
284}
285
286func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900287 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900288 if android.InList(notExpected, result) {
289 t.Errorf("%q is found in %v", notExpected, result)
290 }
291}
292
Jooyung Hane1633032019-08-01 17:41:43 +0900293func ensureListEmpty(t *testing.T, result []string) {
294 t.Helper()
295 if len(result) > 0 {
296 t.Errorf("%q is expected to be empty", result)
297 }
298}
299
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000300func ensureListNotEmpty(t *testing.T, result []string) {
301 t.Helper()
302 if len(result) == 0 {
303 t.Errorf("%q is expected to be not empty", result)
304 }
305}
306
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307// Minimal test
308func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800309 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900310 apex_defaults {
311 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900312 manifest: ":myapex.manifest",
313 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900315 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900316 native_shared_libs: [
317 "mylib",
318 "libfoo.ffi",
319 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900320 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800321 multilib: {
322 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900323 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800324 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900325 },
Jiyong Park77acec62020-06-01 21:39:15 +0900326 java_libs: [
327 "myjar",
328 "myjar_dex",
329 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000330 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 }
332
Jiyong Park30ca9372019-02-07 16:27:23 +0900333 apex {
334 name: "myapex",
335 defaults: ["myapex-defaults"],
336 }
337
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 apex_key {
339 name: "myapex.key",
340 public_key: "testkey.avbpubkey",
341 private_key: "testkey.pem",
342 }
343
Jiyong Park809bb722019-02-13 21:33:49 +0900344 filegroup {
345 name: "myapex.manifest",
346 srcs: ["apex_manifest.json"],
347 }
348
349 filegroup {
350 name: "myapex.androidmanifest",
351 srcs: ["AndroidManifest.xml"],
352 }
353
Jiyong Park25fc6a92018-11-18 18:02:45 +0900354 cc_library {
355 name: "mylib",
356 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900357 shared_libs: [
358 "mylib2",
359 "libbar.ffi",
360 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 system_shared_libs: [],
362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000363 // TODO: remove //apex_available:platform
364 apex_available: [
365 "//apex_available:platform",
366 "myapex",
367 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 }
369
Alex Light3d673592019-01-18 14:37:31 -0800370 cc_binary {
371 name: "foo",
372 srcs: ["mylib.cpp"],
373 compile_multilib: "both",
374 multilib: {
375 lib32: {
376 suffix: "32",
377 },
378 lib64: {
379 suffix: "64",
380 },
381 },
382 symlinks: ["foo_link_"],
383 symlink_preferred_arch: true,
384 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800385 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700386 apex_available: [ "myapex", "com.android.gki.*" ],
387 }
388
Jiyong Park99644e92020-11-17 22:21:02 +0900389 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000390 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900391 srcs: ["foo.rs"],
392 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400393 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900394 apex_available: ["myapex"],
395 }
396
397 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000398 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900399 srcs: ["foo.rs"],
400 crate_name: "foo",
401 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900402 shared_libs: ["libfoo.shared_from_rust"],
403 }
404
405 cc_library_shared {
406 name: "libfoo.shared_from_rust",
407 srcs: ["mylib.cpp"],
408 system_shared_libs: [],
409 stl: "none",
410 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900411 }
412
413 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000414 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900415 srcs: ["foo.rs"],
416 crate_name: "foo",
417 apex_available: ["myapex"],
418 }
419
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900420 rust_ffi_shared {
421 name: "libfoo.ffi",
422 srcs: ["foo.rs"],
423 crate_name: "foo",
424 apex_available: ["myapex"],
425 }
426
427 rust_ffi_shared {
428 name: "libbar.ffi",
429 srcs: ["foo.rs"],
430 crate_name: "bar",
431 apex_available: ["myapex"],
432 }
433
Yifan Hongd22a84a2020-07-28 17:37:46 -0700434 apex {
435 name: "com.android.gki.fake",
436 binaries: ["foo"],
437 key: "myapex.key",
438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000439 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800440 }
441
Paul Duffindddd5462020-04-07 15:25:44 +0100442 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900443 name: "mylib2",
444 srcs: ["mylib.cpp"],
445 system_shared_libs: [],
446 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900447 static_libs: ["libstatic"],
448 // TODO: remove //apex_available:platform
449 apex_available: [
450 "//apex_available:platform",
451 "myapex",
452 ],
453 }
454
Paul Duffindddd5462020-04-07 15:25:44 +0100455 cc_prebuilt_library_shared {
456 name: "mylib2",
457 srcs: ["prebuilt.so"],
458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
463 }
464
Jiyong Park9918e1a2020-03-17 19:16:40 +0900465 cc_library_static {
466 name: "libstatic",
467 srcs: ["mylib.cpp"],
468 system_shared_libs: [],
469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900475 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476
477 java_library {
478 name: "myjar",
479 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900480 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900484 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000485 // TODO: remove //apex_available:platform
486 apex_available: [
487 "//apex_available:platform",
488 "myapex",
489 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 }
491
Jiyong Park77acec62020-06-01 21:39:15 +0900492 dex_import {
493 name: "myjar_dex",
494 jars: ["prebuilt.jar"],
495 apex_available: [
496 "//apex_available:platform",
497 "myapex",
498 ],
499 }
500
Jiyong Park7f7766d2019-07-25 22:02:35 +0900501 java_library {
502 name: "myotherjar",
503 srcs: ["foo/bar/MyClass.java"],
504 sdk_version: "none",
505 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900506 // TODO: remove //apex_available:platform
507 apex_available: [
508 "//apex_available:platform",
509 "myapex",
510 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900511 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900512
513 java_library {
514 name: "mysharedjar",
515 srcs: ["foo/bar/MyClass.java"],
516 sdk_version: "none",
517 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900518 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900519 `)
520
Jooyung Hana0503a52023-08-23 13:12:50 +0900521 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900523 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900524 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700525 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 var builder strings.Builder
527 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
528
529 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000530 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900531 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
532
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533 optFlags := apexRule.Args["opt_flags"]
534 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700535 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900536 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900537
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538 copyCmds := apexRule.Args["copy_commands"]
539
540 // Ensure that main rule creates an output
541 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
542
543 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900549
550 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557
558 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800559 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
565 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 // .. but not for java libs
568 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800570
Colin Cross7113d202019-11-20 16:39:12 -0800571 // Ensure that the platform variant ends with _shared or _common
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900574 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
575 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
577
578 // Ensure that dynamic dependency to java libs are not included
579 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800580
581 // Ensure that all symlinks are present.
582 found_foo_link_64 := false
583 found_foo := false
584 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900585 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800586 if strings.HasSuffix(cmd, "bin/foo") {
587 found_foo = true
588 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
589 found_foo_link_64 = true
590 }
591 }
592 }
593 good := found_foo && found_foo_link_64
594 if !good {
595 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
596 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900597
Jooyung Hana0503a52023-08-23 13:12:50 +0900598 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex").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
Jooyung Hana0503a52023-08-23 13:12:50 +0900604 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex").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 Hana0503a52023-08-23 13:12:50 +0900681 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []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
Jooyung Hana0503a52023-08-23 13:12:50 +0900708 module := ctx.ModuleForTests("myapex", "android_common_myapex")
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 {
Jooyung Hana0503a52023-08-23 13:12:50 +0900779 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400780 args := module.Rule("apexRule").Args
781 optFlags := args["opt_flags"]
782 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
783 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
784 }
785 }
786}
787
Jooyung Hanaf730952023-02-28 14:13:38 +0900788func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900789 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900790 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900791 if vendor {
792 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900793 }
794 ctx := testApex(t, `
795 apex {
796 name: "myapex",
797 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900798 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900799 `+prop+`
800 }
801
802 apex_key {
803 name: "myapex.key",
804 public_key: "testkey.avbpubkey",
805 private_key: "testkey.pem",
806 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900807 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900808
Jooyung Hana0503a52023-08-23 13:12:50 +0900809 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900810 if vendor {
811 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
812 rule.RuleParams.Command,
813 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900814 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900815 android.AssertStringDoesContain(t, "should force-label as system_file",
816 rule.RuleParams.Command,
817 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900818 }
819 }
820}
821
Jiyong Park25fc6a92018-11-18 18:02:45 +0900822func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800823 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900824 apex {
825 name: "myapex",
826 key: "myapex.key",
827 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900828 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000829 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900830 }
831
832 apex_key {
833 name: "myapex.key",
834 public_key: "testkey.avbpubkey",
835 private_key: "testkey.pem",
836 }
837
838 cc_library {
839 name: "mylib",
840 srcs: ["mylib.cpp"],
841 shared_libs: ["mylib2", "mylib3"],
842 system_shared_libs: [],
843 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000844 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900845 }
846
847 cc_library {
848 name: "mylib2",
849 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900850 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900851 system_shared_libs: [],
852 stl: "none",
853 stubs: {
854 versions: ["1", "2", "3"],
855 },
856 }
857
858 cc_library {
859 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900860 srcs: ["mylib.cpp"],
861 shared_libs: ["mylib4"],
862 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900863 stl: "none",
864 stubs: {
865 versions: ["10", "11", "12"],
866 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000867 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900868 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900869
870 cc_library {
871 name: "mylib4",
872 srcs: ["mylib.cpp"],
873 system_shared_libs: [],
874 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000875 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900876 }
Jiyong Park105dc322021-06-11 17:22:09 +0900877
878 rust_binary {
879 name: "foo.rust",
880 srcs: ["foo.rs"],
881 shared_libs: ["libfoo.shared_from_rust"],
882 prefer_rlib: true,
883 apex_available: ["myapex"],
884 }
885
886 cc_library_shared {
887 name: "libfoo.shared_from_rust",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
891 stubs: {
892 versions: ["10", "11", "12"],
893 },
894 }
895
Jiyong Park25fc6a92018-11-18 18:02:45 +0900896 `)
897
Jooyung Hana0503a52023-08-23 13:12:50 +0900898 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900899 copyCmds := apexRule.Args["copy_commands"]
900
901 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800902 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900903
904 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800905 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900906
907 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800908 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900909
Colin Crossaede88c2020-08-11 12:17:01 -0700910 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900911
912 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900913 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900915 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916
917 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700918 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700920 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900921
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700922 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
923 // is replaced by sharing of "cFlags" in cc/builder.go.
924 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
925 // module variable representing "cflags". So it was not detected by ensureNotContains.
926 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
927 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
928 // including the original cflags's "-include mylib.h".
929 //
Jiyong Park64379952018-12-13 18:37:29 +0900930 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700931 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
932 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900933
Jiyong Park85cc35a2022-07-17 11:30:47 +0900934 // Ensure that genstub for platform-provided lib is invoked with --systemapi
935 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
936 // Ensure that genstub for apex-provided lib is invoked with --apex
937 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900938
Jooyung Hana0503a52023-08-23 13:12:50 +0900939 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900940 "lib64/mylib.so",
941 "lib64/mylib3.so",
942 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900943 "bin/foo.rust",
944 "lib64/libc++.so", // by the implicit dependency from foo.rust
945 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900946 })
Jiyong Park105dc322021-06-11 17:22:09 +0900947
948 // Ensure that stub dependency from a rust module is not included
949 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
950 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -0700951 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +0900952 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
953 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900954
Jooyung Hana0503a52023-08-23 13:12:50 +0900955 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +0900956 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957}
958
Jiyong Park1bc84122021-06-22 20:23:05 +0900959func TestApexCanUsePrivateApis(t *testing.T) {
960 ctx := testApex(t, `
961 apex {
962 name: "myapex",
963 key: "myapex.key",
964 native_shared_libs: ["mylib"],
965 binaries: ["foo.rust"],
966 updatable: false,
967 platform_apis: true,
968 }
969
970 apex_key {
971 name: "myapex.key",
972 public_key: "testkey.avbpubkey",
973 private_key: "testkey.pem",
974 }
975
976 cc_library {
977 name: "mylib",
978 srcs: ["mylib.cpp"],
979 shared_libs: ["mylib2"],
980 system_shared_libs: [],
981 stl: "none",
982 apex_available: [ "myapex" ],
983 }
984
985 cc_library {
986 name: "mylib2",
987 srcs: ["mylib.cpp"],
988 cflags: ["-include mylib.h"],
989 system_shared_libs: [],
990 stl: "none",
991 stubs: {
992 versions: ["1", "2", "3"],
993 },
994 }
995
996 rust_binary {
997 name: "foo.rust",
998 srcs: ["foo.rs"],
999 shared_libs: ["libfoo.shared_from_rust"],
1000 prefer_rlib: true,
1001 apex_available: ["myapex"],
1002 }
1003
1004 cc_library_shared {
1005 name: "libfoo.shared_from_rust",
1006 srcs: ["mylib.cpp"],
1007 system_shared_libs: [],
1008 stl: "none",
1009 stubs: {
1010 versions: ["10", "11", "12"],
1011 },
1012 }
1013 `)
1014
Jooyung Hana0503a52023-08-23 13:12:50 +09001015 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001016 copyCmds := apexRule.Args["copy_commands"]
1017
1018 // Ensure that indirect stubs dep is not included
1019 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1020 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1021
1022 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1023 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001024 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001025 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1026 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001027 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001028 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1029 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1030}
1031
Colin Cross7812fd32020-09-25 12:35:10 -07001032func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1033 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001034 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001035 apex {
1036 name: "myapex",
1037 key: "myapex.key",
1038 native_shared_libs: ["mylib", "mylib3"],
1039 min_sdk_version: "29",
1040 }
1041
1042 apex_key {
1043 name: "myapex.key",
1044 public_key: "testkey.avbpubkey",
1045 private_key: "testkey.pem",
1046 }
1047
1048 cc_library {
1049 name: "mylib",
1050 srcs: ["mylib.cpp"],
1051 shared_libs: ["mylib2", "mylib3"],
1052 system_shared_libs: [],
1053 stl: "none",
1054 apex_available: [ "myapex" ],
1055 min_sdk_version: "28",
1056 }
1057
1058 cc_library {
1059 name: "mylib2",
1060 srcs: ["mylib.cpp"],
1061 cflags: ["-include mylib.h"],
1062 system_shared_libs: [],
1063 stl: "none",
1064 stubs: {
1065 versions: ["28", "29", "30", "current"],
1066 },
1067 min_sdk_version: "28",
1068 }
1069
1070 cc_library {
1071 name: "mylib3",
1072 srcs: ["mylib.cpp"],
1073 shared_libs: ["mylib4"],
1074 system_shared_libs: [],
1075 stl: "none",
1076 stubs: {
1077 versions: ["28", "29", "30", "current"],
1078 },
1079 apex_available: [ "myapex" ],
1080 min_sdk_version: "28",
1081 }
1082
1083 cc_library {
1084 name: "mylib4",
1085 srcs: ["mylib.cpp"],
1086 system_shared_libs: [],
1087 stl: "none",
1088 apex_available: [ "myapex" ],
1089 min_sdk_version: "28",
1090 }
1091 `)
1092
Jooyung Hana0503a52023-08-23 13:12:50 +09001093 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001094 copyCmds := apexRule.Args["copy_commands"]
1095
1096 // Ensure that direct non-stubs dep is always included
1097 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1098
1099 // Ensure that indirect stubs dep is not included
1100 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1101
1102 // Ensure that direct stubs dep is included
1103 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1104
1105 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1106
Jiyong Park55549df2021-02-26 23:57:23 +09001107 // Ensure that mylib is linking with the latest version of stub for mylib2
1108 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001109 // ... and not linking to the non-stub (impl) variant of mylib2
1110 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1111
1112 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1113 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1114 // .. and not linking to the stubs variant of mylib3
1115 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1116
1117 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001118 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001119 ensureNotContains(t, mylib2Cflags, "-include ")
1120
Jiyong Park85cc35a2022-07-17 11:30:47 +09001121 // Ensure that genstub is invoked with --systemapi
1122 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001123
Jooyung Hana0503a52023-08-23 13:12:50 +09001124 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001125 "lib64/mylib.so",
1126 "lib64/mylib3.so",
1127 "lib64/mylib4.so",
1128 })
1129}
1130
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001131func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1132 t.Parallel()
1133 // myapex (Z)
1134 // mylib -----------------.
1135 // |
1136 // otherapex (29) |
1137 // libstub's versions: 29 Z current
1138 // |
1139 // <platform> |
1140 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001141 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001142 apex {
1143 name: "myapex",
1144 key: "myapex.key",
1145 native_shared_libs: ["mylib"],
1146 min_sdk_version: "Z", // non-final
1147 }
1148
1149 cc_library {
1150 name: "mylib",
1151 srcs: ["mylib.cpp"],
1152 shared_libs: ["libstub"],
1153 apex_available: ["myapex"],
1154 min_sdk_version: "Z",
1155 }
1156
1157 apex_key {
1158 name: "myapex.key",
1159 public_key: "testkey.avbpubkey",
1160 private_key: "testkey.pem",
1161 }
1162
1163 apex {
1164 name: "otherapex",
1165 key: "myapex.key",
1166 native_shared_libs: ["libstub"],
1167 min_sdk_version: "29",
1168 }
1169
1170 cc_library {
1171 name: "libstub",
1172 srcs: ["mylib.cpp"],
1173 stubs: {
1174 versions: ["29", "Z", "current"],
1175 },
1176 apex_available: ["otherapex"],
1177 min_sdk_version: "29",
1178 }
1179
1180 // platform module depending on libstub from otherapex should use the latest stub("current")
1181 cc_library {
1182 name: "libplatform",
1183 srcs: ["mylib.cpp"],
1184 shared_libs: ["libstub"],
1185 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001186 `,
1187 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1188 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1189 variables.Platform_sdk_final = proptools.BoolPtr(false)
1190 variables.Platform_version_active_codenames = []string{"Z"}
1191 }),
1192 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001193
Jiyong Park55549df2021-02-26 23:57:23 +09001194 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001195 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001196 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001197 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001198 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001199
1200 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1201 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1202 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1203 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1204 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1205}
1206
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001207func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001208 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001209 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001210 name: "myapex2",
1211 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001212 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001213 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001214 }
1215
1216 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001217 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001218 public_key: "testkey.avbpubkey",
1219 private_key: "testkey.pem",
1220 }
1221
1222 cc_library {
1223 name: "mylib",
1224 srcs: ["mylib.cpp"],
1225 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001226 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001227 system_shared_libs: [],
1228 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001229 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 }
1231
1232 cc_library {
1233 name: "libfoo",
1234 srcs: ["mylib.cpp"],
1235 shared_libs: ["libbar"],
1236 system_shared_libs: [],
1237 stl: "none",
1238 stubs: {
1239 versions: ["10", "20", "30"],
1240 },
1241 }
1242
1243 cc_library {
1244 name: "libbar",
1245 srcs: ["mylib.cpp"],
1246 system_shared_libs: [],
1247 stl: "none",
1248 }
1249
Jiyong Park678c8812020-02-07 17:25:49 +09001250 cc_library_static {
1251 name: "libbaz",
1252 srcs: ["mylib.cpp"],
1253 system_shared_libs: [],
1254 stl: "none",
1255 apex_available: [ "myapex2" ],
1256 }
1257
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001258 `)
1259
Jooyung Hana0503a52023-08-23 13:12:50 +09001260 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001261 copyCmds := apexRule.Args["copy_commands"]
1262
1263 // Ensure that direct non-stubs dep is always included
1264 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1265
1266 // Ensure that indirect stubs dep is not included
1267 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1268
1269 // Ensure that dependency of stubs is not included
1270 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1271
Colin Crossaede88c2020-08-11 12:17:01 -07001272 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001273
1274 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001275 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001276 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001277 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278
Jiyong Park3ff16992019-12-27 14:11:47 +09001279 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001280
1281 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1282 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001283
Jooyung Hana0503a52023-08-23 13:12:50 +09001284 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001285 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001286
Jooyung Hana0503a52023-08-23 13:12:50 +09001287 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001288 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289}
1290
Jooyung Hand3639552019-08-09 12:57:43 +09001291func TestApexWithRuntimeLibsDependency(t *testing.T) {
1292 /*
1293 myapex
1294 |
1295 v (runtime_libs)
1296 mylib ------+------> libfoo [provides stub]
1297 |
1298 `------> libbar
1299 */
Colin Cross1c460562021-02-16 17:55:47 -08001300 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001301 apex {
1302 name: "myapex",
1303 key: "myapex.key",
1304 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001305 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001306 }
1307
1308 apex_key {
1309 name: "myapex.key",
1310 public_key: "testkey.avbpubkey",
1311 private_key: "testkey.pem",
1312 }
1313
1314 cc_library {
1315 name: "mylib",
1316 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001317 static_libs: ["libstatic"],
1318 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001319 runtime_libs: ["libfoo", "libbar"],
1320 system_shared_libs: [],
1321 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001322 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001323 }
1324
1325 cc_library {
1326 name: "libfoo",
1327 srcs: ["mylib.cpp"],
1328 system_shared_libs: [],
1329 stl: "none",
1330 stubs: {
1331 versions: ["10", "20", "30"],
1332 },
1333 }
1334
1335 cc_library {
1336 name: "libbar",
1337 srcs: ["mylib.cpp"],
1338 system_shared_libs: [],
1339 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001340 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001341 }
1342
Liz Kammer5f108fa2023-05-11 14:33:17 -04001343 cc_library {
1344 name: "libstatic",
1345 srcs: ["mylib.cpp"],
1346 system_shared_libs: [],
1347 stl: "none",
1348 apex_available: [ "myapex" ],
1349 runtime_libs: ["libstatic_to_runtime"],
1350 }
1351
1352 cc_library {
1353 name: "libshared",
1354 srcs: ["mylib.cpp"],
1355 system_shared_libs: [],
1356 stl: "none",
1357 apex_available: [ "myapex" ],
1358 runtime_libs: ["libshared_to_runtime"],
1359 }
1360
1361 cc_library {
1362 name: "libstatic_to_runtime",
1363 srcs: ["mylib.cpp"],
1364 system_shared_libs: [],
1365 stl: "none",
1366 apex_available: [ "myapex" ],
1367 }
1368
1369 cc_library {
1370 name: "libshared_to_runtime",
1371 srcs: ["mylib.cpp"],
1372 system_shared_libs: [],
1373 stl: "none",
1374 apex_available: [ "myapex" ],
1375 }
Jooyung Hand3639552019-08-09 12:57:43 +09001376 `)
1377
Jooyung Hana0503a52023-08-23 13:12:50 +09001378 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001379 copyCmds := apexRule.Args["copy_commands"]
1380
1381 // Ensure that direct non-stubs dep is always included
1382 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1383
1384 // Ensure that indirect stubs dep is not included
1385 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1386
1387 // Ensure that runtime_libs dep in included
1388 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001389 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1390 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1391
1392 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001393
Jooyung Hana0503a52023-08-23 13:12:50 +09001394 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001395 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1396 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001397}
1398
Paul Duffina02cae32021-03-09 01:44:06 +00001399var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1400 cc.PrepareForTestWithCcBuildComponents,
1401 PrepareForTestWithApexBuildComponents,
1402 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001403 apex {
1404 name: "com.android.runtime",
1405 key: "com.android.runtime.key",
1406 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001407 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001408 }
1409
1410 apex_key {
1411 name: "com.android.runtime.key",
1412 public_key: "testkey.avbpubkey",
1413 private_key: "testkey.pem",
1414 }
Paul Duffina02cae32021-03-09 01:44:06 +00001415 `),
1416 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1417)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001418
Paul Duffina02cae32021-03-09 01:44:06 +00001419func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001420 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001421 cc_library {
1422 name: "libc",
1423 no_libcrt: true,
1424 nocrt: true,
1425 stl: "none",
1426 system_shared_libs: [],
1427 stubs: { versions: ["1"] },
1428 apex_available: ["com.android.runtime"],
1429
1430 sanitize: {
1431 hwaddress: true,
1432 }
1433 }
1434
1435 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001436 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001437 no_libcrt: true,
1438 nocrt: true,
1439 stl: "none",
1440 system_shared_libs: [],
1441 srcs: [""],
1442 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001443 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001444
1445 sanitize: {
1446 never: true,
1447 },
Spandan Das4de7b492023-05-05 21:13:01 +00001448 apex_available: [
1449 "//apex_available:anyapex",
1450 "//apex_available:platform",
1451 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001452 } `)
1453 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001454
Jooyung Hana0503a52023-08-23 13:12:50 +09001455 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001456 "lib64/bionic/libc.so",
1457 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1458 })
1459
Colin Cross4c4c1be2022-02-10 11:41:18 -08001460 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001461
1462 installed := hwasan.Description("install libclang_rt.hwasan")
1463 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1464
1465 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1466 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1467 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1468}
1469
1470func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001471 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001472 prepareForTestOfRuntimeApexWithHwasan,
1473 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1474 variables.SanitizeDevice = []string{"hwaddress"}
1475 }),
1476 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477 cc_library {
1478 name: "libc",
1479 no_libcrt: true,
1480 nocrt: true,
1481 stl: "none",
1482 system_shared_libs: [],
1483 stubs: { versions: ["1"] },
1484 apex_available: ["com.android.runtime"],
1485 }
1486
1487 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001488 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001489 no_libcrt: true,
1490 nocrt: true,
1491 stl: "none",
1492 system_shared_libs: [],
1493 srcs: [""],
1494 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001495 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001496
1497 sanitize: {
1498 never: true,
1499 },
Spandan Das4de7b492023-05-05 21:13:01 +00001500 apex_available: [
1501 "//apex_available:anyapex",
1502 "//apex_available:platform",
1503 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001504 }
Paul Duffina02cae32021-03-09 01:44:06 +00001505 `)
1506 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001507
Jooyung Hana0503a52023-08-23 13:12:50 +09001508 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001509 "lib64/bionic/libc.so",
1510 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1511 })
1512
Colin Cross4c4c1be2022-02-10 11:41:18 -08001513 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001514
1515 installed := hwasan.Description("install libclang_rt.hwasan")
1516 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1517
1518 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1519 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1520 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1521}
1522
Jooyung Han61b66e92020-03-21 14:21:46 +00001523func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1524 testcases := []struct {
1525 name string
1526 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001527 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001528 shouldLink string
1529 shouldNotLink []string
1530 }{
1531 {
Jiyong Park55549df2021-02-26 23:57:23 +09001532 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001533 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001534 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001535 shouldLink: "current",
1536 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001537 },
1538 {
Jiyong Park55549df2021-02-26 23:57:23 +09001539 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001540 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001541 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001542 shouldLink: "current",
1543 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 },
1545 }
1546 for _, tc := range testcases {
1547 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001548 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001549 apex {
1550 name: "myapex",
1551 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001552 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001553 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001554 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001555 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001556
Jooyung Han61b66e92020-03-21 14:21:46 +00001557 apex_key {
1558 name: "myapex.key",
1559 public_key: "testkey.avbpubkey",
1560 private_key: "testkey.pem",
1561 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 cc_library {
1564 name: "mylib",
1565 srcs: ["mylib.cpp"],
1566 vendor_available: true,
1567 shared_libs: ["libbar"],
1568 system_shared_libs: [],
1569 stl: "none",
1570 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001571 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001573
Jooyung Han61b66e92020-03-21 14:21:46 +00001574 cc_library {
1575 name: "libbar",
1576 srcs: ["mylib.cpp"],
1577 system_shared_libs: [],
1578 stl: "none",
1579 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001580 llndk: {
1581 symbol_file: "libbar.map.txt",
1582 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001583 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001584 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001585 withUnbundledBuild,
1586 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001587
Jooyung Han61b66e92020-03-21 14:21:46 +00001588 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001589 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001590 "lib64/mylib.so",
1591 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001592
Jooyung Han61b66e92020-03-21 14:21:46 +00001593 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001594 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001595 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1596 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001597
Steven Moreland2c4000c2021-04-27 02:08:49 +00001598 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1599 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001600 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001601 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001602 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001603
Steven Moreland2c4000c2021-04-27 02:08:49 +00001604 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001605 ver := tc.shouldLink
1606 if tc.shouldLink == "current" {
1607 ver = strconv.Itoa(android.FutureApiLevelInt)
1608 }
1609 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001610 })
1611 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001612}
1613
Jiyong Park25fc6a92018-11-18 18:02:45 +09001614func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001615 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001616 apex {
1617 name: "myapex",
1618 key: "myapex.key",
1619 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001620 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001621 }
1622
1623 apex_key {
1624 name: "myapex.key",
1625 public_key: "testkey.avbpubkey",
1626 private_key: "testkey.pem",
1627 }
1628
1629 cc_library {
1630 name: "mylib",
1631 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001632 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001633 shared_libs: ["libdl#27"],
1634 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001635 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001636 }
1637
1638 cc_library_shared {
1639 name: "mylib_shared",
1640 srcs: ["mylib.cpp"],
1641 shared_libs: ["libdl#27"],
1642 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001643 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 }
1645
1646 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001647 name: "libBootstrap",
1648 srcs: ["mylib.cpp"],
1649 stl: "none",
1650 bootstrap: true,
1651 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001652 `)
1653
Jooyung Hana0503a52023-08-23 13:12:50 +09001654 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001655 copyCmds := apexRule.Args["copy_commands"]
1656
1657 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001658 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001659 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1660 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001661
1662 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001663 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001664
Colin Crossaede88c2020-08-11 12:17:01 -07001665 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1666 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1667 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001668
1669 // For dependency to libc
1670 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001671 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001672 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001673 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001675 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1676 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001677
1678 // For dependency to libm
1679 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001680 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001681 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001682 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001683 // ... and is not compiling with the stub
1684 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1685 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1686
1687 // For dependency to libdl
1688 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001689 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001690 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001691 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1692 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001693 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001694 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001695 // ... Cflags from stub is correctly exported to mylib
1696 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1697 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001698
1699 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001700 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1701 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1702 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1703 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001704}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001705
Jooyung Han749dc692020-04-15 11:03:39 +09001706func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001707 // there are three links between liba --> libz.
1708 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001709 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001710 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001711 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001712 apex {
1713 name: "myapex",
1714 key: "myapex.key",
1715 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001716 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001717 }
1718
1719 apex {
1720 name: "otherapex",
1721 key: "myapex.key",
1722 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001723 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001724 }
1725
1726 apex_key {
1727 name: "myapex.key",
1728 public_key: "testkey.avbpubkey",
1729 private_key: "testkey.pem",
1730 }
1731
1732 cc_library {
1733 name: "libx",
1734 shared_libs: ["liba"],
1735 system_shared_libs: [],
1736 stl: "none",
1737 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001738 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001739 }
1740
1741 cc_library {
1742 name: "liby",
1743 shared_libs: ["liba"],
1744 system_shared_libs: [],
1745 stl: "none",
1746 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001747 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001748 }
1749
1750 cc_library {
1751 name: "liba",
1752 shared_libs: ["libz"],
1753 system_shared_libs: [],
1754 stl: "none",
1755 apex_available: [
1756 "//apex_available:anyapex",
1757 "//apex_available:platform",
1758 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001759 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001760 }
1761
1762 cc_library {
1763 name: "libz",
1764 system_shared_libs: [],
1765 stl: "none",
1766 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001767 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001768 },
1769 }
Jooyung Han749dc692020-04-15 11:03:39 +09001770 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001771
1772 expectLink := func(from, from_variant, to, to_variant string) {
1773 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1774 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1775 }
1776 expectNoLink := func(from, from_variant, to, to_variant string) {
1777 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1778 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1779 }
1780 // platform liba is linked to non-stub version
1781 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001782 // liba in myapex is linked to current
1783 expectLink("liba", "shared_apex29", "libz", "shared_current")
1784 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001785 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001786 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001787 // liba in otherapex is linked to current
1788 expectLink("liba", "shared_apex30", "libz", "shared_current")
1789 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001790 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1791 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001792}
1793
Jooyung Hanaed150d2020-04-02 01:41:41 +09001794func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001795 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001796 apex {
1797 name: "myapex",
1798 key: "myapex.key",
1799 native_shared_libs: ["libx"],
1800 min_sdk_version: "R",
1801 }
1802
1803 apex_key {
1804 name: "myapex.key",
1805 public_key: "testkey.avbpubkey",
1806 private_key: "testkey.pem",
1807 }
1808
1809 cc_library {
1810 name: "libx",
1811 shared_libs: ["libz"],
1812 system_shared_libs: [],
1813 stl: "none",
1814 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001815 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001816 }
1817
1818 cc_library {
1819 name: "libz",
1820 system_shared_libs: [],
1821 stl: "none",
1822 stubs: {
1823 versions: ["29", "R"],
1824 },
1825 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001826 `,
1827 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1828 variables.Platform_version_active_codenames = []string{"R"}
1829 }),
1830 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001831
1832 expectLink := func(from, from_variant, to, to_variant string) {
1833 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1834 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1835 }
1836 expectNoLink := func(from, from_variant, to, to_variant string) {
1837 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1838 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1839 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001840 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1841 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001842 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1843 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001844}
1845
Jooyung Han4c4da062021-06-23 10:23:16 +09001846func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1847 testApex(t, `
1848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 java_libs: ["libx"],
1852 min_sdk_version: "S",
1853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 java_library {
1862 name: "libx",
1863 srcs: ["a.java"],
1864 apex_available: [ "myapex" ],
1865 sdk_version: "current",
1866 min_sdk_version: "S", // should be okay
1867 }
1868 `,
1869 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1870 variables.Platform_version_active_codenames = []string{"S"}
1871 variables.Platform_sdk_codename = proptools.StringPtr("S")
1872 }),
1873 )
1874}
1875
Jooyung Han749dc692020-04-15 11:03:39 +09001876func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001877 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001878 apex {
1879 name: "myapex",
1880 key: "myapex.key",
1881 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001882 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001883 }
1884
1885 apex_key {
1886 name: "myapex.key",
1887 public_key: "testkey.avbpubkey",
1888 private_key: "testkey.pem",
1889 }
1890
1891 cc_library {
1892 name: "libx",
1893 shared_libs: ["libz"],
1894 system_shared_libs: [],
1895 stl: "none",
1896 apex_available: [ "myapex" ],
1897 }
1898
1899 cc_library {
1900 name: "libz",
1901 system_shared_libs: [],
1902 stl: "none",
1903 stubs: {
1904 versions: ["1", "2"],
1905 },
1906 }
1907 `)
1908
1909 expectLink := func(from, from_variant, to, to_variant string) {
1910 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1911 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1912 }
1913 expectNoLink := func(from, from_variant, to, to_variant string) {
1914 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1915 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1916 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001917 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001918 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001919 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001920 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001921}
1922
Jooyung Handfc864c2023-03-20 18:19:07 +09001923func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001924 ctx := testApex(t, `
1925 apex {
1926 name: "myapex",
1927 key: "myapex.key",
1928 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001929 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001930 vendor: true,
1931 min_sdk_version: "29",
1932 }
1933
1934 apex_key {
1935 name: "myapex.key",
1936 public_key: "testkey.avbpubkey",
1937 private_key: "testkey.pem",
1938 }
1939
1940 cc_library {
1941 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001942 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001943 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001944 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001945 shared_libs: ["libbar"],
1946 }
1947
1948 cc_library {
1949 name: "libbar",
1950 stubs: { versions: ["29", "30"] },
1951 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001952 }
1953 `)
1954
1955 vendorVariant := "android_vendor.29_arm64_armv8-a"
1956
Jooyung Handfc864c2023-03-20 18:19:07 +09001957 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1958
1959 // Ensure that mylib links with "current" LLNDK
1960 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1961 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1962
1963 // Ensure that mylib is targeting 29
1964 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1965 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1966
1967 // Ensure that the correct variant of crtbegin_so is used.
1968 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1969 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001970
1971 // Ensure that the crtbegin_so used by the APEX is targeting 29
1972 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1973 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1974}
1975
Jooyung Han4495f842023-04-25 16:39:59 +09001976func TestTrackAllowedDeps(t *testing.T) {
1977 ctx := testApex(t, `
1978 apex {
1979 name: "myapex",
1980 key: "myapex.key",
1981 updatable: true,
1982 native_shared_libs: [
1983 "mylib",
1984 "yourlib",
1985 ],
1986 min_sdk_version: "29",
1987 }
1988
1989 apex {
1990 name: "myapex2",
1991 key: "myapex.key",
1992 updatable: false,
1993 native_shared_libs: ["yourlib"],
1994 }
1995
1996 apex_key {
1997 name: "myapex.key",
1998 public_key: "testkey.avbpubkey",
1999 private_key: "testkey.pem",
2000 }
2001
2002 cc_library {
2003 name: "mylib",
2004 srcs: ["mylib.cpp"],
2005 shared_libs: ["libbar"],
2006 min_sdk_version: "29",
2007 apex_available: ["myapex"],
2008 }
2009
2010 cc_library {
2011 name: "libbar",
2012 stubs: { versions: ["29", "30"] },
2013 }
2014
2015 cc_library {
2016 name: "yourlib",
2017 srcs: ["mylib.cpp"],
2018 min_sdk_version: "29",
2019 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2020 }
2021 `, withFiles(android.MockFS{
2022 "packages/modules/common/build/allowed_deps.txt": nil,
2023 }))
2024
2025 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2026 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2027 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002028 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002029 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002030 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002031
Jooyung Hana0503a52023-08-23 13:12:50 +09002032 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han4495f842023-04-25 16:39:59 +09002033 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2034 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2035 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2036 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2037 flatlist, "mylib:(minSdkVersion:29)")
2038 android.AssertStringListContains(t, "track platform-available lib",
2039 flatlist, "yourlib(minSdkVersion:29)")
2040}
2041
2042func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2043 ctx := testApex(t, `
2044 apex {
2045 name: "myapex",
2046 key: "myapex.key",
2047 updatable: true,
2048 min_sdk_version: "29",
2049 }
2050
2051 apex_key {
2052 name: "myapex.key",
2053 public_key: "testkey.avbpubkey",
2054 private_key: "testkey.pem",
2055 }
2056 `)
2057 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2058 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2059 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2060 }
2061}
2062
Jooyung Han03b51852020-02-26 22:45:42 +09002063func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002064 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002065 apex {
2066 name: "myapex",
2067 key: "myapex.key",
2068 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002069 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002070 }
2071
2072 apex_key {
2073 name: "myapex.key",
2074 public_key: "testkey.avbpubkey",
2075 private_key: "testkey.pem",
2076 }
2077
2078 cc_library {
2079 name: "libx",
2080 system_shared_libs: [],
2081 stl: "none",
2082 apex_available: [ "myapex" ],
2083 stubs: {
2084 versions: ["1", "2"],
2085 },
2086 }
2087
2088 cc_library {
2089 name: "libz",
2090 shared_libs: ["libx"],
2091 system_shared_libs: [],
2092 stl: "none",
2093 }
2094 `)
2095
2096 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002097 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002098 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2099 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2100 }
2101 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002102 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002103 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2104 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2105 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002106 expectLink("libz", "shared", "libx", "shared_current")
2107 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002108 expectNoLink("libz", "shared", "libz", "shared_1")
2109 expectNoLink("libz", "shared", "libz", "shared")
2110}
2111
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002112var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2113 func(variables android.FixtureProductVariables) {
2114 variables.SanitizeDevice = []string{"hwaddress"}
2115 },
2116)
2117
Jooyung Han75568392020-03-20 04:29:24 +09002118func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002119 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002120 apex {
2121 name: "myapex",
2122 key: "myapex.key",
2123 native_shared_libs: ["libx"],
2124 min_sdk_version: "29",
2125 }
2126
2127 apex_key {
2128 name: "myapex.key",
2129 public_key: "testkey.avbpubkey",
2130 private_key: "testkey.pem",
2131 }
2132
2133 cc_library {
2134 name: "libx",
2135 shared_libs: ["libbar"],
2136 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002137 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002138 }
2139
2140 cc_library {
2141 name: "libbar",
2142 stubs: {
2143 versions: ["29", "30"],
2144 },
2145 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002146 `,
2147 prepareForTestWithSantitizeHwaddress,
2148 )
Jooyung Han03b51852020-02-26 22:45:42 +09002149 expectLink := func(from, from_variant, to, to_variant string) {
2150 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2151 libFlags := ld.Args["libFlags"]
2152 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2153 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002154 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002155}
2156
Jooyung Han75568392020-03-20 04:29:24 +09002157func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002158 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002159 apex {
2160 name: "myapex",
2161 key: "myapex.key",
2162 native_shared_libs: ["libx"],
2163 min_sdk_version: "29",
2164 }
2165
2166 apex_key {
2167 name: "myapex.key",
2168 public_key: "testkey.avbpubkey",
2169 private_key: "testkey.pem",
2170 }
2171
2172 cc_library {
2173 name: "libx",
2174 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002175 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002176 }
Jooyung Han75568392020-03-20 04:29:24 +09002177 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002178
2179 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002180 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002181 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002182 // note that platform variant is not.
2183 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002184 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002185}
2186
Jooyung Han749dc692020-04-15 11:03:39 +09002187func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2188 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002189 apex {
2190 name: "myapex",
2191 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002192 native_shared_libs: ["mylib"],
2193 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002194 }
2195
2196 apex_key {
2197 name: "myapex.key",
2198 public_key: "testkey.avbpubkey",
2199 private_key: "testkey.pem",
2200 }
Jooyung Han749dc692020-04-15 11:03:39 +09002201
2202 cc_library {
2203 name: "mylib",
2204 srcs: ["mylib.cpp"],
2205 system_shared_libs: [],
2206 stl: "none",
2207 apex_available: [
2208 "myapex",
2209 ],
2210 min_sdk_version: "30",
2211 }
2212 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002213
2214 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2215 apex {
2216 name: "myapex",
2217 key: "myapex.key",
2218 native_shared_libs: ["libfoo.ffi"],
2219 min_sdk_version: "29",
2220 }
2221
2222 apex_key {
2223 name: "myapex.key",
2224 public_key: "testkey.avbpubkey",
2225 private_key: "testkey.pem",
2226 }
2227
2228 rust_ffi_shared {
2229 name: "libfoo.ffi",
2230 srcs: ["foo.rs"],
2231 crate_name: "foo",
2232 apex_available: [
2233 "myapex",
2234 ],
2235 min_sdk_version: "30",
2236 }
2237 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002238
2239 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2240 apex {
2241 name: "myapex",
2242 key: "myapex.key",
2243 java_libs: ["libfoo"],
2244 min_sdk_version: "29",
2245 }
2246
2247 apex_key {
2248 name: "myapex.key",
2249 public_key: "testkey.avbpubkey",
2250 private_key: "testkey.pem",
2251 }
2252
2253 java_import {
2254 name: "libfoo",
2255 jars: ["libfoo.jar"],
2256 apex_available: [
2257 "myapex",
2258 ],
2259 min_sdk_version: "30",
2260 }
2261 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002262
2263 // Skip check for modules compiling against core API surface
2264 testApex(t, `
2265 apex {
2266 name: "myapex",
2267 key: "myapex.key",
2268 java_libs: ["libfoo"],
2269 min_sdk_version: "29",
2270 }
2271
2272 apex_key {
2273 name: "myapex.key",
2274 public_key: "testkey.avbpubkey",
2275 private_key: "testkey.pem",
2276 }
2277
2278 java_library {
2279 name: "libfoo",
2280 srcs: ["Foo.java"],
2281 apex_available: [
2282 "myapex",
2283 ],
2284 // Compile against core API surface
2285 sdk_version: "core_current",
2286 min_sdk_version: "30",
2287 }
2288 `)
2289
Jooyung Han749dc692020-04-15 11:03:39 +09002290}
2291
2292func TestApexMinSdkVersion_Okay(t *testing.T) {
2293 testApex(t, `
2294 apex {
2295 name: "myapex",
2296 key: "myapex.key",
2297 native_shared_libs: ["libfoo"],
2298 java_libs: ["libbar"],
2299 min_sdk_version: "29",
2300 }
2301
2302 apex_key {
2303 name: "myapex.key",
2304 public_key: "testkey.avbpubkey",
2305 private_key: "testkey.pem",
2306 }
2307
2308 cc_library {
2309 name: "libfoo",
2310 srcs: ["mylib.cpp"],
2311 shared_libs: ["libfoo_dep"],
2312 apex_available: ["myapex"],
2313 min_sdk_version: "29",
2314 }
2315
2316 cc_library {
2317 name: "libfoo_dep",
2318 srcs: ["mylib.cpp"],
2319 apex_available: ["myapex"],
2320 min_sdk_version: "29",
2321 }
2322
2323 java_library {
2324 name: "libbar",
2325 sdk_version: "current",
2326 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002327 static_libs: [
2328 "libbar_dep",
2329 "libbar_import_dep",
2330 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002331 apex_available: ["myapex"],
2332 min_sdk_version: "29",
2333 }
2334
2335 java_library {
2336 name: "libbar_dep",
2337 sdk_version: "current",
2338 srcs: ["a.java"],
2339 apex_available: ["myapex"],
2340 min_sdk_version: "29",
2341 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002342
2343 java_import {
2344 name: "libbar_import_dep",
2345 jars: ["libbar.jar"],
2346 apex_available: ["myapex"],
2347 min_sdk_version: "29",
2348 }
Jooyung Han03b51852020-02-26 22:45:42 +09002349 `)
2350}
2351
Colin Cross8ca61c12022-10-06 21:00:14 -07002352func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2353 // Tests that an apex dependency with min_sdk_version higher than the
2354 // min_sdk_version of the apex is allowed as long as the dependency's
2355 // min_sdk_version is less than or equal to the api level that the
2356 // architecture was introduced in. In this case, arm64 didn't exist
2357 // until api level 21, so the arm64 code will never need to run on
2358 // an api level 20 device, even if other architectures of the apex
2359 // will.
2360 testApex(t, `
2361 apex {
2362 name: "myapex",
2363 key: "myapex.key",
2364 native_shared_libs: ["libfoo"],
2365 min_sdk_version: "20",
2366 }
2367
2368 apex_key {
2369 name: "myapex.key",
2370 public_key: "testkey.avbpubkey",
2371 private_key: "testkey.pem",
2372 }
2373
2374 cc_library {
2375 name: "libfoo",
2376 srcs: ["mylib.cpp"],
2377 apex_available: ["myapex"],
2378 min_sdk_version: "21",
2379 stl: "none",
2380 }
2381 `)
2382}
2383
Artur Satayev8cf899a2020-04-15 17:29:42 +01002384func TestJavaStableSdkVersion(t *testing.T) {
2385 testCases := []struct {
2386 name string
2387 expectedError string
2388 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002389 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002390 }{
2391 {
2392 name: "Non-updatable apex with non-stable dep",
2393 bp: `
2394 apex {
2395 name: "myapex",
2396 java_libs: ["myjar"],
2397 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002398 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002399 }
2400 apex_key {
2401 name: "myapex.key",
2402 public_key: "testkey.avbpubkey",
2403 private_key: "testkey.pem",
2404 }
2405 java_library {
2406 name: "myjar",
2407 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002408 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002409 apex_available: ["myapex"],
2410 }
2411 `,
2412 },
2413 {
2414 name: "Updatable apex with stable dep",
2415 bp: `
2416 apex {
2417 name: "myapex",
2418 java_libs: ["myjar"],
2419 key: "myapex.key",
2420 updatable: true,
2421 min_sdk_version: "29",
2422 }
2423 apex_key {
2424 name: "myapex.key",
2425 public_key: "testkey.avbpubkey",
2426 private_key: "testkey.pem",
2427 }
2428 java_library {
2429 name: "myjar",
2430 srcs: ["foo/bar/MyClass.java"],
2431 sdk_version: "current",
2432 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002433 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002434 }
2435 `,
2436 },
2437 {
2438 name: "Updatable apex with non-stable dep",
2439 expectedError: "cannot depend on \"myjar\"",
2440 bp: `
2441 apex {
2442 name: "myapex",
2443 java_libs: ["myjar"],
2444 key: "myapex.key",
2445 updatable: true,
2446 }
2447 apex_key {
2448 name: "myapex.key",
2449 public_key: "testkey.avbpubkey",
2450 private_key: "testkey.pem",
2451 }
2452 java_library {
2453 name: "myjar",
2454 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002455 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002456 apex_available: ["myapex"],
2457 }
2458 `,
2459 },
2460 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002461 name: "Updatable apex with non-stable legacy core platform dep",
2462 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2463 bp: `
2464 apex {
2465 name: "myapex",
2466 java_libs: ["myjar-uses-legacy"],
2467 key: "myapex.key",
2468 updatable: true,
2469 }
2470 apex_key {
2471 name: "myapex.key",
2472 public_key: "testkey.avbpubkey",
2473 private_key: "testkey.pem",
2474 }
2475 java_library {
2476 name: "myjar-uses-legacy",
2477 srcs: ["foo/bar/MyClass.java"],
2478 sdk_version: "core_platform",
2479 apex_available: ["myapex"],
2480 }
2481 `,
2482 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2483 },
2484 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002485 name: "Updatable apex with non-stable transitive dep",
2486 // This is not actually detecting that the transitive dependency is unstable, rather it is
2487 // detecting that the transitive dependency is building against a wider API surface than the
2488 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002489 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002490 bp: `
2491 apex {
2492 name: "myapex",
2493 java_libs: ["myjar"],
2494 key: "myapex.key",
2495 updatable: true,
2496 }
2497 apex_key {
2498 name: "myapex.key",
2499 public_key: "testkey.avbpubkey",
2500 private_key: "testkey.pem",
2501 }
2502 java_library {
2503 name: "myjar",
2504 srcs: ["foo/bar/MyClass.java"],
2505 sdk_version: "current",
2506 apex_available: ["myapex"],
2507 static_libs: ["transitive-jar"],
2508 }
2509 java_library {
2510 name: "transitive-jar",
2511 srcs: ["foo/bar/MyClass.java"],
2512 sdk_version: "core_platform",
2513 apex_available: ["myapex"],
2514 }
2515 `,
2516 },
2517 }
2518
2519 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002520 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2521 continue
2522 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002523 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002524 errorHandler := android.FixtureExpectsNoErrors
2525 if test.expectedError != "" {
2526 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002527 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002528 android.GroupFixturePreparers(
2529 java.PrepareForTestWithJavaDefaultModules,
2530 PrepareForTestWithApexBuildComponents,
2531 prepareForTestWithMyapex,
2532 android.OptionalFixturePreparer(test.preparer),
2533 ).
2534 ExtendWithErrorHandler(errorHandler).
2535 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002536 })
2537 }
2538}
2539
Jooyung Han749dc692020-04-15 11:03:39 +09002540func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2541 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2542 apex {
2543 name: "myapex",
2544 key: "myapex.key",
2545 native_shared_libs: ["mylib"],
2546 min_sdk_version: "29",
2547 }
2548
2549 apex_key {
2550 name: "myapex.key",
2551 public_key: "testkey.avbpubkey",
2552 private_key: "testkey.pem",
2553 }
2554
2555 cc_library {
2556 name: "mylib",
2557 srcs: ["mylib.cpp"],
2558 shared_libs: ["mylib2"],
2559 system_shared_libs: [],
2560 stl: "none",
2561 apex_available: [
2562 "myapex",
2563 ],
2564 min_sdk_version: "29",
2565 }
2566
2567 // indirect part of the apex
2568 cc_library {
2569 name: "mylib2",
2570 srcs: ["mylib.cpp"],
2571 system_shared_libs: [],
2572 stl: "none",
2573 apex_available: [
2574 "myapex",
2575 ],
2576 min_sdk_version: "30",
2577 }
2578 `)
2579}
2580
2581func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2582 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2583 apex {
2584 name: "myapex",
2585 key: "myapex.key",
2586 apps: ["AppFoo"],
2587 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002588 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002589 }
2590
2591 apex_key {
2592 name: "myapex.key",
2593 public_key: "testkey.avbpubkey",
2594 private_key: "testkey.pem",
2595 }
2596
2597 android_app {
2598 name: "AppFoo",
2599 srcs: ["foo/bar/MyClass.java"],
2600 sdk_version: "current",
2601 min_sdk_version: "29",
2602 system_modules: "none",
2603 stl: "none",
2604 static_libs: ["bar"],
2605 apex_available: [ "myapex" ],
2606 }
2607
2608 java_library {
2609 name: "bar",
2610 sdk_version: "current",
2611 srcs: ["a.java"],
2612 apex_available: [ "myapex" ],
2613 }
2614 `)
2615}
2616
2617func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002618 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002619 apex {
2620 name: "myapex",
2621 key: "myapex.key",
2622 native_shared_libs: ["mylib"],
2623 min_sdk_version: "29",
2624 }
2625
2626 apex_key {
2627 name: "myapex.key",
2628 public_key: "testkey.avbpubkey",
2629 private_key: "testkey.pem",
2630 }
2631
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002632 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002633 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2634 cc_library {
2635 name: "mylib",
2636 srcs: ["mylib.cpp"],
2637 shared_libs: ["mylib2"],
2638 system_shared_libs: [],
2639 stl: "none",
2640 apex_available: ["myapex", "otherapex"],
2641 min_sdk_version: "29",
2642 }
2643
2644 cc_library {
2645 name: "mylib2",
2646 srcs: ["mylib.cpp"],
2647 system_shared_libs: [],
2648 stl: "none",
2649 apex_available: ["otherapex"],
2650 stubs: { versions: ["29", "30"] },
2651 min_sdk_version: "30",
2652 }
2653
2654 apex {
2655 name: "otherapex",
2656 key: "myapex.key",
2657 native_shared_libs: ["mylib", "mylib2"],
2658 min_sdk_version: "30",
2659 }
2660 `)
2661 expectLink := func(from, from_variant, to, to_variant string) {
2662 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2663 libFlags := ld.Args["libFlags"]
2664 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2665 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002666 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002667 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002668}
2669
Jooyung Haned124c32021-01-26 11:43:46 +09002670func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002671 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2672 func(variables android.FixtureProductVariables) {
2673 variables.Platform_sdk_codename = proptools.StringPtr("S")
2674 variables.Platform_version_active_codenames = []string{"S"}
2675 },
2676 )
Jooyung Haned124c32021-01-26 11:43:46 +09002677 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2678 apex {
2679 name: "myapex",
2680 key: "myapex.key",
2681 native_shared_libs: ["libfoo"],
2682 min_sdk_version: "S",
2683 }
2684 apex_key {
2685 name: "myapex.key",
2686 public_key: "testkey.avbpubkey",
2687 private_key: "testkey.pem",
2688 }
2689 cc_library {
2690 name: "libfoo",
2691 shared_libs: ["libbar"],
2692 apex_available: ["myapex"],
2693 min_sdk_version: "29",
2694 }
2695 cc_library {
2696 name: "libbar",
2697 apex_available: ["myapex"],
2698 }
2699 `, withSAsActiveCodeNames)
2700}
2701
2702func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002703 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2704 variables.Platform_sdk_codename = proptools.StringPtr("S")
2705 variables.Platform_version_active_codenames = []string{"S", "T"}
2706 })
Colin Cross1c460562021-02-16 17:55:47 -08002707 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002708 apex {
2709 name: "myapex",
2710 key: "myapex.key",
2711 native_shared_libs: ["libfoo"],
2712 min_sdk_version: "S",
2713 }
2714 apex_key {
2715 name: "myapex.key",
2716 public_key: "testkey.avbpubkey",
2717 private_key: "testkey.pem",
2718 }
2719 cc_library {
2720 name: "libfoo",
2721 shared_libs: ["libbar"],
2722 apex_available: ["myapex"],
2723 min_sdk_version: "S",
2724 }
2725 cc_library {
2726 name: "libbar",
2727 stubs: {
2728 symbol_file: "libbar.map.txt",
2729 versions: ["30", "S", "T"],
2730 },
2731 }
2732 `, withSAsActiveCodeNames)
2733
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002734 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002735 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2736 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002737 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002738}
2739
Jiyong Park7c2ee712018-12-07 00:42:25 +09002740func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002741 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002742 apex {
2743 name: "myapex",
2744 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002745 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002746 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002747 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002748 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002749 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002750 }
2751
2752 apex_key {
2753 name: "myapex.key",
2754 public_key: "testkey.avbpubkey",
2755 private_key: "testkey.pem",
2756 }
2757
2758 prebuilt_etc {
2759 name: "myetc",
2760 src: "myprebuilt",
2761 sub_dir: "foo/bar",
2762 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002763
2764 cc_library {
2765 name: "mylib",
2766 srcs: ["mylib.cpp"],
2767 relative_install_path: "foo/bar",
2768 system_shared_libs: [],
2769 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002770 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002771 }
2772
2773 cc_binary {
2774 name: "mybin",
2775 srcs: ["mylib.cpp"],
2776 relative_install_path: "foo/bar",
2777 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002778 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002779 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002780 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002781
2782 rust_binary {
2783 name: "mybin.rust",
2784 srcs: ["foo.rs"],
2785 relative_install_path: "rust_subdir",
2786 apex_available: [ "myapex" ],
2787 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002788 `)
2789
Jooyung Hana0503a52023-08-23 13:12:50 +09002790 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002791 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002792
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002793 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002794 ensureContains(t, cmd, "/etc ")
2795 ensureContains(t, cmd, "/etc/foo ")
2796 ensureContains(t, cmd, "/etc/foo/bar ")
2797 ensureContains(t, cmd, "/lib64 ")
2798 ensureContains(t, cmd, "/lib64/foo ")
2799 ensureContains(t, cmd, "/lib64/foo/bar ")
2800 ensureContains(t, cmd, "/lib ")
2801 ensureContains(t, cmd, "/lib/foo ")
2802 ensureContains(t, cmd, "/lib/foo/bar ")
2803 ensureContains(t, cmd, "/bin ")
2804 ensureContains(t, cmd, "/bin/foo ")
2805 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002806 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002807}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002808
Jooyung Han35155c42020-02-06 17:33:20 +09002809func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002810 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002811 apex {
2812 name: "myapex",
2813 key: "myapex.key",
2814 multilib: {
2815 both: {
2816 native_shared_libs: ["mylib"],
2817 binaries: ["mybin"],
2818 },
2819 },
2820 compile_multilib: "both",
2821 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002822 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002823 }
2824
2825 apex_key {
2826 name: "myapex.key",
2827 public_key: "testkey.avbpubkey",
2828 private_key: "testkey.pem",
2829 }
2830
2831 cc_library {
2832 name: "mylib",
2833 relative_install_path: "foo/bar",
2834 system_shared_libs: [],
2835 stl: "none",
2836 apex_available: [ "myapex" ],
2837 native_bridge_supported: true,
2838 }
2839
2840 cc_binary {
2841 name: "mybin",
2842 relative_install_path: "foo/bar",
2843 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002844 stl: "none",
2845 apex_available: [ "myapex" ],
2846 native_bridge_supported: true,
2847 compile_multilib: "both", // default is "first" for binary
2848 multilib: {
2849 lib64: {
2850 suffix: "64",
2851 },
2852 },
2853 }
2854 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002855 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002856 "bin/foo/bar/mybin",
2857 "bin/foo/bar/mybin64",
2858 "bin/arm/foo/bar/mybin",
2859 "bin/arm64/foo/bar/mybin64",
2860 "lib/foo/bar/mylib.so",
2861 "lib/arm/foo/bar/mylib.so",
2862 "lib64/foo/bar/mylib.so",
2863 "lib64/arm64/foo/bar/mylib.so",
2864 })
2865}
2866
Jooyung Han85d61762020-06-24 23:50:26 +09002867func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002868 result := android.GroupFixturePreparers(
2869 prepareForApexTest,
2870 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2871 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002872 apex {
2873 name: "myapex",
2874 key: "myapex.key",
2875 binaries: ["mybin"],
2876 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002877 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002878 }
2879 apex_key {
2880 name: "myapex.key",
2881 public_key: "testkey.avbpubkey",
2882 private_key: "testkey.pem",
2883 }
2884 cc_binary {
2885 name: "mybin",
2886 vendor: true,
2887 shared_libs: ["libfoo"],
2888 }
2889 cc_library {
2890 name: "libfoo",
2891 proprietary: true,
2892 }
2893 `)
2894
Jooyung Hana0503a52023-08-23 13:12:50 +09002895 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002896 "bin/mybin",
2897 "lib64/libfoo.so",
2898 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2899 "lib64/libc++.so",
2900 })
2901
Jooyung Hana0503a52023-08-23 13:12:50 +09002902 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08002903 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002904 name := apexBundle.BaseModuleName()
2905 prefix := "TARGET_"
2906 var builder strings.Builder
2907 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002908 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002909 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002910 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002911
Jooyung Hana0503a52023-08-23 13:12:50 +09002912 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002913 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2914 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002915}
2916
Jooyung Hanc5a96762022-02-04 11:54:50 +09002917func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2918 testApexError(t, `Trying to include a VNDK library`, `
2919 apex {
2920 name: "myapex",
2921 key: "myapex.key",
2922 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2923 vendor: true,
2924 use_vndk_as_stable: true,
2925 updatable: false,
2926 }
2927 apex_key {
2928 name: "myapex.key",
2929 public_key: "testkey.avbpubkey",
2930 private_key: "testkey.pem",
2931 }`)
2932}
2933
Jooyung Handf78e212020-07-22 15:54:47 +09002934func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002935 // myapex myapex2
2936 // | |
2937 // mybin ------. mybin2
2938 // \ \ / |
2939 // (stable) .---\--------` |
2940 // \ / \ |
2941 // \ / \ /
2942 // libvndk libvendor
2943 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002944 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002945 apex {
2946 name: "myapex",
2947 key: "myapex.key",
2948 binaries: ["mybin"],
2949 vendor: true,
2950 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002951 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002952 }
2953 apex_key {
2954 name: "myapex.key",
2955 public_key: "testkey.avbpubkey",
2956 private_key: "testkey.pem",
2957 }
2958 cc_binary {
2959 name: "mybin",
2960 vendor: true,
2961 shared_libs: ["libvndk", "libvendor"],
2962 }
2963 cc_library {
2964 name: "libvndk",
2965 vndk: {
2966 enabled: true,
2967 },
2968 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002969 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002970 }
2971 cc_library {
2972 name: "libvendor",
2973 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002974 stl: "none",
2975 }
2976 apex {
2977 name: "myapex2",
2978 key: "myapex.key",
2979 binaries: ["mybin2"],
2980 vendor: true,
2981 use_vndk_as_stable: false,
2982 updatable: false,
2983 }
2984 cc_binary {
2985 name: "mybin2",
2986 vendor: true,
2987 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002988 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09002989 `,
2990 android.FixtureModifyConfig(func(config android.Config) {
2991 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
2992 }),
2993 )
Jooyung Handf78e212020-07-22 15:54:47 +09002994
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002995 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002996
Jooyung Han91f92032022-02-04 12:36:33 +09002997 for _, tc := range []struct {
2998 name string
2999 apexName string
3000 moduleName string
3001 moduleVariant string
3002 libs []string
3003 contents []string
3004 requireVndkNamespace bool
3005 }{
3006 {
3007 name: "use_vndk_as_stable",
3008 apexName: "myapex",
3009 moduleName: "mybin",
3010 moduleVariant: vendorVariant + "_apex10000",
3011 libs: []string{
3012 // should link with vendor variants of VNDK libs(libvndk/libc++)
3013 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3014 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3015 // unstable Vendor libs as APEX variant
3016 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3017 },
3018 contents: []string{
3019 "bin/mybin",
3020 "lib64/libvendor.so",
3021 // VNDK libs (libvndk/libc++) are not included
3022 },
3023 requireVndkNamespace: true,
3024 },
3025 {
3026 name: "!use_vndk_as_stable",
3027 apexName: "myapex2",
3028 moduleName: "mybin2",
3029 moduleVariant: vendorVariant + "_myapex2",
3030 libs: []string{
3031 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3032 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3033 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3034 // unstable vendor libs have "merged" APEX variants
3035 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3036 },
3037 contents: []string{
3038 "bin/mybin2",
3039 "lib64/libvendor.so",
3040 // VNDK libs are included as well
3041 "lib64/libvndk.so",
3042 "lib64/libc++.so",
3043 },
3044 requireVndkNamespace: false,
3045 },
3046 } {
3047 t.Run(tc.name, func(t *testing.T) {
3048 // Check linked libs
3049 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3050 libs := names(ldRule.Args["libFlags"])
3051 for _, lib := range tc.libs {
3052 ensureListContains(t, libs, lib)
3053 }
3054 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003055 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003056
Jooyung Han91f92032022-02-04 12:36:33 +09003057 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003058 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003059 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3060 if tc.requireVndkNamespace {
3061 ensureListContains(t, requireNativeLibs, ":vndk")
3062 } else {
3063 ensureListNotContains(t, requireNativeLibs, ":vndk")
3064 }
3065 })
3066 }
Jooyung Handf78e212020-07-22 15:54:47 +09003067}
3068
Justin Yun13decfb2021-03-08 19:25:55 +09003069func TestProductVariant(t *testing.T) {
3070 ctx := testApex(t, `
3071 apex {
3072 name: "myapex",
3073 key: "myapex.key",
3074 updatable: false,
3075 product_specific: true,
3076 binaries: ["foo"],
3077 }
3078
3079 apex_key {
3080 name: "myapex.key",
3081 public_key: "testkey.avbpubkey",
3082 private_key: "testkey.pem",
3083 }
3084
3085 cc_binary {
3086 name: "foo",
3087 product_available: true,
3088 apex_available: ["myapex"],
3089 srcs: ["foo.cpp"],
3090 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003091 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3092 variables.ProductVndkVersion = proptools.StringPtr("current")
3093 }),
3094 )
Justin Yun13decfb2021-03-08 19:25:55 +09003095
3096 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003097 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003098 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3099 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3100 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3101 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3102}
3103
Jooyung Han8e5685d2020-09-21 11:02:57 +09003104func TestApex_withPrebuiltFirmware(t *testing.T) {
3105 testCases := []struct {
3106 name string
3107 additionalProp string
3108 }{
3109 {"system apex with prebuilt_firmware", ""},
3110 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3111 }
3112 for _, tc := range testCases {
3113 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003114 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003115 apex {
3116 name: "myapex",
3117 key: "myapex.key",
3118 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003119 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003120 `+tc.additionalProp+`
3121 }
3122 apex_key {
3123 name: "myapex.key",
3124 public_key: "testkey.avbpubkey",
3125 private_key: "testkey.pem",
3126 }
3127 prebuilt_firmware {
3128 name: "myfirmware",
3129 src: "myfirmware.bin",
3130 filename_from_src: true,
3131 `+tc.additionalProp+`
3132 }
3133 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003134 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003135 "etc/firmware/myfirmware.bin",
3136 })
3137 })
3138 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003139}
3140
Jooyung Hanefb184e2020-06-25 17:14:25 +09003141func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003142 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003143 apex {
3144 name: "myapex",
3145 key: "myapex.key",
3146 vendor: true,
3147 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003148 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003149 }
3150
3151 apex_key {
3152 name: "myapex.key",
3153 public_key: "testkey.avbpubkey",
3154 private_key: "testkey.pem",
3155 }
3156
3157 cc_library {
3158 name: "mylib",
3159 vendor_available: true,
3160 }
3161 `)
3162
Jooyung Hana0503a52023-08-23 13:12:50 +09003163 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003164 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003165 name := apexBundle.BaseModuleName()
3166 prefix := "TARGET_"
3167 var builder strings.Builder
3168 data.Custom(&builder, name, prefix, "", data)
3169 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003170 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003171}
3172
Jooyung Han2ed99d02020-06-24 23:26:26 +09003173func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003174 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003175 apex {
3176 name: "myapex",
3177 key: "myapex.key",
3178 vintf_fragments: ["fragment.xml"],
3179 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003180 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003181 }
3182 apex_key {
3183 name: "myapex.key",
3184 public_key: "testkey.avbpubkey",
3185 private_key: "testkey.pem",
3186 }
3187 cc_binary {
3188 name: "mybin",
3189 }
3190 `)
3191
Jooyung Hana0503a52023-08-23 13:12:50 +09003192 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003193 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003194 name := apexBundle.BaseModuleName()
3195 prefix := "TARGET_"
3196 var builder strings.Builder
3197 data.Custom(&builder, name, prefix, "", data)
3198 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003199 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003200 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003201}
3202
Jiyong Park16e91a02018-12-20 18:18:08 +09003203func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003204 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003205 apex {
3206 name: "myapex",
3207 key: "myapex.key",
3208 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003209 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003210 }
3211
3212 apex_key {
3213 name: "myapex.key",
3214 public_key: "testkey.avbpubkey",
3215 private_key: "testkey.pem",
3216 }
3217
3218 cc_library {
3219 name: "mylib",
3220 srcs: ["mylib.cpp"],
3221 system_shared_libs: [],
3222 stl: "none",
3223 stubs: {
3224 versions: ["1", "2", "3"],
3225 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003226 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003227 }
3228
3229 cc_binary {
3230 name: "not_in_apex",
3231 srcs: ["mylib.cpp"],
3232 static_libs: ["mylib"],
3233 static_executable: true,
3234 system_shared_libs: [],
3235 stl: "none",
3236 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003237 `)
3238
Colin Cross7113d202019-11-20 16:39:12 -08003239 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003240
3241 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003242 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003243}
Jiyong Park9335a262018-12-24 11:31:58 +09003244
3245func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003246 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003247 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003248 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003249 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003250 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003251 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003252 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003253 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003254 }
3255
3256 cc_library {
3257 name: "mylib",
3258 srcs: ["mylib.cpp"],
3259 system_shared_libs: [],
3260 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003261 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003262 }
3263
3264 apex_key {
3265 name: "myapex.key",
3266 public_key: "testkey.avbpubkey",
3267 private_key: "testkey.pem",
3268 }
3269
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003270 android_app_certificate {
3271 name: "myapex.certificate",
3272 certificate: "testkey",
3273 }
3274
3275 android_app_certificate {
3276 name: "myapex.certificate.override",
3277 certificate: "testkey.override",
3278 }
3279
Jiyong Park9335a262018-12-24 11:31:58 +09003280 `)
3281
3282 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003283 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003284
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003285 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3286 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003287 "vendor/foo/devkeys/testkey.avbpubkey")
3288 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003289 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3290 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003291 "vendor/foo/devkeys/testkey.pem")
3292 }
3293
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003294 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003295 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003296 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003297 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003298 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003299 }
3300}
Jiyong Park58e364a2019-01-19 19:24:06 +09003301
Jooyung Hanf121a652019-12-17 14:30:11 +09003302func TestCertificate(t *testing.T) {
3303 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003304 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003305 apex {
3306 name: "myapex",
3307 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003308 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003309 }
3310 apex_key {
3311 name: "myapex.key",
3312 public_key: "testkey.avbpubkey",
3313 private_key: "testkey.pem",
3314 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003315 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003316 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3317 if actual := rule.Args["certificates"]; actual != expected {
3318 t.Errorf("certificates should be %q, not %q", expected, actual)
3319 }
3320 })
3321 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003322 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003323 apex {
3324 name: "myapex_keytest",
3325 key: "myapex.key",
3326 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003327 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003328 }
3329 apex_key {
3330 name: "myapex.key",
3331 public_key: "testkey.avbpubkey",
3332 private_key: "testkey.pem",
3333 }
3334 android_app_certificate {
3335 name: "myapex.certificate.override",
3336 certificate: "testkey.override",
3337 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003338 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003339 expected := "testkey.override.x509.pem testkey.override.pk8"
3340 if actual := rule.Args["certificates"]; actual != expected {
3341 t.Errorf("certificates should be %q, not %q", expected, actual)
3342 }
3343 })
3344 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003345 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003346 apex {
3347 name: "myapex",
3348 key: "myapex.key",
3349 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003350 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003351 }
3352 apex_key {
3353 name: "myapex.key",
3354 public_key: "testkey.avbpubkey",
3355 private_key: "testkey.pem",
3356 }
3357 android_app_certificate {
3358 name: "myapex.certificate",
3359 certificate: "testkey",
3360 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003361 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003362 expected := "testkey.x509.pem testkey.pk8"
3363 if actual := rule.Args["certificates"]; actual != expected {
3364 t.Errorf("certificates should be %q, not %q", expected, actual)
3365 }
3366 })
3367 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003368 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003369 apex {
3370 name: "myapex_keytest",
3371 key: "myapex.key",
3372 file_contexts: ":myapex-file_contexts",
3373 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003374 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003375 }
3376 apex_key {
3377 name: "myapex.key",
3378 public_key: "testkey.avbpubkey",
3379 private_key: "testkey.pem",
3380 }
3381 android_app_certificate {
3382 name: "myapex.certificate.override",
3383 certificate: "testkey.override",
3384 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003385 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003386 expected := "testkey.override.x509.pem testkey.override.pk8"
3387 if actual := rule.Args["certificates"]; actual != expected {
3388 t.Errorf("certificates should be %q, not %q", expected, actual)
3389 }
3390 })
3391 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003392 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003393 apex {
3394 name: "myapex",
3395 key: "myapex.key",
3396 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003397 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003398 }
3399 apex_key {
3400 name: "myapex.key",
3401 public_key: "testkey.avbpubkey",
3402 private_key: "testkey.pem",
3403 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003404 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003405 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3406 if actual := rule.Args["certificates"]; actual != expected {
3407 t.Errorf("certificates should be %q, not %q", expected, actual)
3408 }
3409 })
3410 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003411 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003412 apex {
3413 name: "myapex_keytest",
3414 key: "myapex.key",
3415 file_contexts: ":myapex-file_contexts",
3416 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003417 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003418 }
3419 apex_key {
3420 name: "myapex.key",
3421 public_key: "testkey.avbpubkey",
3422 private_key: "testkey.pem",
3423 }
3424 android_app_certificate {
3425 name: "myapex.certificate.override",
3426 certificate: "testkey.override",
3427 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003428 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003429 expected := "testkey.override.x509.pem testkey.override.pk8"
3430 if actual := rule.Args["certificates"]; actual != expected {
3431 t.Errorf("certificates should be %q, not %q", expected, actual)
3432 }
3433 })
3434}
3435
Jiyong Park58e364a2019-01-19 19:24:06 +09003436func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003437 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003438 apex {
3439 name: "myapex",
3440 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003441 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003442 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003443 }
3444
3445 apex {
3446 name: "otherapex",
3447 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003448 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003449 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003450 }
3451
3452 apex_key {
3453 name: "myapex.key",
3454 public_key: "testkey.avbpubkey",
3455 private_key: "testkey.pem",
3456 }
3457
3458 cc_library {
3459 name: "mylib",
3460 srcs: ["mylib.cpp"],
3461 system_shared_libs: [],
3462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003463 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003464 "myapex",
3465 "otherapex",
3466 ],
Jooyung Han24282772020-03-21 23:20:55 +09003467 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003468 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003469 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003470 cc_library {
3471 name: "mylib2",
3472 srcs: ["mylib.cpp"],
3473 system_shared_libs: [],
3474 stl: "none",
3475 apex_available: [
3476 "myapex",
3477 "otherapex",
3478 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003479 static_libs: ["mylib3"],
3480 recovery_available: true,
3481 min_sdk_version: "29",
3482 }
3483 cc_library {
3484 name: "mylib3",
3485 srcs: ["mylib.cpp"],
3486 system_shared_libs: [],
3487 stl: "none",
3488 apex_available: [
3489 "myapex",
3490 "otherapex",
3491 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003492 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003493 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003494 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003495 `)
3496
Jooyung Hanc87a0592020-03-02 17:44:33 +09003497 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003498 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003499 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003500
Vinh Tranf9754732023-01-19 22:41:46 -05003501 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003502 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003503 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003504
Vinh Tranf9754732023-01-19 22:41:46 -05003505 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003506 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003507 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003508
Colin Crossaede88c2020-08-11 12:17:01 -07003509 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3510 // each variant defines additional macros to distinguish which apex variant it is built for
3511
3512 // non-APEX variant does not have __ANDROID_APEX__ defined
3513 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3514 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3515
Vinh Tranf9754732023-01-19 22:41:46 -05003516 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003517 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3518 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003519
Jooyung Hanc87a0592020-03-02 17:44:33 +09003520 // non-APEX variant does not have __ANDROID_APEX__ defined
3521 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3522 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3523
Vinh Tranf9754732023-01-19 22:41:46 -05003524 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003525 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003526 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003527}
Jiyong Park7e636d02019-01-28 16:16:54 +09003528
3529func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003530 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003531 apex {
3532 name: "myapex",
3533 key: "myapex.key",
3534 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003535 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003536 }
3537
3538 apex_key {
3539 name: "myapex.key",
3540 public_key: "testkey.avbpubkey",
3541 private_key: "testkey.pem",
3542 }
3543
3544 cc_library_headers {
3545 name: "mylib_headers",
3546 export_include_dirs: ["my_include"],
3547 system_shared_libs: [],
3548 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003549 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003550 }
3551
3552 cc_library {
3553 name: "mylib",
3554 srcs: ["mylib.cpp"],
3555 system_shared_libs: [],
3556 stl: "none",
3557 header_libs: ["mylib_headers"],
3558 export_header_lib_headers: ["mylib_headers"],
3559 stubs: {
3560 versions: ["1", "2", "3"],
3561 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003562 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003563 }
3564
3565 cc_library {
3566 name: "otherlib",
3567 srcs: ["mylib.cpp"],
3568 system_shared_libs: [],
3569 stl: "none",
3570 shared_libs: ["mylib"],
3571 }
3572 `)
3573
Colin Cross7113d202019-11-20 16:39:12 -08003574 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003575
3576 // Ensure that the include path of the header lib is exported to 'otherlib'
3577 ensureContains(t, cFlags, "-Imy_include")
3578}
Alex Light9670d332019-01-29 18:07:33 -08003579
Jiyong Park7cd10e32020-01-14 09:22:18 +09003580type fileInApex struct {
3581 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003582 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003583 isLink bool
3584}
3585
Jooyung Han1724d582022-12-21 10:17:44 +09003586func (f fileInApex) String() string {
3587 return f.src + ":" + f.path
3588}
3589
3590func (f fileInApex) match(expectation string) bool {
3591 parts := strings.Split(expectation, ":")
3592 if len(parts) == 1 {
3593 match, _ := path.Match(parts[0], f.path)
3594 return match
3595 }
3596 if len(parts) == 2 {
3597 matchSrc, _ := path.Match(parts[0], f.src)
3598 matchDst, _ := path.Match(parts[1], f.path)
3599 return matchSrc && matchDst
3600 }
3601 panic("invalid expected file specification: " + expectation)
3602}
3603
Jooyung Hana57af4a2020-01-23 05:36:59 +00003604func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003605 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003606 module := ctx.ModuleForTests(moduleName, variant)
3607 apexRule := module.MaybeRule("apexRule")
3608 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003609 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003610 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003611 for _, cmd := range strings.Split(copyCmds, "&&") {
3612 cmd = strings.TrimSpace(cmd)
3613 if cmd == "" {
3614 continue
3615 }
3616 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003617 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003618 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003619 switch terms[0] {
3620 case "mkdir":
3621 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003623 t.Fatal("copyCmds contains invalid cp command", cmd)
3624 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003625 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003626 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003627 isLink = false
3628 case "ln":
3629 if len(terms) != 3 && len(terms) != 4 {
3630 // ln LINK TARGET or ln -s LINK TARGET
3631 t.Fatal("copyCmds contains invalid ln command", cmd)
3632 }
3633 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003634 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003635 isLink = true
3636 default:
3637 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3638 }
3639 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003640 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003641 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003642 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003643 }
Jooyung Han1724d582022-12-21 10:17:44 +09003644 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003645 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003646 }
3647 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003648 return ret
3649}
3650
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003651func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003652 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003653 var failed bool
3654 var surplus []string
3655 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003656 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003657 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003658 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003659 if file.match(expected) {
3660 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003661 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003662 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003663 }
3664 }
Jooyung Han1724d582022-12-21 10:17:44 +09003665 if !matchFound {
3666 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003667 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003668 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003669
Jooyung Han31c470b2019-10-18 16:26:59 +09003670 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003671 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003672 t.Log("surplus files", surplus)
3673 failed = true
3674 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003675
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003676 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003677 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003678 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003679 if !filesMatched[expected] {
3680 missing = append(missing, expected)
3681 }
3682 }
3683 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003684 t.Log("missing files", missing)
3685 failed = true
3686 }
3687 if failed {
3688 t.Fail()
3689 }
3690}
3691
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003692func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3693 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3694}
3695
3696func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3697 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3698 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3699 if deapexer.Output != nil {
3700 outputs = append(outputs, deapexer.Output.String())
3701 }
3702 for _, output := range deapexer.ImplicitOutputs {
3703 outputs = append(outputs, output.String())
3704 }
3705 actualFiles := make([]fileInApex, 0, len(outputs))
3706 for _, output := range outputs {
3707 dir := "/deapexer/"
3708 pos := strings.LastIndex(output, dir)
3709 if pos == -1 {
3710 t.Fatal("Unknown deapexer output ", output)
3711 }
3712 path := output[pos+len(dir):]
3713 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3714 }
3715 assertFileListEquals(t, files, actualFiles)
3716}
3717
Jooyung Han344d5432019-08-23 11:17:39 +09003718func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003719 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003720 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003721 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003722 "etc/llndk.libraries.29.txt",
3723 "etc/vndkcore.libraries.29.txt",
3724 "etc/vndksp.libraries.29.txt",
3725 "etc/vndkprivate.libraries.29.txt",
3726 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003727 }
3728 testCases := []struct {
3729 vndkVersion string
3730 expectedFiles []string
3731 }{
3732 {
3733 vndkVersion: "current",
3734 expectedFiles: append(commonFiles,
3735 "lib/libvndk.so",
3736 "lib/libvndksp.so",
3737 "lib64/libvndk.so",
3738 "lib64/libvndksp.so"),
3739 },
3740 {
3741 vndkVersion: "",
3742 expectedFiles: append(commonFiles,
3743 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3744 "lib/libvndksp.so",
3745 "lib64/libvndksp.so"),
3746 },
3747 }
3748 for _, tc := range testCases {
3749 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3750 ctx := testApex(t, `
3751 apex_vndk {
3752 name: "com.android.vndk.current",
3753 key: "com.android.vndk.current.key",
3754 updatable: false,
3755 }
3756
3757 apex_key {
3758 name: "com.android.vndk.current.key",
3759 public_key: "testkey.avbpubkey",
3760 private_key: "testkey.pem",
3761 }
3762
3763 cc_library {
3764 name: "libvndk",
3765 srcs: ["mylib.cpp"],
3766 vendor_available: true,
3767 product_available: true,
3768 vndk: {
3769 enabled: true,
3770 },
3771 system_shared_libs: [],
3772 stl: "none",
3773 apex_available: [ "com.android.vndk.current" ],
3774 }
3775
3776 cc_library {
3777 name: "libvndksp",
3778 srcs: ["mylib.cpp"],
3779 vendor_available: true,
3780 product_available: true,
3781 vndk: {
3782 enabled: true,
3783 support_system_process: true,
3784 },
3785 system_shared_libs: [],
3786 stl: "none",
3787 apex_available: [ "com.android.vndk.current" ],
3788 }
3789
3790 // VNDK-Ext should not cause any problems
3791
3792 cc_library {
3793 name: "libvndk.ext",
3794 srcs: ["mylib2.cpp"],
3795 vendor: true,
3796 vndk: {
3797 enabled: true,
3798 extends: "libvndk",
3799 },
3800 system_shared_libs: [],
3801 stl: "none",
3802 }
3803
3804 cc_library {
3805 name: "libvndksp.ext",
3806 srcs: ["mylib2.cpp"],
3807 vendor: true,
3808 vndk: {
3809 enabled: true,
3810 support_system_process: true,
3811 extends: "libvndksp",
3812 },
3813 system_shared_libs: [],
3814 stl: "none",
3815 }
3816 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3817 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003818 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003819 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003820 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003821 })
3822 }
Jooyung Han344d5432019-08-23 11:17:39 +09003823}
3824
3825func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003826 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003827 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003828 name: "com.android.vndk.current",
3829 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003830 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003831 }
3832
3833 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003834 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003835 public_key: "testkey.avbpubkey",
3836 private_key: "testkey.pem",
3837 }
3838
3839 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003840 name: "libvndk",
3841 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003842 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003843 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003844 vndk: {
3845 enabled: true,
3846 },
3847 system_shared_libs: [],
3848 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003849 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003850 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003851
3852 cc_prebuilt_library_shared {
3853 name: "libvndk.arm",
3854 srcs: ["libvndk.arm.so"],
3855 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003856 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003857 vndk: {
3858 enabled: true,
3859 },
3860 enabled: false,
3861 arch: {
3862 arm: {
3863 enabled: true,
3864 },
3865 },
3866 system_shared_libs: [],
3867 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003868 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003869 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003870 `+vndkLibrariesTxtFiles("current"),
3871 withFiles(map[string][]byte{
3872 "libvndk.so": nil,
3873 "libvndk.arm.so": nil,
3874 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003875 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003876 "lib/libvndk.so",
3877 "lib/libvndk.arm.so",
3878 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003879 "lib/libc++.so",
3880 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003881 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003882 })
Jooyung Han344d5432019-08-23 11:17:39 +09003883}
3884
Jooyung Han39edb6c2019-11-06 16:53:07 +09003885func vndkLibrariesTxtFiles(vers ...string) (result string) {
3886 for _, v := range vers {
3887 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003888 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003889 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003890 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003891 name: "` + txt + `.libraries.txt",
3892 }
3893 `
3894 }
3895 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003896 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003897 result += `
3898 prebuilt_etc {
3899 name: "` + txt + `.libraries.` + v + `.txt",
3900 src: "dummy.txt",
3901 }
3902 `
3903 }
3904 }
3905 }
3906 return
3907}
3908
Jooyung Han344d5432019-08-23 11:17:39 +09003909func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003910 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003911 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003912 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003913 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003914 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003915 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003916 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003917 }
3918
3919 apex_key {
3920 name: "myapex.key",
3921 public_key: "testkey.avbpubkey",
3922 private_key: "testkey.pem",
3923 }
3924
Jooyung Han31c470b2019-10-18 16:26:59 +09003925 vndk_prebuilt_shared {
3926 name: "libvndk27",
3927 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003928 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003929 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003930 vndk: {
3931 enabled: true,
3932 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003933 target_arch: "arm64",
3934 arch: {
3935 arm: {
3936 srcs: ["libvndk27_arm.so"],
3937 },
3938 arm64: {
3939 srcs: ["libvndk27_arm64.so"],
3940 },
3941 },
Colin Cross2807f002021-03-02 10:15:29 -08003942 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003943 }
3944
3945 vndk_prebuilt_shared {
3946 name: "libvndk27",
3947 version: "27",
3948 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003949 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003950 vndk: {
3951 enabled: true,
3952 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003953 target_arch: "x86_64",
3954 arch: {
3955 x86: {
3956 srcs: ["libvndk27_x86.so"],
3957 },
3958 x86_64: {
3959 srcs: ["libvndk27_x86_64.so"],
3960 },
3961 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003962 }
3963 `+vndkLibrariesTxtFiles("27"),
3964 withFiles(map[string][]byte{
3965 "libvndk27_arm.so": nil,
3966 "libvndk27_arm64.so": nil,
3967 "libvndk27_x86.so": nil,
3968 "libvndk27_x86_64.so": nil,
3969 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003970
Jooyung Hana0503a52023-08-23 13:12:50 +09003971 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003972 "lib/libvndk27_arm.so",
3973 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003974 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003975 })
Jooyung Han344d5432019-08-23 11:17:39 +09003976}
3977
Jooyung Han90eee022019-10-01 20:02:42 +09003978func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003979 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003980 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003981 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003982 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003983 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003984 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003985 }
3986 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003987 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003988 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003989 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003990 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003991 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003992 }
3993 apex_key {
3994 name: "myapex.key",
3995 public_key: "testkey.avbpubkey",
3996 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003997 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003998
3999 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004000 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004001 apexManifestRule := module.Rule("apexManifestRule")
4002 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004003 }
4004
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004005 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004006 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004007}
4008
Jooyung Han344d5432019-08-23 11:17:39 +09004009func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004010 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004011 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004012 name: "com.android.vndk.current",
4013 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004014 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004015 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004016 }
4017
4018 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004019 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004020 public_key: "testkey.avbpubkey",
4021 private_key: "testkey.pem",
4022 }
4023
4024 cc_library {
4025 name: "libvndk",
4026 srcs: ["mylib.cpp"],
4027 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004028 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004029 native_bridge_supported: true,
4030 host_supported: true,
4031 vndk: {
4032 enabled: true,
4033 },
4034 system_shared_libs: [],
4035 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004036 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004037 }
Colin Cross2807f002021-03-02 10:15:29 -08004038 `+vndkLibrariesTxtFiles("current"),
4039 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004040
Jooyung Hana0503a52023-08-23 13:12:50 +09004041 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004042 "lib/libvndk.so",
4043 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004044 "lib/libc++.so",
4045 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004046 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004047 })
Jooyung Han344d5432019-08-23 11:17:39 +09004048}
4049
4050func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004051 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004052 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004053 name: "com.android.vndk.current",
4054 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004055 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004056 native_bridge_supported: true,
4057 }
4058
4059 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004060 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004061 public_key: "testkey.avbpubkey",
4062 private_key: "testkey.pem",
4063 }
4064
4065 cc_library {
4066 name: "libvndk",
4067 srcs: ["mylib.cpp"],
4068 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004069 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004070 native_bridge_supported: true,
4071 host_supported: true,
4072 vndk: {
4073 enabled: true,
4074 },
4075 system_shared_libs: [],
4076 stl: "none",
4077 }
4078 `)
4079}
4080
Jooyung Han31c470b2019-10-18 16:26:59 +09004081func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004082 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004083 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004084 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004085 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004086 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004087 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004088 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004089 }
4090
4091 apex_key {
4092 name: "myapex.key",
4093 public_key: "testkey.avbpubkey",
4094 private_key: "testkey.pem",
4095 }
4096
4097 vndk_prebuilt_shared {
4098 name: "libvndk27",
4099 version: "27",
4100 target_arch: "arm",
4101 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004102 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004103 vndk: {
4104 enabled: true,
4105 },
4106 arch: {
4107 arm: {
4108 srcs: ["libvndk27.so"],
4109 }
4110 },
4111 }
4112
4113 vndk_prebuilt_shared {
4114 name: "libvndk27",
4115 version: "27",
4116 target_arch: "arm",
4117 binder32bit: true,
4118 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004119 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004120 vndk: {
4121 enabled: true,
4122 },
4123 arch: {
4124 arm: {
4125 srcs: ["libvndk27binder32.so"],
4126 }
4127 },
Colin Cross2807f002021-03-02 10:15:29 -08004128 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004129 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004130 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004131 withFiles(map[string][]byte{
4132 "libvndk27.so": nil,
4133 "libvndk27binder32.so": nil,
4134 }),
4135 withBinder32bit,
4136 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004137 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004138 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4139 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004140 },
4141 }),
4142 )
4143
Jooyung Hana0503a52023-08-23 13:12:50 +09004144 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004145 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004146 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004147 })
4148}
4149
Jooyung Han45a96772020-06-15 14:59:42 +09004150func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004151 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004152 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004153 name: "com.android.vndk.current",
4154 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004155 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004156 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004157 }
4158
4159 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004160 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004161 public_key: "testkey.avbpubkey",
4162 private_key: "testkey.pem",
4163 }
4164
4165 cc_library {
4166 name: "libz",
4167 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004168 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004169 vndk: {
4170 enabled: true,
4171 },
4172 stubs: {
4173 symbol_file: "libz.map.txt",
4174 versions: ["30"],
4175 }
4176 }
4177 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4178 "libz.map.txt": nil,
4179 }))
4180
Jooyung Hana0503a52023-08-23 13:12:50 +09004181 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004182 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4183 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004184 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004185 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4186 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4187 "*/*",
4188 })
Jooyung Han45a96772020-06-15 14:59:42 +09004189}
4190
Jooyung Hane3f02812023-05-08 13:54:50 +09004191func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4192 ctx := testApex(t, "",
4193 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4194 variables.DeviceVndkVersion = proptools.StringPtr("27")
4195 }),
4196 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4197 cc.RegisterVendorSnapshotModules(ctx)
4198 }),
4199 withFiles(map[string][]byte{
4200 "vendor/foo/Android.bp": []byte(`
4201 apex {
4202 name: "myapex",
4203 binaries: ["foo"],
4204 key: "myapex.key",
4205 min_sdk_version: "27",
4206 vendor: true,
4207 }
4208
4209 cc_binary {
4210 name: "foo",
4211 vendor: true,
4212 srcs: ["abc.cpp"],
4213 shared_libs: [
4214 "libllndk",
4215 "libvndk",
4216 ],
4217 nocrt: true,
4218 system_shared_libs: [],
4219 min_sdk_version: "27",
4220 }
4221
4222 apex_key {
4223 name: "myapex.key",
4224 public_key: "testkey.avbpubkey",
4225 private_key: "testkey.pem",
4226 }
4227 `),
4228 // Simulate VNDK prebuilts with vendor_snapshot
4229 "prebuilts/vndk/Android.bp": []byte(`
4230 vndk_prebuilt_shared {
4231 name: "libllndk",
4232 version: "27",
4233 vendor_available: true,
4234 product_available: true,
4235 target_arch: "arm64",
4236 arch: {
4237 arm64: {
4238 srcs: ["libllndk.so"],
4239 },
4240 },
4241 }
4242
4243 vndk_prebuilt_shared {
4244 name: "libvndk",
4245 version: "27",
4246 vendor_available: true,
4247 product_available: true,
4248 target_arch: "arm64",
4249 arch: {
4250 arm64: {
4251 srcs: ["libvndk.so"],
4252 },
4253 },
4254 vndk: {
4255 enabled: true,
4256 },
4257 min_sdk_version: "27",
4258 }
4259
4260 vndk_prebuilt_shared {
4261 name: "libc++",
4262 version: "27",
4263 target_arch: "arm64",
4264 vendor_available: true,
4265 product_available: true,
4266 vndk: {
4267 enabled: true,
4268 support_system_process: true,
4269 },
4270 arch: {
4271 arm64: {
4272 srcs: ["libc++.so"],
4273 },
4274 },
4275 min_sdk_version: "apex_inherit",
4276 }
4277
4278 vendor_snapshot {
4279 name: "vendor_snapshot",
4280 version: "27",
4281 arch: {
4282 arm64: {
4283 vndk_libs: [
4284 "libc++",
4285 "libllndk",
4286 "libvndk",
4287 ],
4288 static_libs: [
4289 "libc++demangle",
4290 "libclang_rt.builtins",
4291 "libunwind",
4292 ],
4293 },
4294 }
4295 }
4296
4297 vendor_snapshot_static {
4298 name: "libclang_rt.builtins",
4299 version: "27",
4300 target_arch: "arm64",
4301 vendor: true,
4302 arch: {
4303 arm64: {
4304 src: "libclang_rt.builtins-aarch64-android.a",
4305 },
4306 },
4307 }
4308
4309 vendor_snapshot_static {
4310 name: "libc++demangle",
4311 version: "27",
4312 target_arch: "arm64",
4313 compile_multilib: "64",
4314 vendor: true,
4315 arch: {
4316 arm64: {
4317 src: "libc++demangle.a",
4318 },
4319 },
4320 min_sdk_version: "apex_inherit",
4321 }
4322
4323 vendor_snapshot_static {
4324 name: "libunwind",
4325 version: "27",
4326 target_arch: "arm64",
4327 compile_multilib: "64",
4328 vendor: true,
4329 arch: {
4330 arm64: {
4331 src: "libunwind.a",
4332 },
4333 },
4334 min_sdk_version: "apex_inherit",
4335 }
4336 `),
4337 }))
4338
4339 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004340 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004341 "bin/foo",
4342 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4343 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4344 })
4345
4346 // Should link foo with prebuilt libraries (shared/static)
4347 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4348 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4349 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4350 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4351 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4352
4353 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004354 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004355 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4356 ensureListContains(t, requireNativeLibs, "libllndk.so")
4357}
4358
Jooyung Hane1633032019-08-01 17:41:43 +09004359func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004360 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004361 apex {
4362 name: "myapex_nodep",
4363 key: "myapex.key",
4364 native_shared_libs: ["lib_nodep"],
4365 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004366 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004367 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004368 }
4369
4370 apex {
4371 name: "myapex_dep",
4372 key: "myapex.key",
4373 native_shared_libs: ["lib_dep"],
4374 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004375 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004376 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004377 }
4378
4379 apex {
4380 name: "myapex_provider",
4381 key: "myapex.key",
4382 native_shared_libs: ["libfoo"],
4383 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004384 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004385 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004386 }
4387
4388 apex {
4389 name: "myapex_selfcontained",
4390 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004391 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004392 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004393 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004394 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004395 }
4396
4397 apex_key {
4398 name: "myapex.key",
4399 public_key: "testkey.avbpubkey",
4400 private_key: "testkey.pem",
4401 }
4402
4403 cc_library {
4404 name: "lib_nodep",
4405 srcs: ["mylib.cpp"],
4406 system_shared_libs: [],
4407 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004408 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004409 }
4410
4411 cc_library {
4412 name: "lib_dep",
4413 srcs: ["mylib.cpp"],
4414 shared_libs: ["libfoo"],
4415 system_shared_libs: [],
4416 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004417 apex_available: [
4418 "myapex_dep",
4419 "myapex_provider",
4420 "myapex_selfcontained",
4421 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004422 }
4423
4424 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004425 name: "lib_dep_on_bar",
4426 srcs: ["mylib.cpp"],
4427 shared_libs: ["libbar"],
4428 system_shared_libs: [],
4429 stl: "none",
4430 apex_available: [
4431 "myapex_selfcontained",
4432 ],
4433 }
4434
4435
4436 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004437 name: "libfoo",
4438 srcs: ["mytest.cpp"],
4439 stubs: {
4440 versions: ["1"],
4441 },
4442 system_shared_libs: [],
4443 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004444 apex_available: [
4445 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004446 ],
4447 }
4448
4449 cc_library {
4450 name: "libbar",
4451 srcs: ["mytest.cpp"],
4452 stubs: {
4453 versions: ["1"],
4454 },
4455 system_shared_libs: [],
4456 stl: "none",
4457 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004458 "myapex_selfcontained",
4459 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004460 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004461
Jooyung Hane1633032019-08-01 17:41:43 +09004462 `)
4463
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004464 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004465 var provideNativeLibs, requireNativeLibs []string
4466
Jooyung Hana0503a52023-08-23 13:12:50 +09004467 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004468 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4469 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004470 ensureListEmpty(t, provideNativeLibs)
4471 ensureListEmpty(t, requireNativeLibs)
4472
Jooyung Hana0503a52023-08-23 13:12:50 +09004473 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004474 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4475 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004476 ensureListEmpty(t, provideNativeLibs)
4477 ensureListContains(t, requireNativeLibs, "libfoo.so")
4478
Jooyung Hana0503a52023-08-23 13:12:50 +09004479 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004480 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4481 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004482 ensureListContains(t, provideNativeLibs, "libfoo.so")
4483 ensureListEmpty(t, requireNativeLibs)
4484
Jooyung Hana0503a52023-08-23 13:12:50 +09004485 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004486 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4487 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004488 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004489 ensureListEmpty(t, requireNativeLibs)
4490}
4491
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004492func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4493 ctx := testApex(t, `
4494 apex {
4495 name: "myapex",
4496 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004497 native_shared_libs: ["mylib"],
4498 updatable: false,
4499 }
4500
4501 apex_key {
4502 name: "myapex.key",
4503 public_key: "testkey.avbpubkey",
4504 private_key: "testkey.pem",
4505 }
4506
4507 cc_library {
4508 name: "mylib",
4509 srcs: ["mylib.cpp"],
4510 system_shared_libs: [],
4511 stl: "none",
4512 apex_available: [
4513 "//apex_available:platform",
4514 "myapex",
4515 ],
4516 }
4517 `, android.FixtureMergeEnv(map[string]string{
4518 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4519 }))
4520
Jooyung Hana0503a52023-08-23 13:12:50 +09004521 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004522 apexManifestRule := module.Rule("apexManifestRule")
4523 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4524}
4525
Vinh Tran8f5310f2022-10-07 18:16:47 -04004526func TestCompileMultilibProp(t *testing.T) {
4527 testCases := []struct {
4528 compileMultiLibProp string
4529 containedLibs []string
4530 notContainedLibs []string
4531 }{
4532 {
4533 containedLibs: []string{
4534 "image.apex/lib64/mylib.so",
4535 "image.apex/lib/mylib.so",
4536 },
4537 compileMultiLibProp: `compile_multilib: "both",`,
4538 },
4539 {
4540 containedLibs: []string{"image.apex/lib64/mylib.so"},
4541 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4542 compileMultiLibProp: `compile_multilib: "first",`,
4543 },
4544 {
4545 containedLibs: []string{"image.apex/lib64/mylib.so"},
4546 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4547 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4548 },
4549 {
4550 containedLibs: []string{"image.apex/lib64/mylib.so"},
4551 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4552 compileMultiLibProp: `compile_multilib: "64",`,
4553 },
4554 {
4555 containedLibs: []string{"image.apex/lib/mylib.so"},
4556 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4557 compileMultiLibProp: `compile_multilib: "32",`,
4558 },
4559 }
4560 for _, testCase := range testCases {
4561 ctx := testApex(t, fmt.Sprintf(`
4562 apex {
4563 name: "myapex",
4564 key: "myapex.key",
4565 %s
4566 native_shared_libs: ["mylib"],
4567 updatable: false,
4568 }
4569 apex_key {
4570 name: "myapex.key",
4571 public_key: "testkey.avbpubkey",
4572 private_key: "testkey.pem",
4573 }
4574 cc_library {
4575 name: "mylib",
4576 srcs: ["mylib.cpp"],
4577 apex_available: [
4578 "//apex_available:platform",
4579 "myapex",
4580 ],
4581 }
4582 `, testCase.compileMultiLibProp),
4583 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004584 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004585 apexRule := module.Rule("apexRule")
4586 copyCmds := apexRule.Args["copy_commands"]
4587 for _, containedLib := range testCase.containedLibs {
4588 ensureContains(t, copyCmds, containedLib)
4589 }
4590 for _, notContainedLib := range testCase.notContainedLibs {
4591 ensureNotContains(t, copyCmds, notContainedLib)
4592 }
4593 }
4594}
4595
Alex Light0851b882019-02-07 13:20:53 -08004596func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004597 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004598 apex {
4599 name: "myapex",
4600 key: "myapex.key",
4601 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004602 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004603 }
4604
4605 apex_key {
4606 name: "myapex.key",
4607 public_key: "testkey.avbpubkey",
4608 private_key: "testkey.pem",
4609 }
4610
4611 cc_library {
4612 name: "mylib_common",
4613 srcs: ["mylib.cpp"],
4614 system_shared_libs: [],
4615 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004616 apex_available: [
4617 "//apex_available:platform",
4618 "myapex",
4619 ],
Alex Light0851b882019-02-07 13:20:53 -08004620 }
4621 `)
4622
Jooyung Hana0503a52023-08-23 13:12:50 +09004623 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004624 apexRule := module.Rule("apexRule")
4625 copyCmds := apexRule.Args["copy_commands"]
4626
4627 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4628 t.Log("Apex was a test apex!")
4629 t.Fail()
4630 }
4631 // Ensure that main rule creates an output
4632 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4633
4634 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004635 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004636
4637 // Ensure that both direct and indirect deps are copied into apex
4638 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4639
Colin Cross7113d202019-11-20 16:39:12 -08004640 // Ensure that the platform variant ends with _shared
4641 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004642
Colin Cross56a83212020-09-15 18:30:11 -07004643 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004644 t.Log("Found mylib_common not in any apex!")
4645 t.Fail()
4646 }
4647}
4648
4649func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004650 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004651 apex_test {
4652 name: "myapex",
4653 key: "myapex.key",
4654 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004655 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004656 }
4657
4658 apex_key {
4659 name: "myapex.key",
4660 public_key: "testkey.avbpubkey",
4661 private_key: "testkey.pem",
4662 }
4663
4664 cc_library {
4665 name: "mylib_common_test",
4666 srcs: ["mylib.cpp"],
4667 system_shared_libs: [],
4668 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004669 // TODO: remove //apex_available:platform
4670 apex_available: [
4671 "//apex_available:platform",
4672 "myapex",
4673 ],
Alex Light0851b882019-02-07 13:20:53 -08004674 }
4675 `)
4676
Jooyung Hana0503a52023-08-23 13:12:50 +09004677 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004678 apexRule := module.Rule("apexRule")
4679 copyCmds := apexRule.Args["copy_commands"]
4680
4681 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4682 t.Log("Apex was not a test apex!")
4683 t.Fail()
4684 }
4685 // Ensure that main rule creates an output
4686 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4687
4688 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004689 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004690
4691 // Ensure that both direct and indirect deps are copied into apex
4692 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4693
Colin Cross7113d202019-11-20 16:39:12 -08004694 // Ensure that the platform variant ends with _shared
4695 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004696}
4697
Alex Light9670d332019-01-29 18:07:33 -08004698func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004699 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004700 apex {
4701 name: "myapex",
4702 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004703 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004704 multilib: {
4705 first: {
4706 native_shared_libs: ["mylib_common"],
4707 }
4708 },
4709 target: {
4710 android: {
4711 multilib: {
4712 first: {
4713 native_shared_libs: ["mylib"],
4714 }
4715 }
4716 },
4717 host: {
4718 multilib: {
4719 first: {
4720 native_shared_libs: ["mylib2"],
4721 }
4722 }
4723 }
4724 }
4725 }
4726
4727 apex_key {
4728 name: "myapex.key",
4729 public_key: "testkey.avbpubkey",
4730 private_key: "testkey.pem",
4731 }
4732
4733 cc_library {
4734 name: "mylib",
4735 srcs: ["mylib.cpp"],
4736 system_shared_libs: [],
4737 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004738 // TODO: remove //apex_available:platform
4739 apex_available: [
4740 "//apex_available:platform",
4741 "myapex",
4742 ],
Alex Light9670d332019-01-29 18:07:33 -08004743 }
4744
4745 cc_library {
4746 name: "mylib_common",
4747 srcs: ["mylib.cpp"],
4748 system_shared_libs: [],
4749 stl: "none",
4750 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004751 // TODO: remove //apex_available:platform
4752 apex_available: [
4753 "//apex_available:platform",
4754 "myapex",
4755 ],
Alex Light9670d332019-01-29 18:07:33 -08004756 }
4757
4758 cc_library {
4759 name: "mylib2",
4760 srcs: ["mylib.cpp"],
4761 system_shared_libs: [],
4762 stl: "none",
4763 compile_multilib: "first",
4764 }
4765 `)
4766
Jooyung Hana0503a52023-08-23 13:12:50 +09004767 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004768 copyCmds := apexRule.Args["copy_commands"]
4769
4770 // Ensure that main rule creates an output
4771 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4772
4773 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004774 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4775 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4776 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004777
4778 // Ensure that both direct and indirect deps are copied into apex
4779 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4780 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4781 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4782
Colin Cross7113d202019-11-20 16:39:12 -08004783 // Ensure that the platform variant ends with _shared
4784 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4785 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4786 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004787}
Jiyong Park04480cf2019-02-06 00:16:29 +09004788
Jiyong Park59140302020-12-14 18:44:04 +09004789func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004790 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004791 apex {
4792 name: "myapex",
4793 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004794 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004795 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004796 arch: {
4797 arm64: {
4798 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004799 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004800 },
4801 x86_64: {
4802 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004803 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004804 },
4805 }
4806 }
4807
4808 apex_key {
4809 name: "myapex.key",
4810 public_key: "testkey.avbpubkey",
4811 private_key: "testkey.pem",
4812 }
4813
4814 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004815 name: "mylib.generic",
4816 srcs: ["mylib.cpp"],
4817 system_shared_libs: [],
4818 stl: "none",
4819 // TODO: remove //apex_available:platform
4820 apex_available: [
4821 "//apex_available:platform",
4822 "myapex",
4823 ],
4824 }
4825
4826 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004827 name: "mylib.arm64",
4828 srcs: ["mylib.cpp"],
4829 system_shared_libs: [],
4830 stl: "none",
4831 // TODO: remove //apex_available:platform
4832 apex_available: [
4833 "//apex_available:platform",
4834 "myapex",
4835 ],
4836 }
4837
4838 cc_library {
4839 name: "mylib.x64",
4840 srcs: ["mylib.cpp"],
4841 system_shared_libs: [],
4842 stl: "none",
4843 // TODO: remove //apex_available:platform
4844 apex_available: [
4845 "//apex_available:platform",
4846 "myapex",
4847 ],
4848 }
4849 `)
4850
Jooyung Hana0503a52023-08-23 13:12:50 +09004851 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004852 copyCmds := apexRule.Args["copy_commands"]
4853
4854 // Ensure that apex variant is created for the direct dep
4855 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004856 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004857 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4858
4859 // Ensure that both direct and indirect deps are copied into apex
4860 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4861 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4862}
4863
Jiyong Park04480cf2019-02-06 00:16:29 +09004864func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004865 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004866 apex {
4867 name: "myapex",
4868 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004869 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004870 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004871 }
4872
4873 apex_key {
4874 name: "myapex.key",
4875 public_key: "testkey.avbpubkey",
4876 private_key: "testkey.pem",
4877 }
4878
4879 sh_binary {
4880 name: "myscript",
4881 src: "mylib.cpp",
4882 filename: "myscript.sh",
4883 sub_dir: "script",
4884 }
4885 `)
4886
Jooyung Hana0503a52023-08-23 13:12:50 +09004887 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004888 copyCmds := apexRule.Args["copy_commands"]
4889
4890 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4891}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004892
Jooyung Han91df2082019-11-20 01:49:42 +09004893func TestApexInVariousPartition(t *testing.T) {
4894 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004895 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004896 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004897 {"", "system"},
4898 {"product_specific: true", "product"},
4899 {"soc_specific: true", "vendor"},
4900 {"proprietary: true", "vendor"},
4901 {"vendor: true", "vendor"},
4902 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004903 }
4904 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004905 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004906 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004907 apex {
4908 name: "myapex",
4909 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004910 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004911 `+tc.propName+`
4912 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004913
Jooyung Han91df2082019-11-20 01:49:42 +09004914 apex_key {
4915 name: "myapex.key",
4916 public_key: "testkey.avbpubkey",
4917 private_key: "testkey.pem",
4918 }
4919 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004920
Jooyung Hana0503a52023-08-23 13:12:50 +09004921 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004922 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004923 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004924 if actual != expected {
4925 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4926 }
Jooyung Han91df2082019-11-20 01:49:42 +09004927 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004928 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004929}
Jiyong Park67882562019-03-21 01:11:21 +09004930
Jooyung Han580eb4f2020-06-24 19:33:06 +09004931func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004932 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004933 apex {
4934 name: "myapex",
4935 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004936 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004937 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004938
Jooyung Han580eb4f2020-06-24 19:33:06 +09004939 apex_key {
4940 name: "myapex.key",
4941 public_key: "testkey.avbpubkey",
4942 private_key: "testkey.pem",
4943 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004944 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004945 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004946 rule := module.Output("file_contexts")
4947 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4948}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004949
Jooyung Han580eb4f2020-06-24 19:33:06 +09004950func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004951 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004952 apex {
4953 name: "myapex",
4954 key: "myapex.key",
4955 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004956 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004957 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004958
Jooyung Han580eb4f2020-06-24 19:33:06 +09004959 apex_key {
4960 name: "myapex.key",
4961 public_key: "testkey.avbpubkey",
4962 private_key: "testkey.pem",
4963 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004964 `, withFiles(map[string][]byte{
4965 "my_own_file_contexts": nil,
4966 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004967}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004968
Jooyung Han580eb4f2020-06-24 19:33:06 +09004969func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004970 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004971 apex {
4972 name: "myapex",
4973 key: "myapex.key",
4974 product_specific: true,
4975 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004976 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004977 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004978
Jooyung Han580eb4f2020-06-24 19:33:06 +09004979 apex_key {
4980 name: "myapex.key",
4981 public_key: "testkey.avbpubkey",
4982 private_key: "testkey.pem",
4983 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004984 `)
4985
Colin Cross1c460562021-02-16 17:55:47 -08004986 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004987 apex {
4988 name: "myapex",
4989 key: "myapex.key",
4990 product_specific: true,
4991 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004992 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004993 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004994
Jooyung Han580eb4f2020-06-24 19:33:06 +09004995 apex_key {
4996 name: "myapex.key",
4997 public_key: "testkey.avbpubkey",
4998 private_key: "testkey.pem",
4999 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005000 `, withFiles(map[string][]byte{
5001 "product_specific_file_contexts": nil,
5002 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005003 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005004 rule := module.Output("file_contexts")
5005 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5006}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005007
Jooyung Han580eb4f2020-06-24 19:33:06 +09005008func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005009 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005010 apex {
5011 name: "myapex",
5012 key: "myapex.key",
5013 product_specific: true,
5014 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005015 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005016 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005017
Jooyung Han580eb4f2020-06-24 19:33:06 +09005018 apex_key {
5019 name: "myapex.key",
5020 public_key: "testkey.avbpubkey",
5021 private_key: "testkey.pem",
5022 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005023
Jooyung Han580eb4f2020-06-24 19:33:06 +09005024 filegroup {
5025 name: "my-file-contexts",
5026 srcs: ["product_specific_file_contexts"],
5027 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005028 `, withFiles(map[string][]byte{
5029 "product_specific_file_contexts": nil,
5030 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005031 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005032 rule := module.Output("file_contexts")
5033 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005034}
5035
Jiyong Park67882562019-03-21 01:11:21 +09005036func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005037 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005038 apex_key {
5039 name: "myapex.key",
5040 public_key: ":my.avbpubkey",
5041 private_key: ":my.pem",
5042 product_specific: true,
5043 }
5044
5045 filegroup {
5046 name: "my.avbpubkey",
5047 srcs: ["testkey2.avbpubkey"],
5048 }
5049
5050 filegroup {
5051 name: "my.pem",
5052 srcs: ["testkey2.pem"],
5053 }
5054 `)
5055
5056 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5057 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005058 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005059 if actual_pubkey != expected_pubkey {
5060 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5061 }
5062 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005063 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005064 if actual_privkey != expected_privkey {
5065 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5066 }
5067}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005068
5069func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005070 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005071 prebuilt_apex {
5072 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005073 arch: {
5074 arm64: {
5075 src: "myapex-arm64.apex",
5076 },
5077 arm: {
5078 src: "myapex-arm.apex",
5079 },
5080 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005081 }
5082 `)
5083
Wei Li340ee8e2022-03-18 17:33:24 -07005084 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5085 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005086
Jiyong Parkc95714e2019-03-29 14:23:10 +09005087 expectedInput := "myapex-arm64.apex"
5088 if prebuilt.inputApex.String() != expectedInput {
5089 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5090 }
Wei Li340ee8e2022-03-18 17:33:24 -07005091 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5092 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5093 rule := testingModule.Rule("genProvenanceMetaData")
5094 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5095 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5096 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5097 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005098
5099 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5100 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005101}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005102
Paul Duffinc0609c62021-03-01 17:27:16 +00005103func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005104 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005105 prebuilt_apex {
5106 name: "myapex",
5107 }
5108 `)
5109}
5110
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005111func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005112 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005113 prebuilt_apex {
5114 name: "myapex",
5115 src: "myapex-arm.apex",
5116 filename: "notmyapex.apex",
5117 }
5118 `)
5119
Wei Li340ee8e2022-03-18 17:33:24 -07005120 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5121 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005122
5123 expected := "notmyapex.apex"
5124 if p.installFilename != expected {
5125 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5126 }
Wei Li340ee8e2022-03-18 17:33:24 -07005127 rule := testingModule.Rule("genProvenanceMetaData")
5128 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5129 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5130 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5131 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005132}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005133
Samiul Islam7c02e262021-09-08 17:48:28 +01005134func TestApexSetFilenameOverride(t *testing.T) {
5135 testApex(t, `
5136 apex_set {
5137 name: "com.company.android.myapex",
5138 apex_name: "com.android.myapex",
5139 set: "company-myapex.apks",
5140 filename: "com.company.android.myapex.apex"
5141 }
5142 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5143
5144 testApex(t, `
5145 apex_set {
5146 name: "com.company.android.myapex",
5147 apex_name: "com.android.myapex",
5148 set: "company-myapex.apks",
5149 filename: "com.company.android.myapex.capex"
5150 }
5151 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5152
5153 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5154 apex_set {
5155 name: "com.company.android.myapex",
5156 apex_name: "com.android.myapex",
5157 set: "company-myapex.apks",
5158 filename: "some-random-suffix"
5159 }
5160 `)
5161}
5162
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005163func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005164 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005165 prebuilt_apex {
5166 name: "myapex.prebuilt",
5167 src: "myapex-arm.apex",
5168 overrides: [
5169 "myapex",
5170 ],
5171 }
5172 `)
5173
Wei Li340ee8e2022-03-18 17:33:24 -07005174 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5175 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005176
5177 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005178 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005179 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005180 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005181 }
Wei Li340ee8e2022-03-18 17:33:24 -07005182 rule := testingModule.Rule("genProvenanceMetaData")
5183 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5184 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5185 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5186 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005187}
5188
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005189func TestPrebuiltApexName(t *testing.T) {
5190 testApex(t, `
5191 prebuilt_apex {
5192 name: "com.company.android.myapex",
5193 apex_name: "com.android.myapex",
5194 src: "company-myapex-arm.apex",
5195 }
5196 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5197
5198 testApex(t, `
5199 apex_set {
5200 name: "com.company.android.myapex",
5201 apex_name: "com.android.myapex",
5202 set: "company-myapex.apks",
5203 }
5204 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5205}
5206
5207func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5208 _ = android.GroupFixturePreparers(
5209 java.PrepareForTestWithJavaDefaultModules,
5210 PrepareForTestWithApexBuildComponents,
5211 android.FixtureWithRootAndroidBp(`
5212 platform_bootclasspath {
5213 name: "platform-bootclasspath",
5214 fragments: [
5215 {
5216 apex: "com.android.art",
5217 module: "art-bootclasspath-fragment",
5218 },
5219 ],
5220 }
5221
5222 prebuilt_apex {
5223 name: "com.company.android.art",
5224 apex_name: "com.android.art",
5225 src: "com.company.android.art-arm.apex",
5226 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5227 }
5228
5229 prebuilt_bootclasspath_fragment {
5230 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005231 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005232 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005233 hidden_api: {
5234 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5235 metadata: "my-bootclasspath-fragment/metadata.csv",
5236 index: "my-bootclasspath-fragment/index.csv",
5237 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5238 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5239 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005240 }
5241
5242 java_import {
5243 name: "core-oj",
5244 jars: ["prebuilt.jar"],
5245 }
5246 `),
5247 ).RunTest(t)
5248}
5249
Paul Duffin092153d2021-01-26 11:42:39 +00005250// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5251// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005252func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005253 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005254
Paul Duffin89886cb2021-02-05 16:44:03 +00005255 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005256 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005257 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005258 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005259 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005260 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005261 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5262 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5263 android.NormalizePathForTesting(dexJarBuildPath))
5264 }
5265
5266 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005267 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005268 // Make sure the import has been given the correct path to the dex jar.
5269 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5270 dexJarBuildPath := p.DexJarInstallPath()
5271 stem := android.RemoveOptionalPrebuiltPrefix(name)
5272 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5273 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5274 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005275 }
5276
Paul Duffin39853512021-02-26 11:09:39 +00005277 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005278 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005279 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005280 android.AssertArrayString(t, "Check if there is no source variant",
5281 []string{"android_common"},
5282 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005283 }
5284
5285 t.Run("prebuilt only", func(t *testing.T) {
5286 bp := `
5287 prebuilt_apex {
5288 name: "myapex",
5289 arch: {
5290 arm64: {
5291 src: "myapex-arm64.apex",
5292 },
5293 arm: {
5294 src: "myapex-arm.apex",
5295 },
5296 },
Paul Duffin39853512021-02-26 11:09:39 +00005297 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005298 }
5299
5300 java_import {
5301 name: "libfoo",
5302 jars: ["libfoo.jar"],
5303 }
Paul Duffin39853512021-02-26 11:09:39 +00005304
5305 java_sdk_library_import {
5306 name: "libbar",
5307 public: {
5308 jars: ["libbar.jar"],
5309 },
5310 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005311 `
5312
5313 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5314 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5315
Martin Stjernholm44825602021-09-17 01:44:12 +01005316 deapexerName := deapexerModuleName("myapex")
5317 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5318
Paul Duffinf6932af2021-02-26 18:21:56 +00005319 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005320 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005321 rule := deapexer.Rule("deapexer")
5322 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5323 t.Errorf("expected: %q, found: %q", expected, actual)
5324 }
5325
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005326 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005327 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005328 rule = prebuiltApex.Rule("android/soong/android.Cp")
5329 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5330 t.Errorf("expected: %q, found: %q", expected, actual)
5331 }
5332
Paul Duffin89886cb2021-02-05 16:44:03 +00005333 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005334 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005335
5336 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005337 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005338 })
5339
5340 t.Run("prebuilt with source preferred", func(t *testing.T) {
5341
5342 bp := `
5343 prebuilt_apex {
5344 name: "myapex",
5345 arch: {
5346 arm64: {
5347 src: "myapex-arm64.apex",
5348 },
5349 arm: {
5350 src: "myapex-arm.apex",
5351 },
5352 },
Paul Duffin39853512021-02-26 11:09:39 +00005353 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005354 }
5355
5356 java_import {
5357 name: "libfoo",
5358 jars: ["libfoo.jar"],
5359 }
5360
5361 java_library {
5362 name: "libfoo",
5363 }
Paul Duffin39853512021-02-26 11:09:39 +00005364
5365 java_sdk_library_import {
5366 name: "libbar",
5367 public: {
5368 jars: ["libbar.jar"],
5369 },
5370 }
5371
5372 java_sdk_library {
5373 name: "libbar",
5374 srcs: ["foo/bar/MyClass.java"],
5375 unsafe_ignore_missing_latest_api: true,
5376 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005377 `
5378
5379 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5380 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5381
Paul Duffin89886cb2021-02-05 16:44:03 +00005382 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005383 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005384 ensureNoSourceVariant(t, ctx, "libfoo")
5385
5386 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005387 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005388 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005389 })
5390
5391 t.Run("prebuilt preferred with source", func(t *testing.T) {
5392 bp := `
5393 prebuilt_apex {
5394 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005395 arch: {
5396 arm64: {
5397 src: "myapex-arm64.apex",
5398 },
5399 arm: {
5400 src: "myapex-arm.apex",
5401 },
5402 },
Paul Duffin39853512021-02-26 11:09:39 +00005403 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005404 }
5405
5406 java_import {
5407 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005408 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005409 jars: ["libfoo.jar"],
5410 }
5411
5412 java_library {
5413 name: "libfoo",
5414 }
Paul Duffin39853512021-02-26 11:09:39 +00005415
5416 java_sdk_library_import {
5417 name: "libbar",
5418 prefer: true,
5419 public: {
5420 jars: ["libbar.jar"],
5421 },
5422 }
5423
5424 java_sdk_library {
5425 name: "libbar",
5426 srcs: ["foo/bar/MyClass.java"],
5427 unsafe_ignore_missing_latest_api: true,
5428 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005429 `
5430
5431 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5432 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5433
Paul Duffin89886cb2021-02-05 16:44:03 +00005434 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005435 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005436 ensureNoSourceVariant(t, ctx, "libfoo")
5437
5438 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005439 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005440 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005441 })
5442}
5443
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005444func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005445 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005446 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005447 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5448 // is disabled.
5449 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5450 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005451
Paul Duffin37856732021-02-26 14:24:15 +00005452 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5453 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005454 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005455 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005456 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005457 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005458 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005459 foundLibfooJar = true
5460 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005461 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005462 }
5463 }
5464 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005465 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005466 }
5467 }
5468
Paul Duffin40a3f652021-07-19 13:11:24 +01005469 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005470 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005471 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005472 var rule android.TestingBuildParams
5473
5474 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5475 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005476 }
5477
Paul Duffin40a3f652021-07-19 13:11:24 +01005478 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5479 t.Helper()
5480 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5481 var rule android.TestingBuildParams
5482
5483 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5484 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5485 }
5486
Paul Duffin89f570a2021-06-16 01:42:33 +01005487 fragment := java.ApexVariantReference{
5488 Apex: proptools.StringPtr("myapex"),
5489 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5490 }
5491
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005492 t.Run("prebuilt only", func(t *testing.T) {
5493 bp := `
5494 prebuilt_apex {
5495 name: "myapex",
5496 arch: {
5497 arm64: {
5498 src: "myapex-arm64.apex",
5499 },
5500 arm: {
5501 src: "myapex-arm.apex",
5502 },
5503 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005504 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5505 }
5506
5507 prebuilt_bootclasspath_fragment {
5508 name: "my-bootclasspath-fragment",
5509 contents: ["libfoo", "libbar"],
5510 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005511 hidden_api: {
5512 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5513 metadata: "my-bootclasspath-fragment/metadata.csv",
5514 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005515 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5516 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5517 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005518 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005519 }
5520
5521 java_import {
5522 name: "libfoo",
5523 jars: ["libfoo.jar"],
5524 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005525 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005526 }
Paul Duffin37856732021-02-26 14:24:15 +00005527
5528 java_sdk_library_import {
5529 name: "libbar",
5530 public: {
5531 jars: ["libbar.jar"],
5532 },
5533 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005534 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005535 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005536 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005537 `
5538
Paul Duffin89f570a2021-06-16 01:42:33 +01005539 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005540 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5541 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005542
Paul Duffin537ea3d2021-05-14 10:38:00 +01005543 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005544 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005545 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005546 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005547 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005548 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005549 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005550 })
5551
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005552 t.Run("apex_set only", func(t *testing.T) {
5553 bp := `
5554 apex_set {
5555 name: "myapex",
5556 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005557 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005558 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005559 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5560 }
5561
5562 java_import {
5563 name: "myjavalib",
5564 jars: ["myjavalib.jar"],
5565 apex_available: ["myapex"],
5566 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005567 }
5568
5569 prebuilt_bootclasspath_fragment {
5570 name: "my-bootclasspath-fragment",
5571 contents: ["libfoo", "libbar"],
5572 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005573 hidden_api: {
5574 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5575 metadata: "my-bootclasspath-fragment/metadata.csv",
5576 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005577 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5578 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5579 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005580 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005581 }
5582
Liz Kammer2dc72442023-04-20 10:10:48 -04005583 prebuilt_systemserverclasspath_fragment {
5584 name: "my-systemserverclasspath-fragment",
5585 contents: ["libbaz"],
5586 apex_available: ["myapex"],
5587 }
5588
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005589 java_import {
5590 name: "libfoo",
5591 jars: ["libfoo.jar"],
5592 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005593 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005594 }
5595
5596 java_sdk_library_import {
5597 name: "libbar",
5598 public: {
5599 jars: ["libbar.jar"],
5600 },
5601 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005602 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005603 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005604 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005605
5606 java_sdk_library_import {
5607 name: "libbaz",
5608 public: {
5609 jars: ["libbaz.jar"],
5610 },
5611 apex_available: ["myapex"],
5612 shared_library: false,
5613 permitted_packages: ["baz"],
5614 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005615 `
5616
Paul Duffin89f570a2021-06-16 01:42:33 +01005617 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005618 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5619 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5620
Paul Duffin537ea3d2021-05-14 10:38:00 +01005621 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005622 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005623 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005624 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005625 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005626 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005627 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005628
5629 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5630
5631 overrideNames := []string{
5632 "",
5633 "myjavalib.myapex",
5634 "libfoo.myapex",
5635 "libbar.myapex",
5636 "libbaz.myapex",
5637 }
5638 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5639 for i, e := range mkEntries {
5640 g := e.OverrideName
5641 if w := overrideNames[i]; w != g {
5642 t.Errorf("Expected override name %q, got %q", w, g)
5643 }
5644 }
5645
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005646 })
5647
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005648 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5649 bp := `
5650 prebuilt_apex {
5651 name: "myapex",
5652 arch: {
5653 arm64: {
5654 src: "myapex-arm64.apex",
5655 },
5656 arm: {
5657 src: "myapex-arm.apex",
5658 },
5659 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005660 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5661 }
5662
5663 prebuilt_bootclasspath_fragment {
5664 name: "my-bootclasspath-fragment",
5665 contents: ["libfoo", "libbar"],
5666 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005667 hidden_api: {
5668 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5669 metadata: "my-bootclasspath-fragment/metadata.csv",
5670 index: "my-bootclasspath-fragment/index.csv",
5671 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5672 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5673 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005674 }
5675
5676 java_import {
5677 name: "libfoo",
5678 jars: ["libfoo.jar"],
5679 apex_available: ["myapex"],
5680 }
5681
5682 java_library {
5683 name: "libfoo",
5684 srcs: ["foo/bar/MyClass.java"],
5685 apex_available: ["myapex"],
5686 }
Paul Duffin37856732021-02-26 14:24:15 +00005687
5688 java_sdk_library_import {
5689 name: "libbar",
5690 public: {
5691 jars: ["libbar.jar"],
5692 },
5693 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005694 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005695 }
5696
5697 java_sdk_library {
5698 name: "libbar",
5699 srcs: ["foo/bar/MyClass.java"],
5700 unsafe_ignore_missing_latest_api: true,
5701 apex_available: ["myapex"],
5702 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005703 `
5704
5705 // In this test the source (java_library) libfoo is active since the
5706 // prebuilt (java_import) defaults to prefer:false. However the
5707 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5708 // find the dex boot jar in it. We either need to disable the source libfoo
5709 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005710 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005711 // dexbootjar check is skipped if AllowMissingDependencies is true
5712 preparerAllowMissingDeps := android.GroupFixturePreparers(
5713 preparer,
5714 android.PrepareForTestWithAllowMissingDependencies,
5715 )
5716 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005717 })
5718
5719 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5720 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005721 apex {
5722 name: "myapex",
5723 key: "myapex.key",
5724 updatable: false,
5725 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5726 }
5727
5728 apex_key {
5729 name: "myapex.key",
5730 public_key: "testkey.avbpubkey",
5731 private_key: "testkey.pem",
5732 }
5733
5734 bootclasspath_fragment {
5735 name: "my-bootclasspath-fragment",
5736 contents: ["libfoo", "libbar"],
5737 apex_available: ["myapex"],
5738 hidden_api: {
5739 split_packages: ["*"],
5740 },
5741 }
5742
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005743 prebuilt_apex {
5744 name: "myapex",
5745 arch: {
5746 arm64: {
5747 src: "myapex-arm64.apex",
5748 },
5749 arm: {
5750 src: "myapex-arm.apex",
5751 },
5752 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005753 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5754 }
5755
5756 prebuilt_bootclasspath_fragment {
5757 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005758 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005759 contents: ["libfoo", "libbar"],
5760 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005761 hidden_api: {
5762 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5763 metadata: "my-bootclasspath-fragment/metadata.csv",
5764 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005765 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5766 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5767 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005768 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005769 }
5770
5771 java_import {
5772 name: "libfoo",
5773 prefer: true,
5774 jars: ["libfoo.jar"],
5775 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005776 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005777 }
5778
5779 java_library {
5780 name: "libfoo",
5781 srcs: ["foo/bar/MyClass.java"],
5782 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005783 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005784 }
Paul Duffin37856732021-02-26 14:24:15 +00005785
5786 java_sdk_library_import {
5787 name: "libbar",
5788 prefer: true,
5789 public: {
5790 jars: ["libbar.jar"],
5791 },
5792 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005793 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005794 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005795 }
5796
5797 java_sdk_library {
5798 name: "libbar",
5799 srcs: ["foo/bar/MyClass.java"],
5800 unsafe_ignore_missing_latest_api: true,
5801 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005802 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005803 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005804 `
5805
Paul Duffin89f570a2021-06-16 01:42:33 +01005806 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005807 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5808 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005809
Paul Duffin537ea3d2021-05-14 10:38:00 +01005810 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005811 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005812 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005813 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005814 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005815 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005816 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005817 })
5818
5819 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5820 bp := `
5821 apex {
5822 name: "myapex",
5823 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005824 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005825 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005826 }
5827
5828 apex_key {
5829 name: "myapex.key",
5830 public_key: "testkey.avbpubkey",
5831 private_key: "testkey.pem",
5832 }
5833
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005834 bootclasspath_fragment {
5835 name: "my-bootclasspath-fragment",
5836 contents: ["libfoo", "libbar"],
5837 apex_available: ["myapex"],
5838 hidden_api: {
5839 split_packages: ["*"],
5840 },
5841 }
5842
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005843 prebuilt_apex {
5844 name: "myapex",
5845 arch: {
5846 arm64: {
5847 src: "myapex-arm64.apex",
5848 },
5849 arm: {
5850 src: "myapex-arm.apex",
5851 },
5852 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005853 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5854 }
5855
5856 prebuilt_bootclasspath_fragment {
5857 name: "my-bootclasspath-fragment",
5858 contents: ["libfoo", "libbar"],
5859 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005860 hidden_api: {
5861 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5862 metadata: "my-bootclasspath-fragment/metadata.csv",
5863 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005864 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5865 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5866 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005867 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005868 }
5869
5870 java_import {
5871 name: "libfoo",
5872 jars: ["libfoo.jar"],
5873 apex_available: ["myapex"],
5874 }
5875
5876 java_library {
5877 name: "libfoo",
5878 srcs: ["foo/bar/MyClass.java"],
5879 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005880 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005881 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005882 }
Paul Duffin37856732021-02-26 14:24:15 +00005883
5884 java_sdk_library_import {
5885 name: "libbar",
5886 public: {
5887 jars: ["libbar.jar"],
5888 },
5889 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005890 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005891 }
5892
5893 java_sdk_library {
5894 name: "libbar",
5895 srcs: ["foo/bar/MyClass.java"],
5896 unsafe_ignore_missing_latest_api: true,
5897 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005898 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005899 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005900 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005901 `
5902
Paul Duffin89f570a2021-06-16 01:42:33 +01005903 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005904 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5905 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005906
Paul Duffin537ea3d2021-05-14 10:38:00 +01005907 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005908 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005909 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5910 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005911 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5912 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005913 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005914 })
5915
5916 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5917 bp := `
5918 apex {
5919 name: "myapex",
5920 enabled: false,
5921 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005922 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005923 }
5924
5925 apex_key {
5926 name: "myapex.key",
5927 public_key: "testkey.avbpubkey",
5928 private_key: "testkey.pem",
5929 }
5930
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005931 bootclasspath_fragment {
5932 name: "my-bootclasspath-fragment",
5933 enabled: false,
5934 contents: ["libfoo", "libbar"],
5935 apex_available: ["myapex"],
5936 hidden_api: {
5937 split_packages: ["*"],
5938 },
5939 }
5940
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005941 prebuilt_apex {
5942 name: "myapex",
5943 arch: {
5944 arm64: {
5945 src: "myapex-arm64.apex",
5946 },
5947 arm: {
5948 src: "myapex-arm.apex",
5949 },
5950 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005951 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5952 }
5953
5954 prebuilt_bootclasspath_fragment {
5955 name: "my-bootclasspath-fragment",
5956 contents: ["libfoo", "libbar"],
5957 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005958 hidden_api: {
5959 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5960 metadata: "my-bootclasspath-fragment/metadata.csv",
5961 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005962 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5963 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5964 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005965 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005966 }
5967
5968 java_import {
5969 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005970 jars: ["libfoo.jar"],
5971 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005972 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005973 }
5974
5975 java_library {
5976 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005977 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005978 srcs: ["foo/bar/MyClass.java"],
5979 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005980 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005981 }
Paul Duffin37856732021-02-26 14:24:15 +00005982
5983 java_sdk_library_import {
5984 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005985 public: {
5986 jars: ["libbar.jar"],
5987 },
5988 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005989 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005990 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005991 }
5992
5993 java_sdk_library {
5994 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005995 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005996 srcs: ["foo/bar/MyClass.java"],
5997 unsafe_ignore_missing_latest_api: true,
5998 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005999 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006000 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006001 `
6002
Paul Duffin89f570a2021-06-16 01:42:33 +01006003 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006004 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6005 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006006
Paul Duffin537ea3d2021-05-14 10:38:00 +01006007 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006008 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006009 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006010 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006011 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006012 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006013 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006014 })
6015}
6016
Roland Levillain630846d2019-06-26 12:48:34 +01006017func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006018 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006019 apex_test {
6020 name: "myapex",
6021 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006022 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006023 tests: [
6024 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006025 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006026 ],
6027 }
6028
6029 apex_key {
6030 name: "myapex.key",
6031 public_key: "testkey.avbpubkey",
6032 private_key: "testkey.pem",
6033 }
6034
Liz Kammer1c14a212020-05-12 15:26:55 -07006035 filegroup {
6036 name: "fg",
6037 srcs: [
6038 "baz",
6039 "bar/baz"
6040 ],
6041 }
6042
Roland Levillain630846d2019-06-26 12:48:34 +01006043 cc_test {
6044 name: "mytest",
6045 gtest: false,
6046 srcs: ["mytest.cpp"],
6047 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006048 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006049 system_shared_libs: [],
6050 static_executable: true,
6051 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006052 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006053 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006054
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006055 cc_library {
6056 name: "mylib",
6057 srcs: ["mylib.cpp"],
6058 system_shared_libs: [],
6059 stl: "none",
6060 }
6061
Liz Kammer5bd365f2020-05-27 15:15:11 -07006062 filegroup {
6063 name: "fg2",
6064 srcs: [
6065 "testdata/baz"
6066 ],
6067 }
6068
Roland Levillain9b5fde92019-06-28 15:41:19 +01006069 cc_test {
6070 name: "mytests",
6071 gtest: false,
6072 srcs: [
6073 "mytest1.cpp",
6074 "mytest2.cpp",
6075 "mytest3.cpp",
6076 ],
6077 test_per_src: true,
6078 relative_install_path: "test",
6079 system_shared_libs: [],
6080 static_executable: true,
6081 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006082 data: [
6083 ":fg",
6084 ":fg2",
6085 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006086 }
Roland Levillain630846d2019-06-26 12:48:34 +01006087 `)
6088
Jooyung Hana0503a52023-08-23 13:12:50 +09006089 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006090 copyCmds := apexRule.Args["copy_commands"]
6091
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006092 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006093 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006094 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006095
Liz Kammer1c14a212020-05-12 15:26:55 -07006096 //Ensure that test data are copied into apex.
6097 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6098 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6099
Roland Levillain9b5fde92019-06-28 15:41:19 +01006100 // Ensure that test deps built with `test_per_src` are copied into apex.
6101 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6102 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6103 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006104
6105 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006106 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006107 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006108 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006109 prefix := "TARGET_"
6110 var builder strings.Builder
6111 data.Custom(&builder, name, prefix, "", data)
6112 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006113 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6114 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6115 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6116 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006117 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006118}
6119
Jooyung Hand48f3c32019-08-23 11:18:57 +09006120func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6121 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6122 apex {
6123 name: "myapex",
6124 key: "myapex.key",
6125 native_shared_libs: ["libfoo"],
6126 }
6127
6128 apex_key {
6129 name: "myapex.key",
6130 public_key: "testkey.avbpubkey",
6131 private_key: "testkey.pem",
6132 }
6133
6134 cc_library {
6135 name: "libfoo",
6136 stl: "none",
6137 system_shared_libs: [],
6138 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006139 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006140 }
6141 `)
6142 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6143 apex {
6144 name: "myapex",
6145 key: "myapex.key",
6146 java_libs: ["myjar"],
6147 }
6148
6149 apex_key {
6150 name: "myapex.key",
6151 public_key: "testkey.avbpubkey",
6152 private_key: "testkey.pem",
6153 }
6154
6155 java_library {
6156 name: "myjar",
6157 srcs: ["foo/bar/MyClass.java"],
6158 sdk_version: "none",
6159 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006160 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006161 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006162 }
6163 `)
6164}
6165
Bill Peckhama41a6962021-01-11 10:58:54 -08006166func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006167 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006168 apex {
6169 name: "myapex",
6170 key: "myapex.key",
6171 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006172 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006173 }
6174
6175 apex_key {
6176 name: "myapex.key",
6177 public_key: "testkey.avbpubkey",
6178 private_key: "testkey.pem",
6179 }
6180
6181 java_import {
6182 name: "myjavaimport",
6183 apex_available: ["myapex"],
6184 jars: ["my.jar"],
6185 compile_dex: true,
6186 }
6187 `)
6188
Jooyung Hana0503a52023-08-23 13:12:50 +09006189 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006190 apexRule := module.Rule("apexRule")
6191 copyCmds := apexRule.Args["copy_commands"]
6192 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6193}
6194
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006195func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006196 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006197 apex {
6198 name: "myapex",
6199 key: "myapex.key",
6200 apps: [
6201 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006202 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006203 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006204 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006205 }
6206
6207 apex_key {
6208 name: "myapex.key",
6209 public_key: "testkey.avbpubkey",
6210 private_key: "testkey.pem",
6211 }
6212
6213 android_app {
6214 name: "AppFoo",
6215 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006216 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006217 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006218 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006219 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006220 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006221 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006222
6223 android_app {
6224 name: "AppFooPriv",
6225 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006226 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006227 system_modules: "none",
6228 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006229 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006230 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006231 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006232 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006233
6234 cc_library_shared {
6235 name: "libjni",
6236 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006237 shared_libs: ["libfoo"],
6238 stl: "none",
6239 system_shared_libs: [],
6240 apex_available: [ "myapex" ],
6241 sdk_version: "current",
6242 }
6243
6244 cc_library_shared {
6245 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006246 stl: "none",
6247 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006248 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006249 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006250 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006251 `)
6252
Jooyung Hana0503a52023-08-23 13:12:50 +09006253 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006254 apexRule := module.Rule("apexRule")
6255 copyCmds := apexRule.Args["copy_commands"]
6256
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006257 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6258 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006259 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006260
Colin Crossaede88c2020-08-11 12:17:01 -07006261 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006262 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006263 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006264 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006265 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006266 // JNI libraries including transitive deps are
6267 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006268 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006269 // ... embedded inside APK (jnilibs.zip)
6270 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6271 // ... and not directly inside the APEX
6272 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6273 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006274
6275 apexBundle := module.Module().(*apexBundle)
6276 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6277 var builder strings.Builder
6278 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6279 androidMk := builder.String()
6280 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6281 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6282 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6283 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6284 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6285 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Dario Frenicde2a032019-10-27 00:29:22 +01006286}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006287
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006288func TestApexWithAppImportBuildId(t *testing.T) {
6289 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6290 for _, id := range invalidBuildIds {
6291 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6292 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6293 variables.BuildId = proptools.StringPtr(id)
6294 })
6295 testApexError(t, message, `apex {
6296 name: "myapex",
6297 key: "myapex.key",
6298 apps: ["AppFooPrebuilt"],
6299 updatable: false,
6300 }
6301
6302 apex_key {
6303 name: "myapex.key",
6304 public_key: "testkey.avbpubkey",
6305 private_key: "testkey.pem",
6306 }
6307
6308 android_app_import {
6309 name: "AppFooPrebuilt",
6310 apk: "PrebuiltAppFoo.apk",
6311 presigned: true,
6312 apex_available: ["myapex"],
6313 }
6314 `, fixture)
6315 }
6316}
6317
Dario Frenicde2a032019-10-27 00:29:22 +01006318func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006319 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006320 apex {
6321 name: "myapex",
6322 key: "myapex.key",
6323 apps: [
6324 "AppFooPrebuilt",
6325 "AppFooPrivPrebuilt",
6326 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006327 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006328 }
6329
6330 apex_key {
6331 name: "myapex.key",
6332 public_key: "testkey.avbpubkey",
6333 private_key: "testkey.pem",
6334 }
6335
6336 android_app_import {
6337 name: "AppFooPrebuilt",
6338 apk: "PrebuiltAppFoo.apk",
6339 presigned: true,
6340 dex_preopt: {
6341 enabled: false,
6342 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006343 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006344 }
6345
6346 android_app_import {
6347 name: "AppFooPrivPrebuilt",
6348 apk: "PrebuiltAppFooPriv.apk",
6349 privileged: true,
6350 presigned: true,
6351 dex_preopt: {
6352 enabled: false,
6353 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006354 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006355 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006356 }
6357 `)
6358
Jooyung Hana0503a52023-08-23 13:12:50 +09006359 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006360 apexRule := module.Rule("apexRule")
6361 copyCmds := apexRule.Args["copy_commands"]
6362
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006363 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6364 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006365}
6366
6367func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006368 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006369 apex {
6370 name: "myapex",
6371 key: "myapex.key",
6372 apps: [
6373 "AppFoo",
6374 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006375 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006376 }
6377
6378 apex_key {
6379 name: "myapex.key",
6380 public_key: "testkey.avbpubkey",
6381 private_key: "testkey.pem",
6382 }
6383
6384 android_app {
6385 name: "AppFoo",
6386 srcs: ["foo/bar/MyClass.java"],
6387 sdk_version: "none",
6388 system_modules: "none",
6389 apex_available: [ "myapex" ],
6390 }
6391
6392 android_app_import {
6393 name: "AppFoo",
6394 apk: "AppFooPrebuilt.apk",
6395 filename: "AppFooPrebuilt.apk",
6396 presigned: true,
6397 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006398 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006399 }
6400 `, withFiles(map[string][]byte{
6401 "AppFooPrebuilt.apk": nil,
6402 }))
6403
Jooyung Hana0503a52023-08-23 13:12:50 +09006404 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006405 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006406 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006407}
6408
Dario Freni6f3937c2019-12-20 22:58:03 +00006409func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006410 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006411 apex {
6412 name: "myapex",
6413 key: "myapex.key",
6414 apps: [
6415 "TesterHelpAppFoo",
6416 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006417 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006418 }
6419
6420 apex_key {
6421 name: "myapex.key",
6422 public_key: "testkey.avbpubkey",
6423 private_key: "testkey.pem",
6424 }
6425
6426 android_test_helper_app {
6427 name: "TesterHelpAppFoo",
6428 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006429 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006430 }
6431
6432 `)
6433
Jooyung Hana0503a52023-08-23 13:12:50 +09006434 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006435 apexRule := module.Rule("apexRule")
6436 copyCmds := apexRule.Args["copy_commands"]
6437
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006438 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006439}
6440
Jooyung Han18020ea2019-11-13 10:50:48 +09006441func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6442 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006443 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006444 apex {
6445 name: "myapex",
6446 key: "myapex.key",
6447 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006448 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006449 }
6450
6451 apex_key {
6452 name: "myapex.key",
6453 public_key: "testkey.avbpubkey",
6454 private_key: "testkey.pem",
6455 }
6456
6457 apex {
6458 name: "otherapex",
6459 key: "myapex.key",
6460 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006461 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006462 }
6463
6464 cc_defaults {
6465 name: "libfoo-defaults",
6466 apex_available: ["otherapex"],
6467 }
6468
6469 cc_library {
6470 name: "libfoo",
6471 defaults: ["libfoo-defaults"],
6472 stl: "none",
6473 system_shared_libs: [],
6474 }`)
6475}
6476
Paul Duffine52e66f2020-03-30 17:54:29 +01006477func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006478 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006479 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006480 apex {
6481 name: "myapex",
6482 key: "myapex.key",
6483 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006484 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006485 }
6486
6487 apex_key {
6488 name: "myapex.key",
6489 public_key: "testkey.avbpubkey",
6490 private_key: "testkey.pem",
6491 }
6492
6493 apex {
6494 name: "otherapex",
6495 key: "otherapex.key",
6496 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006497 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006498 }
6499
6500 apex_key {
6501 name: "otherapex.key",
6502 public_key: "testkey.avbpubkey",
6503 private_key: "testkey.pem",
6504 }
6505
6506 cc_library {
6507 name: "libfoo",
6508 stl: "none",
6509 system_shared_libs: [],
6510 apex_available: ["otherapex"],
6511 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006512}
Jiyong Park127b40b2019-09-30 16:04:35 +09006513
Paul Duffine52e66f2020-03-30 17:54:29 +01006514func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006515 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006516 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006517.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006518.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006519.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006520.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006521.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006522.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006523 apex {
6524 name: "myapex",
6525 key: "myapex.key",
6526 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006527 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006528 }
6529
6530 apex_key {
6531 name: "myapex.key",
6532 public_key: "testkey.avbpubkey",
6533 private_key: "testkey.pem",
6534 }
6535
Jiyong Park127b40b2019-09-30 16:04:35 +09006536 cc_library {
6537 name: "libfoo",
6538 stl: "none",
6539 shared_libs: ["libbar"],
6540 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006541 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006542 }
6543
6544 cc_library {
6545 name: "libbar",
6546 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006547 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006548 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006549 apex_available: ["myapex"],
6550 }
6551
6552 cc_library {
6553 name: "libbaz",
6554 stl: "none",
6555 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006556 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006557}
Jiyong Park127b40b2019-09-30 16:04:35 +09006558
Liz Kammer5f108fa2023-05-11 14:33:17 -04006559func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6560 testApex(t, `
6561 apex {
6562 name: "myapex",
6563 key: "myapex.key",
6564 native_shared_libs: ["libfoo"],
6565 updatable: false,
6566 }
6567
6568 apex_key {
6569 name: "myapex.key",
6570 public_key: "testkey.avbpubkey",
6571 private_key: "testkey.pem",
6572 }
6573
6574 cc_library {
6575 name: "libfoo",
6576 stl: "none",
6577 static_libs: ["libbar"],
6578 system_shared_libs: [],
6579 apex_available: ["myapex"],
6580 }
6581
6582 cc_library {
6583 name: "libbar",
6584 stl: "none",
6585 shared_libs: ["libbaz"],
6586 system_shared_libs: [],
6587 apex_available: ["myapex"],
6588 }
6589
6590 cc_library {
6591 name: "libbaz",
6592 stl: "none",
6593 system_shared_libs: [],
6594 }`)
6595
6596 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6597 apex {
6598 name: "myapex",
6599 key: "myapex.key",
6600 native_shared_libs: ["libfoo"],
6601 updatable: false,
6602 }
6603
6604 apex_key {
6605 name: "myapex.key",
6606 public_key: "testkey.avbpubkey",
6607 private_key: "testkey.pem",
6608 }
6609
6610 cc_library {
6611 name: "libfoo",
6612 stl: "none",
6613 static_libs: ["libbar"],
6614 system_shared_libs: [],
6615 apex_available: ["myapex"],
6616 }
6617
6618 cc_library {
6619 name: "libbar",
6620 stl: "none",
6621 system_shared_libs: [],
6622 }`)
6623}
6624
Paul Duffine52e66f2020-03-30 17:54:29 +01006625func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006626 testApexError(t, "\"otherapex\" is not a valid module name", `
6627 apex {
6628 name: "myapex",
6629 key: "myapex.key",
6630 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006631 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006632 }
6633
6634 apex_key {
6635 name: "myapex.key",
6636 public_key: "testkey.avbpubkey",
6637 private_key: "testkey.pem",
6638 }
6639
6640 cc_library {
6641 name: "libfoo",
6642 stl: "none",
6643 system_shared_libs: [],
6644 apex_available: ["otherapex"],
6645 }`)
6646
Paul Duffine52e66f2020-03-30 17:54:29 +01006647 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006648 apex {
6649 name: "myapex",
6650 key: "myapex.key",
6651 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006652 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006653 }
6654
6655 apex_key {
6656 name: "myapex.key",
6657 public_key: "testkey.avbpubkey",
6658 private_key: "testkey.pem",
6659 }
6660
6661 cc_library {
6662 name: "libfoo",
6663 stl: "none",
6664 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006665 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006666 apex_available: ["myapex"],
6667 }
6668
6669 cc_library {
6670 name: "libbar",
6671 stl: "none",
6672 system_shared_libs: [],
6673 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006674 }
6675
6676 cc_library {
6677 name: "libbaz",
6678 stl: "none",
6679 system_shared_libs: [],
6680 stubs: {
6681 versions: ["10", "20", "30"],
6682 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006683 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006684}
Jiyong Park127b40b2019-09-30 16:04:35 +09006685
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006686func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6687 t.Run("negative variant_version produces error", func(t *testing.T) {
6688 testApexError(t, "expected an integer between 0-9; got -1", `
6689 apex {
6690 name: "myapex",
6691 key: "myapex.key",
6692 apex_available_name: "com.android.foo",
6693 variant_version: "-1",
6694 updatable: false,
6695 }
6696 apex_key {
6697 name: "myapex.key",
6698 public_key: "testkey.avbpubkey",
6699 private_key: "testkey.pem",
6700 }
6701 `)
6702 })
6703
6704 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6705 testApexError(t, "expected an integer between 0-9; got 10", `
6706 apex {
6707 name: "myapex",
6708 key: "myapex.key",
6709 apex_available_name: "com.android.foo",
6710 variant_version: "10",
6711 updatable: false,
6712 }
6713 apex_key {
6714 name: "myapex.key",
6715 public_key: "testkey.avbpubkey",
6716 private_key: "testkey.pem",
6717 }
6718 `)
6719 })
6720}
6721
6722func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6723 context := android.GroupFixturePreparers(
6724 android.PrepareForIntegrationTestWithAndroid,
6725 PrepareForTestWithApexBuildComponents,
6726 android.FixtureMergeMockFs(android.MockFS{
6727 "system/sepolicy/apex/foo-file_contexts": nil,
6728 "system/sepolicy/apex/bar-file_contexts": nil,
6729 }),
6730 )
6731 result := context.RunTestWithBp(t, `
6732 apex {
6733 name: "foo",
6734 key: "myapex.key",
6735 apex_available_name: "com.android.foo",
6736 variant_version: "0",
6737 updatable: false,
6738 }
6739 apex {
6740 name: "bar",
6741 key: "myapex.key",
6742 apex_available_name: "com.android.foo",
6743 variant_version: "3",
6744 updatable: false,
6745 }
6746 apex_key {
6747 name: "myapex.key",
6748 public_key: "testkey.avbpubkey",
6749 private_key: "testkey.pem",
6750 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006751 override_apex {
6752 name: "myoverrideapex",
6753 base: "bar",
6754 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006755 `)
6756
Jooyung Hana0503a52023-08-23 13:12:50 +09006757 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006758 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6759 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6760 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6761 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6762 }
6763
Jooyung Hana0503a52023-08-23 13:12:50 +09006764 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006765 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6766 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6767 barActualDefaultVersion := barManifestRule.Args["default_version"]
6768 if barActualDefaultVersion != barExpectedDefaultVersion {
6769 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6770 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006771
Jooyung Hana0503a52023-08-23 13:12:50 +09006772 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006773 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6774 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6775 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6776 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006777}
6778
Sam Delmericoca816532023-06-02 14:09:50 -04006779func TestApexAvailable_ApexAvailableName(t *testing.T) {
6780 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6781 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6782 apex {
6783 name: "myapex_sminus",
6784 key: "myapex.key",
6785 apps: ["AppFoo"],
6786 apex_available_name: "myapex",
6787 updatable: false,
6788 }
6789 apex {
6790 name: "myapex",
6791 key: "myapex.key",
6792 apps: ["AppFoo"],
6793 updatable: false,
6794 }
6795 apex_key {
6796 name: "myapex.key",
6797 public_key: "testkey.avbpubkey",
6798 private_key: "testkey.pem",
6799 }
6800 android_app {
6801 name: "AppFoo",
6802 srcs: ["foo/bar/MyClass.java"],
6803 sdk_version: "none",
6804 system_modules: "none",
6805 apex_available: [ "myapex_sminus" ],
6806 }`,
6807 android.FixtureMergeMockFs(android.MockFS{
6808 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6809 }),
6810 )
6811 })
6812
6813 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6814 testApex(t, `
6815 apex {
6816 name: "myapex_sminus",
6817 key: "myapex.key",
6818 apps: ["AppFoo"],
6819 apex_available_name: "myapex",
6820 updatable: false,
6821 }
6822 apex {
6823 name: "myapex",
6824 key: "myapex.key",
6825 apps: ["AppFoo"],
6826 updatable: false,
6827 }
6828 apex_key {
6829 name: "myapex.key",
6830 public_key: "testkey.avbpubkey",
6831 private_key: "testkey.pem",
6832 }
6833 android_app {
6834 name: "AppFoo",
6835 srcs: ["foo/bar/MyClass.java"],
6836 sdk_version: "none",
6837 system_modules: "none",
6838 apex_available: [ "myapex" ],
6839 }`,
6840 android.FixtureMergeMockFs(android.MockFS{
6841 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6842 }),
6843 )
6844 })
6845
6846 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6847 testApex(t, `
6848 override_apex {
6849 name: "myoverrideapex_sminus",
6850 base: "myapex_sminus",
6851 key: "myapex.key",
6852 apps: ["AppFooOverride"],
6853 }
6854 override_apex {
6855 name: "myoverrideapex",
6856 base: "myapex",
6857 key: "myapex.key",
6858 apps: ["AppFooOverride"],
6859 }
6860 apex {
6861 name: "myapex_sminus",
6862 key: "myapex.key",
6863 apps: ["AppFoo"],
6864 apex_available_name: "myapex",
6865 updatable: false,
6866 }
6867 apex {
6868 name: "myapex",
6869 key: "myapex.key",
6870 apps: ["AppFoo"],
6871 updatable: false,
6872 }
6873 apex_key {
6874 name: "myapex.key",
6875 public_key: "testkey.avbpubkey",
6876 private_key: "testkey.pem",
6877 }
6878 android_app {
6879 name: "AppFooOverride",
6880 srcs: ["foo/bar/MyClass.java"],
6881 sdk_version: "none",
6882 system_modules: "none",
6883 apex_available: [ "myapex" ],
6884 }
6885 android_app {
6886 name: "AppFoo",
6887 srcs: ["foo/bar/MyClass.java"],
6888 sdk_version: "none",
6889 system_modules: "none",
6890 apex_available: [ "myapex" ],
6891 }`,
6892 android.FixtureMergeMockFs(android.MockFS{
6893 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6894 }),
6895 )
6896 })
6897}
6898
6899func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6900 context := android.GroupFixturePreparers(
6901 android.PrepareForIntegrationTestWithAndroid,
6902 PrepareForTestWithApexBuildComponents,
6903 java.PrepareForTestWithDexpreopt,
6904 android.FixtureMergeMockFs(android.MockFS{
6905 "system/sepolicy/apex/myapex-file_contexts": nil,
6906 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6907 }),
6908 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6909 variables.BuildId = proptools.StringPtr("buildid")
6910 }),
6911 )
6912 context.RunTestWithBp(t, `
6913 override_apex {
6914 name: "myoverrideapex_sminus",
6915 base: "myapex_sminus",
6916 }
6917 override_apex {
6918 name: "myoverrideapex",
6919 base: "myapex",
6920 }
6921 apex {
6922 name: "myapex",
6923 key: "myapex.key",
6924 apps: ["AppFoo"],
6925 updatable: false,
6926 }
6927 apex {
6928 name: "myapex_sminus",
6929 apex_available_name: "myapex",
6930 key: "myapex.key",
6931 apps: ["AppFoo_sminus"],
6932 updatable: false,
6933 }
6934 apex_key {
6935 name: "myapex.key",
6936 public_key: "testkey.avbpubkey",
6937 private_key: "testkey.pem",
6938 }
6939 android_app {
6940 name: "AppFoo",
6941 srcs: ["foo/bar/MyClass.java"],
6942 sdk_version: "none",
6943 system_modules: "none",
6944 apex_available: [ "myapex" ],
6945 }
6946 android_app {
6947 name: "AppFoo_sminus",
6948 srcs: ["foo/bar/MyClass.java"],
6949 sdk_version: "none",
6950 min_sdk_version: "29",
6951 system_modules: "none",
6952 apex_available: [ "myapex" ],
6953 }`)
6954}
6955
Jiyong Park89e850a2020-04-07 16:37:39 +09006956func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006957 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006958 apex {
6959 name: "myapex",
6960 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006961 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006962 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006963 }
6964
6965 apex_key {
6966 name: "myapex.key",
6967 public_key: "testkey.avbpubkey",
6968 private_key: "testkey.pem",
6969 }
6970
6971 cc_library {
6972 name: "libfoo",
6973 stl: "none",
6974 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006975 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006976 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006977 }
6978
6979 cc_library {
6980 name: "libfoo2",
6981 stl: "none",
6982 system_shared_libs: [],
6983 shared_libs: ["libbaz"],
6984 apex_available: ["//apex_available:platform"],
6985 }
6986
6987 cc_library {
6988 name: "libbar",
6989 stl: "none",
6990 system_shared_libs: [],
6991 apex_available: ["myapex"],
6992 }
6993
6994 cc_library {
6995 name: "libbaz",
6996 stl: "none",
6997 system_shared_libs: [],
6998 apex_available: ["myapex"],
6999 stubs: {
7000 versions: ["1"],
7001 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007002 }`)
7003
Jiyong Park89e850a2020-04-07 16:37:39 +09007004 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7005 // because it depends on libbar which isn't available to platform
7006 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7007 if libfoo.NotAvailableForPlatform() != true {
7008 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7009 }
7010
7011 // libfoo2 however can be available to platform because it depends on libbaz which provides
7012 // stubs
7013 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7014 if libfoo2.NotAvailableForPlatform() == true {
7015 t.Errorf("%q should be available to platform", libfoo2.String())
7016 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007017}
Jiyong Parka90ca002019-10-07 15:47:24 +09007018
Paul Duffine52e66f2020-03-30 17:54:29 +01007019func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007020 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007021 apex {
7022 name: "myapex",
7023 key: "myapex.key",
7024 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007025 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007026 }
7027
7028 apex_key {
7029 name: "myapex.key",
7030 public_key: "testkey.avbpubkey",
7031 private_key: "testkey.pem",
7032 }
7033
7034 cc_library {
7035 name: "libfoo",
7036 stl: "none",
7037 system_shared_libs: [],
7038 apex_available: ["myapex"],
7039 static: {
7040 apex_available: ["//apex_available:platform"],
7041 },
7042 }`)
7043
Jiyong Park89e850a2020-04-07 16:37:39 +09007044 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7045 if libfooShared.NotAvailableForPlatform() != true {
7046 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7047 }
7048 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7049 if libfooStatic.NotAvailableForPlatform() != false {
7050 t.Errorf("%q should be available to platform", libfooStatic.String())
7051 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007052}
7053
Jiyong Park5d790c32019-11-15 18:40:32 +09007054func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007055 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007056 apex {
7057 name: "myapex",
7058 key: "myapex.key",
7059 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007060 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007061 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007062 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007063 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007064 }
7065
7066 override_apex {
7067 name: "override_myapex",
7068 base: "myapex",
7069 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007070 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007071 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007072 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007073 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007074 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007075 key: "mynewapex.key",
7076 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007077 }
7078
7079 apex_key {
7080 name: "myapex.key",
7081 public_key: "testkey.avbpubkey",
7082 private_key: "testkey.pem",
7083 }
7084
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007085 apex_key {
7086 name: "mynewapex.key",
7087 public_key: "testkey2.avbpubkey",
7088 private_key: "testkey2.pem",
7089 }
7090
7091 android_app_certificate {
7092 name: "myapex.certificate",
7093 certificate: "testkey",
7094 }
7095
Jiyong Park5d790c32019-11-15 18:40:32 +09007096 android_app {
7097 name: "app",
7098 srcs: ["foo/bar/MyClass.java"],
7099 package_name: "foo",
7100 sdk_version: "none",
7101 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007102 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007103 }
7104
7105 override_android_app {
7106 name: "override_app",
7107 base: "app",
7108 package_name: "bar",
7109 }
markchien7c803b82021-08-26 22:10:06 +08007110
7111 bpf {
7112 name: "bpf",
7113 srcs: ["bpf.c"],
7114 }
7115
7116 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007117 name: "overrideBpf",
7118 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007119 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007120
7121 prebuilt_etc {
7122 name: "myetc",
7123 src: "myprebuilt",
7124 }
7125
7126 prebuilt_etc {
7127 name: "override_myetc",
7128 src: "override_myprebuilt",
7129 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007130 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007131
Jooyung Hana0503a52023-08-23 13:12:50 +09007132 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7133 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007134 if originalVariant.GetOverriddenBy() != "" {
7135 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7136 }
7137 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7138 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7139 }
7140
Jooyung Hana0503a52023-08-23 13:12:50 +09007141 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007142 apexRule := module.Rule("apexRule")
7143 copyCmds := apexRule.Args["copy_commands"]
7144
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007145 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7146 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007147
markchien7c803b82021-08-26 22:10:06 +08007148 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007149 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007150
Daniel Norman5a3ce132021-08-26 15:44:43 -07007151 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7152 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7153
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007154 apexBundle := module.Module().(*apexBundle)
7155 name := apexBundle.Name()
7156 if name != "override_myapex" {
7157 t.Errorf("name should be \"override_myapex\", but was %q", name)
7158 }
7159
Baligh Uddin004d7172020-02-19 21:29:28 -08007160 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7161 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7162 }
7163
Jiyong Park20bacab2020-03-03 11:45:41 +09007164 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007165 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007166 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7167
7168 signApkRule := module.Rule("signapk")
7169 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007170
Colin Crossaa255532020-07-03 13:18:24 -07007171 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007172 var builder strings.Builder
7173 data.Custom(&builder, name, "TARGET_", "", data)
7174 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007175 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7176 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007177 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007178 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007179 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007180 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007181 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007182 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007183}
7184
Albert Martineefabcf2022-03-21 20:11:16 +00007185func TestMinSdkVersionOverride(t *testing.T) {
7186 // Override from 29 to 31
7187 minSdkOverride31 := "31"
7188 ctx := testApex(t, `
7189 apex {
7190 name: "myapex",
7191 key: "myapex.key",
7192 native_shared_libs: ["mylib"],
7193 updatable: true,
7194 min_sdk_version: "29"
7195 }
7196
7197 override_apex {
7198 name: "override_myapex",
7199 base: "myapex",
7200 logging_parent: "com.foo.bar",
7201 package_name: "test.overridden.package"
7202 }
7203
7204 apex_key {
7205 name: "myapex.key",
7206 public_key: "testkey.avbpubkey",
7207 private_key: "testkey.pem",
7208 }
7209
7210 cc_library {
7211 name: "mylib",
7212 srcs: ["mylib.cpp"],
7213 runtime_libs: ["libbar"],
7214 system_shared_libs: [],
7215 stl: "none",
7216 apex_available: [ "myapex" ],
7217 min_sdk_version: "apex_inherit"
7218 }
7219
7220 cc_library {
7221 name: "libbar",
7222 srcs: ["mylib.cpp"],
7223 system_shared_libs: [],
7224 stl: "none",
7225 apex_available: [ "myapex" ],
7226 min_sdk_version: "apex_inherit"
7227 }
7228
7229 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7230
Jooyung Hana0503a52023-08-23 13:12:50 +09007231 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007232 copyCmds := apexRule.Args["copy_commands"]
7233
7234 // Ensure that direct non-stubs dep is always included
7235 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7236
7237 // Ensure that runtime_libs dep in included
7238 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7239
7240 // Ensure libraries target overridden min_sdk_version value
7241 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7242}
7243
7244func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7245 // Attempt to override from 31 to 29, should be a NOOP
7246 minSdkOverride29 := "29"
7247 ctx := testApex(t, `
7248 apex {
7249 name: "myapex",
7250 key: "myapex.key",
7251 native_shared_libs: ["mylib"],
7252 updatable: true,
7253 min_sdk_version: "31"
7254 }
7255
7256 override_apex {
7257 name: "override_myapex",
7258 base: "myapex",
7259 logging_parent: "com.foo.bar",
7260 package_name: "test.overridden.package"
7261 }
7262
7263 apex_key {
7264 name: "myapex.key",
7265 public_key: "testkey.avbpubkey",
7266 private_key: "testkey.pem",
7267 }
7268
7269 cc_library {
7270 name: "mylib",
7271 srcs: ["mylib.cpp"],
7272 runtime_libs: ["libbar"],
7273 system_shared_libs: [],
7274 stl: "none",
7275 apex_available: [ "myapex" ],
7276 min_sdk_version: "apex_inherit"
7277 }
7278
7279 cc_library {
7280 name: "libbar",
7281 srcs: ["mylib.cpp"],
7282 system_shared_libs: [],
7283 stl: "none",
7284 apex_available: [ "myapex" ],
7285 min_sdk_version: "apex_inherit"
7286 }
7287
7288 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7289
Jooyung Hana0503a52023-08-23 13:12:50 +09007290 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007291 copyCmds := apexRule.Args["copy_commands"]
7292
7293 // Ensure that direct non-stubs dep is always included
7294 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7295
7296 // Ensure that runtime_libs dep in included
7297 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7298
7299 // Ensure libraries target the original min_sdk_version value rather than the overridden
7300 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7301}
7302
Jooyung Han214bf372019-11-12 13:03:50 +09007303func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007304 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007305 apex {
7306 name: "myapex",
7307 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007308 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007309 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007310 }
7311
7312 apex_key {
7313 name: "myapex.key",
7314 public_key: "testkey.avbpubkey",
7315 private_key: "testkey.pem",
7316 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007317
7318 cc_library {
7319 name: "mylib",
7320 srcs: ["mylib.cpp"],
7321 stl: "libc++",
7322 system_shared_libs: [],
7323 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007324 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007325 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007326 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007327
Jooyung Hana0503a52023-08-23 13:12:50 +09007328 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007329 args := module.Rule("apexRule").Args
7330 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007331 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007332
7333 // The copies of the libraries in the apex should have one more dependency than
7334 // the ones outside the apex, namely the unwinder. Ideally we should check
7335 // the dependency names directly here but for some reason the names are blank in
7336 // this test.
7337 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007338 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007339 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7340 if len(apexImplicits) != len(nonApexImplicits)+1 {
7341 t.Errorf("%q missing unwinder dep", lib)
7342 }
7343 }
Jooyung Han214bf372019-11-12 13:03:50 +09007344}
7345
Paul Duffine05480a2021-03-08 15:07:14 +00007346var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007347 "api/current.txt": nil,
7348 "api/removed.txt": nil,
7349 "api/system-current.txt": nil,
7350 "api/system-removed.txt": nil,
7351 "api/test-current.txt": nil,
7352 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007353
Anton Hanssondff2c782020-12-21 17:10:01 +00007354 "100/public/api/foo.txt": nil,
7355 "100/public/api/foo-removed.txt": nil,
7356 "100/system/api/foo.txt": nil,
7357 "100/system/api/foo-removed.txt": nil,
7358
Paul Duffineedc5d52020-06-12 17:46:39 +01007359 // For java_sdk_library_import
7360 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007361}
7362
Jooyung Han58f26ab2019-12-18 15:34:32 +09007363func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007364 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007365 apex {
7366 name: "myapex",
7367 key: "myapex.key",
7368 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007369 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007370 }
7371
7372 apex_key {
7373 name: "myapex.key",
7374 public_key: "testkey.avbpubkey",
7375 private_key: "testkey.pem",
7376 }
7377
7378 java_sdk_library {
7379 name: "foo",
7380 srcs: ["a.java"],
7381 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007382 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007383 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007384
7385 prebuilt_apis {
7386 name: "sdk",
7387 api_dirs: ["100"],
7388 }
Paul Duffin9b879592020-05-26 13:21:35 +01007389 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007390
7391 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007392 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007393 "javalib/foo.jar",
7394 "etc/permissions/foo.xml",
7395 })
7396 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007397 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007398 ensureMatches(t, sdkLibrary.RuleParams.Command, `<library\\n\s+name=\\\"foo\\\"\\n\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09007399}
7400
Paul Duffin9b879592020-05-26 13:21:35 +01007401func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007402 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007403 apex {
7404 name: "myapex",
7405 key: "myapex.key",
7406 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007407 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007408 }
7409
7410 apex_key {
7411 name: "myapex.key",
7412 public_key: "testkey.avbpubkey",
7413 private_key: "testkey.pem",
7414 }
7415
7416 java_sdk_library {
7417 name: "foo",
7418 srcs: ["a.java"],
7419 api_packages: ["foo"],
7420 apex_available: ["myapex"],
7421 sdk_version: "none",
7422 system_modules: "none",
7423 }
7424
7425 java_library {
7426 name: "bar",
7427 srcs: ["a.java"],
7428 libs: ["foo"],
7429 apex_available: ["myapex"],
7430 sdk_version: "none",
7431 system_modules: "none",
7432 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007433
7434 prebuilt_apis {
7435 name: "sdk",
7436 api_dirs: ["100"],
7437 }
Paul Duffin9b879592020-05-26 13:21:35 +01007438 `, withFiles(filesForSdkLibrary))
7439
7440 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007441 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007442 "javalib/bar.jar",
7443 "javalib/foo.jar",
7444 "etc/permissions/foo.xml",
7445 })
7446
7447 // The bar library should depend on the implementation jar.
7448 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007449 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007450 t.Errorf("expected %q, found %#q", expected, actual)
7451 }
7452}
7453
7454func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007455 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007456 apex {
7457 name: "myapex",
7458 key: "myapex.key",
7459 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007460 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007461 }
7462
7463 apex_key {
7464 name: "myapex.key",
7465 public_key: "testkey.avbpubkey",
7466 private_key: "testkey.pem",
7467 }
7468
7469 java_sdk_library {
7470 name: "foo",
7471 srcs: ["a.java"],
7472 api_packages: ["foo"],
7473 apex_available: ["myapex"],
7474 sdk_version: "none",
7475 system_modules: "none",
7476 }
7477
7478 java_library {
7479 name: "bar",
7480 srcs: ["a.java"],
7481 libs: ["foo"],
7482 sdk_version: "none",
7483 system_modules: "none",
7484 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007485
7486 prebuilt_apis {
7487 name: "sdk",
7488 api_dirs: ["100"],
7489 }
Paul Duffin9b879592020-05-26 13:21:35 +01007490 `, withFiles(filesForSdkLibrary))
7491
7492 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007493 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007494 "javalib/foo.jar",
7495 "etc/permissions/foo.xml",
7496 })
7497
7498 // The bar library should depend on the stubs jar.
7499 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007500 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007501 t.Errorf("expected %q, found %#q", expected, actual)
7502 }
7503}
7504
Paul Duffineedc5d52020-06-12 17:46:39 +01007505func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007506 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007507 prebuilt_apis {
7508 name: "sdk",
7509 api_dirs: ["100"],
7510 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007511 withFiles(map[string][]byte{
7512 "apex/a.java": nil,
7513 "apex/apex_manifest.json": nil,
7514 "apex/Android.bp": []byte(`
7515 package {
7516 default_visibility: ["//visibility:private"],
7517 }
7518
7519 apex {
7520 name: "myapex",
7521 key: "myapex.key",
7522 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007523 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007524 }
7525
7526 apex_key {
7527 name: "myapex.key",
7528 public_key: "testkey.avbpubkey",
7529 private_key: "testkey.pem",
7530 }
7531
7532 java_library {
7533 name: "bar",
7534 srcs: ["a.java"],
7535 libs: ["foo"],
7536 apex_available: ["myapex"],
7537 sdk_version: "none",
7538 system_modules: "none",
7539 }
7540`),
7541 "source/a.java": nil,
7542 "source/api/current.txt": nil,
7543 "source/api/removed.txt": nil,
7544 "source/Android.bp": []byte(`
7545 package {
7546 default_visibility: ["//visibility:private"],
7547 }
7548
7549 java_sdk_library {
7550 name: "foo",
7551 visibility: ["//apex"],
7552 srcs: ["a.java"],
7553 api_packages: ["foo"],
7554 apex_available: ["myapex"],
7555 sdk_version: "none",
7556 system_modules: "none",
7557 public: {
7558 enabled: true,
7559 },
7560 }
7561`),
7562 "prebuilt/a.jar": nil,
7563 "prebuilt/Android.bp": []byte(`
7564 package {
7565 default_visibility: ["//visibility:private"],
7566 }
7567
7568 java_sdk_library_import {
7569 name: "foo",
7570 visibility: ["//apex", "//source"],
7571 apex_available: ["myapex"],
7572 prefer: true,
7573 public: {
7574 jars: ["a.jar"],
7575 },
7576 }
7577`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007578 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007579 )
7580
7581 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007582 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007583 "javalib/bar.jar",
7584 "javalib/foo.jar",
7585 "etc/permissions/foo.xml",
7586 })
7587
7588 // The bar library should depend on the implementation jar.
7589 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007590 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007591 t.Errorf("expected %q, found %#q", expected, actual)
7592 }
7593}
7594
7595func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7596 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7597 apex {
7598 name: "myapex",
7599 key: "myapex.key",
7600 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007601 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007602 }
7603
7604 apex_key {
7605 name: "myapex.key",
7606 public_key: "testkey.avbpubkey",
7607 private_key: "testkey.pem",
7608 }
7609
7610 java_sdk_library_import {
7611 name: "foo",
7612 apex_available: ["myapex"],
7613 prefer: true,
7614 public: {
7615 jars: ["a.jar"],
7616 },
7617 }
7618
7619 `, withFiles(filesForSdkLibrary))
7620}
7621
atrost6e126252020-01-27 17:01:16 +00007622func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007623 result := android.GroupFixturePreparers(
7624 prepareForApexTest,
7625 java.PrepareForTestWithPlatformCompatConfig,
7626 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007627 apex {
7628 name: "myapex",
7629 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007630 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007631 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007632 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007633 }
7634
7635 apex_key {
7636 name: "myapex.key",
7637 public_key: "testkey.avbpubkey",
7638 private_key: "testkey.pem",
7639 }
7640
7641 platform_compat_config {
7642 name: "myjar-platform-compat-config",
7643 src: ":myjar",
7644 }
7645
7646 java_library {
7647 name: "myjar",
7648 srcs: ["foo/bar/MyClass.java"],
7649 sdk_version: "none",
7650 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007651 apex_available: [ "myapex" ],
7652 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007653
7654 // Make sure that a preferred prebuilt does not affect the apex contents.
7655 prebuilt_platform_compat_config {
7656 name: "myjar-platform-compat-config",
7657 metadata: "compat-config/metadata.xml",
7658 prefer: true,
7659 }
atrost6e126252020-01-27 17:01:16 +00007660 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007661 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007662 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007663 "etc/compatconfig/myjar-platform-compat-config.xml",
7664 "javalib/myjar.jar",
7665 })
7666}
7667
Jooyung Han862c0d62022-12-21 10:15:37 +09007668func TestNoDupeApexFiles(t *testing.T) {
7669 android.GroupFixturePreparers(
7670 android.PrepareForTestWithAndroidBuildComponents,
7671 PrepareForTestWithApexBuildComponents,
7672 prepareForTestWithMyapex,
7673 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7674 ).
7675 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7676 RunTestWithBp(t, `
7677 apex {
7678 name: "myapex",
7679 key: "myapex.key",
7680 prebuilts: ["foo", "bar"],
7681 updatable: false,
7682 }
7683
7684 apex_key {
7685 name: "myapex.key",
7686 public_key: "testkey.avbpubkey",
7687 private_key: "testkey.pem",
7688 }
7689
7690 prebuilt_etc {
7691 name: "foo",
7692 src: "myprebuilt",
7693 filename_from_src: true,
7694 }
7695
7696 prebuilt_etc {
7697 name: "bar",
7698 src: "myprebuilt",
7699 filename_from_src: true,
7700 }
7701 `)
7702}
7703
Jiyong Park479321d2019-12-16 11:47:12 +09007704func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7705 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7706 apex {
7707 name: "myapex",
7708 key: "myapex.key",
7709 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007710 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007711 }
7712
7713 apex_key {
7714 name: "myapex.key",
7715 public_key: "testkey.avbpubkey",
7716 private_key: "testkey.pem",
7717 }
7718
7719 java_library {
7720 name: "myjar",
7721 srcs: ["foo/bar/MyClass.java"],
7722 sdk_version: "none",
7723 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007724 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007725 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007726 }
7727 `)
7728}
7729
Jiyong Park7afd1072019-12-30 16:56:33 +09007730func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007731 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007732 apex {
7733 name: "myapex",
7734 key: "myapex.key",
7735 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007736 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007737 }
7738
7739 apex_key {
7740 name: "myapex.key",
7741 public_key: "testkey.avbpubkey",
7742 private_key: "testkey.pem",
7743 }
7744
7745 cc_library {
7746 name: "mylib",
7747 srcs: ["mylib.cpp"],
7748 system_shared_libs: [],
7749 stl: "none",
7750 required: ["a", "b"],
7751 host_required: ["c", "d"],
7752 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007753 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007754 }
7755 `)
7756
Jooyung Hana0503a52023-08-23 13:12:50 +09007757 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007758 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007759 name := apexBundle.BaseModuleName()
7760 prefix := "TARGET_"
7761 var builder strings.Builder
7762 data.Custom(&builder, name, prefix, "", data)
7763 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007764 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007765 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7766 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007767}
7768
Jiyong Park7cd10e32020-01-14 09:22:18 +09007769func TestSymlinksFromApexToSystem(t *testing.T) {
7770 bp := `
7771 apex {
7772 name: "myapex",
7773 key: "myapex.key",
7774 native_shared_libs: ["mylib"],
7775 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007776 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007777 }
7778
Jiyong Park9d677202020-02-19 16:29:35 +09007779 apex {
7780 name: "myapex.updatable",
7781 key: "myapex.key",
7782 native_shared_libs: ["mylib"],
7783 java_libs: ["myjar"],
7784 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007785 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007786 }
7787
Jiyong Park7cd10e32020-01-14 09:22:18 +09007788 apex_key {
7789 name: "myapex.key",
7790 public_key: "testkey.avbpubkey",
7791 private_key: "testkey.pem",
7792 }
7793
7794 cc_library {
7795 name: "mylib",
7796 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007797 shared_libs: [
7798 "myotherlib",
7799 "myotherlib_ext",
7800 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007801 system_shared_libs: [],
7802 stl: "none",
7803 apex_available: [
7804 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007805 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007806 "//apex_available:platform",
7807 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007808 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007809 }
7810
7811 cc_library {
7812 name: "myotherlib",
7813 srcs: ["mylib.cpp"],
7814 system_shared_libs: [],
7815 stl: "none",
7816 apex_available: [
7817 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007818 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007819 "//apex_available:platform",
7820 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007821 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007822 }
7823
Jiyong Parkce243632023-02-17 18:22:25 +09007824 cc_library {
7825 name: "myotherlib_ext",
7826 srcs: ["mylib.cpp"],
7827 system_shared_libs: [],
7828 system_ext_specific: true,
7829 stl: "none",
7830 apex_available: [
7831 "myapex",
7832 "myapex.updatable",
7833 "//apex_available:platform",
7834 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007835 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007836 }
7837
Jiyong Park7cd10e32020-01-14 09:22:18 +09007838 java_library {
7839 name: "myjar",
7840 srcs: ["foo/bar/MyClass.java"],
7841 sdk_version: "none",
7842 system_modules: "none",
7843 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007844 apex_available: [
7845 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007846 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007847 "//apex_available:platform",
7848 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007849 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007850 }
7851
7852 java_library {
7853 name: "myotherjar",
7854 srcs: ["foo/bar/MyClass.java"],
7855 sdk_version: "none",
7856 system_modules: "none",
7857 apex_available: [
7858 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007859 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007860 "//apex_available:platform",
7861 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007862 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007863 }
7864 `
7865
7866 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7867 for _, f := range files {
7868 if f.path == file {
7869 if f.isLink {
7870 t.Errorf("%q is not a real file", file)
7871 }
7872 return
7873 }
7874 }
7875 t.Errorf("%q is not found", file)
7876 }
7877
Jiyong Parkce243632023-02-17 18:22:25 +09007878 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007879 for _, f := range files {
7880 if f.path == file {
7881 if !f.isLink {
7882 t.Errorf("%q is not a symlink", file)
7883 }
Jiyong Parkce243632023-02-17 18:22:25 +09007884 if f.src != target {
7885 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7886 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007887 return
7888 }
7889 }
7890 t.Errorf("%q is not found", file)
7891 }
7892
Jiyong Park9d677202020-02-19 16:29:35 +09007893 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7894 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007895 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007896 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007897 ensureRealfileExists(t, files, "javalib/myjar.jar")
7898 ensureRealfileExists(t, files, "lib64/mylib.so")
7899 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007900 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007901
Jooyung Hana0503a52023-08-23 13:12:50 +09007902 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007903 ensureRealfileExists(t, files, "javalib/myjar.jar")
7904 ensureRealfileExists(t, files, "lib64/mylib.so")
7905 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007906 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007907
7908 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007909 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007910 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007911 ensureRealfileExists(t, files, "javalib/myjar.jar")
7912 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007913 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7914 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007915
Jooyung Hana0503a52023-08-23 13:12:50 +09007916 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007917 ensureRealfileExists(t, files, "javalib/myjar.jar")
7918 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007919 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7920 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007921}
7922
Yo Chiange8128052020-07-23 20:09:18 +08007923func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007924 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007925 apex {
7926 name: "myapex",
7927 key: "myapex.key",
7928 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007929 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007930 }
7931
7932 apex_key {
7933 name: "myapex.key",
7934 public_key: "testkey.avbpubkey",
7935 private_key: "testkey.pem",
7936 }
7937
7938 cc_library_shared {
7939 name: "mylib",
7940 srcs: ["mylib.cpp"],
7941 shared_libs: ["myotherlib"],
7942 system_shared_libs: [],
7943 stl: "none",
7944 apex_available: [
7945 "myapex",
7946 "//apex_available:platform",
7947 ],
7948 }
7949
7950 cc_prebuilt_library_shared {
7951 name: "myotherlib",
7952 srcs: ["prebuilt.so"],
7953 system_shared_libs: [],
7954 stl: "none",
7955 apex_available: [
7956 "myapex",
7957 "//apex_available:platform",
7958 ],
7959 }
7960 `)
7961
Jooyung Hana0503a52023-08-23 13:12:50 +09007962 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007963 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007964 var builder strings.Builder
7965 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7966 androidMk := builder.String()
7967 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007968 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007969 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7970 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7971 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007972 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007973}
7974
Jooyung Han643adc42020-02-27 13:50:06 +09007975func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007976 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007977 apex {
7978 name: "myapex",
7979 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007980 binaries: ["mybin"],
7981 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007982 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007983 }
7984
7985 apex_key {
7986 name: "myapex.key",
7987 public_key: "testkey.avbpubkey",
7988 private_key: "testkey.pem",
7989 }
7990
7991 cc_library {
7992 name: "mylib",
7993 srcs: ["mylib.cpp"],
7994 shared_libs: ["mylib2"],
7995 system_shared_libs: [],
7996 stl: "none",
7997 apex_available: [ "myapex" ],
7998 }
7999
8000 cc_library {
8001 name: "mylib2",
8002 srcs: ["mylib.cpp"],
8003 system_shared_libs: [],
8004 stl: "none",
8005 apex_available: [ "myapex" ],
8006 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008007
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008008 // Used as both a JNI library and a regular shared library.
8009 cc_library {
8010 name: "mylib3",
8011 srcs: ["mylib.cpp"],
8012 system_shared_libs: [],
8013 stl: "none",
8014 apex_available: [ "myapex" ],
8015 }
8016
8017 cc_binary {
8018 name: "mybin",
8019 srcs: ["mybin.cpp"],
8020 shared_libs: ["mylib3"],
8021 system_shared_libs: [],
8022 stl: "none",
8023 apex_available: [ "myapex" ],
8024 }
8025
Jiyong Park34d5c332022-02-24 18:02:44 +09008026 rust_ffi_shared {
8027 name: "libfoo.rust",
8028 crate_name: "foo",
8029 srcs: ["foo.rs"],
8030 shared_libs: ["libfoo.shared_from_rust"],
8031 prefer_rlib: true,
8032 apex_available: ["myapex"],
8033 }
8034
8035 cc_library_shared {
8036 name: "libfoo.shared_from_rust",
8037 srcs: ["mylib.cpp"],
8038 system_shared_libs: [],
8039 stl: "none",
8040 stubs: {
8041 versions: ["10", "11", "12"],
8042 },
8043 }
8044
Jooyung Han643adc42020-02-27 13:50:06 +09008045 `)
8046
Jooyung Hana0503a52023-08-23 13:12:50 +09008047 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008048 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008049 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008050 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008051 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008052 "lib64/mylib.so",
8053 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008054 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008055 "lib64/libfoo.rust.so",
8056 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8057 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008058 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008059
8060 // b/220397949
8061 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008062}
8063
Jooyung Han49f67012020-04-17 13:43:10 +09008064func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008065 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008066 apex {
8067 name: "myapex",
8068 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008069 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008070 }
8071 apex_key {
8072 name: "myapex.key",
8073 public_key: "testkey.avbpubkey",
8074 private_key: "testkey.pem",
8075 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008076 `,
8077 android.FixtureModifyConfig(func(config android.Config) {
8078 delete(config.Targets, android.Android)
8079 config.AndroidCommonTarget = android.Target{}
8080 }),
8081 )
Jooyung Han49f67012020-04-17 13:43:10 +09008082
8083 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8084 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8085 }
8086}
8087
Jiyong Parkbd159612020-02-28 15:22:21 +09008088func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008089 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008090 apex {
8091 name: "myapex",
8092 key: "myapex.key",
8093 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008094 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008095 }
8096
8097 apex_key {
8098 name: "myapex.key",
8099 public_key: "testkey.avbpubkey",
8100 private_key: "testkey.pem",
8101 }
8102
8103 android_app {
8104 name: "AppFoo",
8105 srcs: ["foo/bar/MyClass.java"],
8106 sdk_version: "none",
8107 system_modules: "none",
8108 apex_available: [ "myapex" ],
8109 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008110 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008111
Jooyung Hana0503a52023-08-23 13:12:50 +09008112 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008113 content := bundleConfigRule.Args["content"]
8114
8115 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008116 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 +09008117}
8118
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008119func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008120 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008121 apex {
8122 name: "myapex",
8123 key: "myapex.key",
8124 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008125 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008126 }
8127
8128 apex_key {
8129 name: "myapex.key",
8130 public_key: "testkey.avbpubkey",
8131 private_key: "testkey.pem",
8132 }
8133
8134 android_app_set {
8135 name: "AppSet",
8136 set: "AppSet.apks",
8137 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008138 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008139 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008140 content := bundleConfigRule.Args["content"]
8141 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8142 s := mod.Rule("apexRule").Args["copy_commands"]
8143 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008144 if len(copyCmds) != 4 {
8145 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008146 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008147 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8148 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008149 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8150 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008151
8152 // Ensure that canned_fs_config has an entry for the app set zip file
8153 generateFsRule := mod.Rule("generateFsConfig")
8154 cmd := generateFsRule.RuleParams.Command
8155 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008156}
8157
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008158func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008159 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008160 apex_set {
8161 name: "myapex",
8162 filename: "foo_v2.apex",
8163 sanitized: {
8164 none: { set: "myapex.apks", },
8165 hwaddress: { set: "myapex.hwasan.apks", },
8166 },
Paul Duffin24704672021-04-06 16:09:30 +01008167 }
8168 `
8169 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008170
Paul Duffin24704672021-04-06 16:09:30 +01008171 // Check that the extractor produces the correct output file from the correct input file.
8172 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008173
Paul Duffin24704672021-04-06 16:09:30 +01008174 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8175 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008176
Paul Duffin24704672021-04-06 16:09:30 +01008177 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8178
8179 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008180 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8181 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008182
8183 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008184}
8185
Pranav Guptaeba03b02022-09-27 00:27:08 +00008186func TestApexSetApksModuleAssignment(t *testing.T) {
8187 ctx := testApex(t, `
8188 apex_set {
8189 name: "myapex",
8190 set: ":myapex_apks_file",
8191 }
8192
8193 filegroup {
8194 name: "myapex_apks_file",
8195 srcs: ["myapex.apks"],
8196 }
8197 `)
8198
8199 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8200
8201 // Check that the extractor produces the correct apks file from the input module
8202 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8203 extractedApex := m.Output(extractorOutput)
8204
8205 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8206}
8207
Paul Duffin89f570a2021-06-16 01:42:33 +01008208func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008209 t.Helper()
8210
Paul Duffin55607122021-03-30 23:32:51 +01008211 fs := android.MockFS{
8212 "a.java": nil,
8213 "a.jar": nil,
8214 "apex_manifest.json": nil,
8215 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008216 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008217 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8218 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8219 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008220 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008221 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008222
Paul Duffin55607122021-03-30 23:32:51 +01008223 errorHandler := android.FixtureExpectsNoErrors
8224 if errmsg != "" {
8225 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008226 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008227
Paul Duffin55607122021-03-30 23:32:51 +01008228 result := android.GroupFixturePreparers(
8229 cc.PrepareForTestWithCcDefaultModules,
8230 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008231 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008232 java.PrepareForTestWithJavaSdkLibraryFiles,
8233 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008234 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008235 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008236 android.FixtureModifyMockFS(func(fs android.MockFS) {
8237 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8238 insert := ""
8239 for _, fragment := range fragments {
8240 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8241 }
8242 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8243 platform_bootclasspath {
8244 name: "platform-bootclasspath",
8245 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008246 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008247 %s
8248 ],
8249 }
8250 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008251 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008252 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008253 // Dexpreopt for boot jars requires the ART boot image profile.
8254 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8255 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008256 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008257 ).
8258 ExtendWithErrorHandler(errorHandler).
8259 RunTestWithBp(t, bp)
8260
8261 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008262}
8263
Paul Duffin5556c5f2022-06-09 17:32:21 +00008264func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008265 preparers := android.GroupFixturePreparers(
8266 java.PrepareForTestWithJavaDefaultModules,
8267 PrepareForTestWithApexBuildComponents,
8268 ).
8269 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8270 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8271
8272 bpBase := `
8273 apex_set {
8274 name: "com.android.myapex",
8275 installable: true,
8276 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8277 set: "myapex.apks",
8278 }
8279
8280 apex_set {
8281 name: "com.mycompany.android.myapex",
8282 apex_name: "com.android.myapex",
8283 installable: true,
8284 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8285 set: "company-myapex.apks",
8286 }
8287
8288 prebuilt_bootclasspath_fragment {
8289 name: "my-bootclasspath-fragment",
8290 apex_available: ["com.android.myapex"],
8291 %s
8292 }
8293 `
8294
8295 t.Run("java_import", func(t *testing.T) {
8296 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8297 java_import {
8298 name: "libfoo",
8299 jars: ["libfoo.jar"],
8300 apex_available: ["com.android.myapex"],
8301 }
8302 `)
8303 })
8304
8305 t.Run("java_sdk_library_import", func(t *testing.T) {
8306 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8307 java_sdk_library_import {
8308 name: "libfoo",
8309 public: {
8310 jars: ["libbar.jar"],
8311 },
8312 apex_available: ["com.android.myapex"],
8313 }
8314 `)
8315 })
8316
8317 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8318 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8319 image_name: "art",
8320 contents: ["libfoo"],
8321 `)+`
8322 java_sdk_library_import {
8323 name: "libfoo",
8324 public: {
8325 jars: ["libbar.jar"],
8326 },
8327 apex_available: ["com.android.myapex"],
8328 }
8329 `)
8330 })
8331}
8332
Paul Duffin5556c5f2022-06-09 17:32:21 +00008333func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8334 preparers := android.GroupFixturePreparers(
8335 java.PrepareForTestWithJavaDefaultModules,
8336 PrepareForTestWithApexBuildComponents,
8337 )
8338
8339 bpBase := `
8340 apex_set {
8341 name: "com.android.myapex",
8342 installable: true,
8343 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8344 set: "myapex.apks",
8345 }
8346
8347 apex_set {
8348 name: "com.android.myapex_compressed",
8349 apex_name: "com.android.myapex",
8350 installable: true,
8351 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8352 set: "myapex_compressed.apks",
8353 }
8354
8355 prebuilt_bootclasspath_fragment {
8356 name: "my-bootclasspath-fragment",
8357 apex_available: [
8358 "com.android.myapex",
8359 "com.android.myapex_compressed",
8360 ],
8361 hidden_api: {
8362 annotation_flags: "annotation-flags.csv",
8363 metadata: "metadata.csv",
8364 index: "index.csv",
8365 signature_patterns: "signature_patterns.csv",
8366 },
8367 %s
8368 }
8369 `
8370
8371 t.Run("java_import", func(t *testing.T) {
8372 result := preparers.RunTestWithBp(t,
8373 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8374 java_import {
8375 name: "libfoo",
8376 jars: ["libfoo.jar"],
8377 apex_available: [
8378 "com.android.myapex",
8379 "com.android.myapex_compressed",
8380 ],
8381 }
8382 `)
8383
8384 module := result.Module("libfoo", "android_common_com.android.myapex")
8385 usesLibraryDep := module.(java.UsesLibraryDependency)
8386 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8387 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8388 usesLibraryDep.DexJarBuildPath().Path())
8389 })
8390
8391 t.Run("java_sdk_library_import", func(t *testing.T) {
8392 result := preparers.RunTestWithBp(t,
8393 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8394 java_sdk_library_import {
8395 name: "libfoo",
8396 public: {
8397 jars: ["libbar.jar"],
8398 },
8399 apex_available: [
8400 "com.android.myapex",
8401 "com.android.myapex_compressed",
8402 ],
8403 compile_dex: true,
8404 }
8405 `)
8406
8407 module := result.Module("libfoo", "android_common_com.android.myapex")
8408 usesLibraryDep := module.(java.UsesLibraryDependency)
8409 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8410 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8411 usesLibraryDep.DexJarBuildPath().Path())
8412 })
8413
8414 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8415 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8416 image_name: "art",
8417 contents: ["libfoo"],
8418 `)+`
8419 java_sdk_library_import {
8420 name: "libfoo",
8421 public: {
8422 jars: ["libbar.jar"],
8423 },
8424 apex_available: [
8425 "com.android.myapex",
8426 "com.android.myapex_compressed",
8427 ],
8428 compile_dex: true,
8429 }
8430 `)
8431 })
8432}
8433
Jooyung Han548640b2020-04-27 12:10:30 +09008434func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8435 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8436 apex {
8437 name: "myapex",
8438 key: "myapex.key",
8439 updatable: true,
8440 }
8441
8442 apex_key {
8443 name: "myapex.key",
8444 public_key: "testkey.avbpubkey",
8445 private_key: "testkey.pem",
8446 }
8447 `)
8448}
8449
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008450func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8451 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8452 apex {
8453 name: "myapex",
8454 key: "myapex.key",
8455 }
8456
8457 apex_key {
8458 name: "myapex.key",
8459 public_key: "testkey.avbpubkey",
8460 private_key: "testkey.pem",
8461 }
8462 `)
8463}
8464
Jooyung Handfc864c2023-03-20 18:19:07 +09008465func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8466 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008467 apex {
8468 name: "myapex",
8469 key: "myapex.key",
8470 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008471 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008472 soc_specific: true,
8473 }
8474
8475 apex_key {
8476 name: "myapex.key",
8477 public_key: "testkey.avbpubkey",
8478 private_key: "testkey.pem",
8479 }
8480 `)
8481}
8482
Jooyung Han02873da2023-03-22 17:41:03 +09008483func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8484 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8485 apex {
8486 name: "myapex",
8487 key: "myapex.key",
8488 updatable: false,
8489 min_sdk_version: "29",
8490 use_vndk_as_stable: true,
8491 vendor: true,
8492 }
8493
8494 apex_key {
8495 name: "myapex.key",
8496 public_key: "testkey.avbpubkey",
8497 private_key: "testkey.pem",
8498 }
8499 `)
8500}
8501
Jooyung Handfc864c2023-03-20 18:19:07 +09008502func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8503 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8504 apex {
8505 name: "myapex",
8506 key: "myapex.key",
8507 updatable: false,
8508 use_vndk_as_stable: true,
8509 }
8510
8511 apex_key {
8512 name: "myapex.key",
8513 public_key: "testkey.avbpubkey",
8514 private_key: "testkey.pem",
8515 }
8516 `)
8517}
8518
satayevb98371c2021-06-15 16:49:50 +01008519func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8520 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8521 apex {
8522 name: "myapex",
8523 key: "myapex.key",
8524 systemserverclasspath_fragments: [
8525 "mysystemserverclasspathfragment",
8526 ],
8527 min_sdk_version: "29",
8528 updatable: true,
8529 }
8530
8531 apex_key {
8532 name: "myapex.key",
8533 public_key: "testkey.avbpubkey",
8534 private_key: "testkey.pem",
8535 }
8536
8537 java_library {
8538 name: "foo",
8539 srcs: ["b.java"],
8540 min_sdk_version: "29",
8541 installable: true,
8542 apex_available: [
8543 "myapex",
8544 ],
8545 }
8546
8547 systemserverclasspath_fragment {
8548 name: "mysystemserverclasspathfragment",
8549 generate_classpaths_proto: false,
8550 contents: [
8551 "foo",
8552 ],
8553 apex_available: [
8554 "myapex",
8555 ],
8556 }
satayevabcd5972021-08-06 17:49:46 +01008557 `,
8558 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8559 )
satayevb98371c2021-06-15 16:49:50 +01008560}
8561
Paul Duffin064b70c2020-11-02 17:32:38 +00008562func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008563 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008564 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008565 fragment := java.ApexVariantReference{
8566 Apex: proptools.StringPtr("myapex"),
8567 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8568 }
8569
Paul Duffin064b70c2020-11-02 17:32:38 +00008570 testDexpreoptWithApexes(t, `
8571 prebuilt_apex {
8572 name: "myapex" ,
8573 arch: {
8574 arm64: {
8575 src: "myapex-arm64.apex",
8576 },
8577 arm: {
8578 src: "myapex-arm.apex",
8579 },
8580 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008581 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8582 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008583
Paul Duffin89f570a2021-06-16 01:42:33 +01008584 prebuilt_bootclasspath_fragment {
8585 name: "my-bootclasspath-fragment",
8586 contents: ["libfoo"],
8587 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008588 hidden_api: {
8589 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8590 metadata: "my-bootclasspath-fragment/metadata.csv",
8591 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008592 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8593 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8594 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008595 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008596 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008597
Paul Duffin89f570a2021-06-16 01:42:33 +01008598 java_import {
8599 name: "libfoo",
8600 jars: ["libfoo.jar"],
8601 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008602 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008603 }
8604 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008605 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008606}
8607
Spandan Dasf14e2542021-11-12 00:01:37 +00008608func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008609 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008610 bp += `
8611 apex_key {
8612 name: "myapex.key",
8613 public_key: "testkey.avbpubkey",
8614 private_key: "testkey.pem",
8615 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008616 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008617 "lib1/src/A.java": nil,
8618 "lib2/src/B.java": nil,
8619 "system/sepolicy/apex/myapex-file_contexts": nil,
8620 }
8621
Paul Duffin45338f02021-03-30 23:07:52 +01008622 errorHandler := android.FixtureExpectsNoErrors
8623 if errmsg != "" {
8624 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008625 }
Colin Crossae8600b2020-10-29 17:09:13 -07008626
Paul Duffin45338f02021-03-30 23:07:52 +01008627 android.GroupFixturePreparers(
8628 android.PrepareForTestWithAndroidBuildComponents,
8629 java.PrepareForTestWithJavaBuildComponents,
8630 PrepareForTestWithApexBuildComponents,
8631 android.PrepareForTestWithNeverallowRules(rules),
8632 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008633 apexBootJars := make([]string, 0, len(bootJars))
8634 for _, apexBootJar := range bootJars {
8635 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008636 }
satayevd604b212021-07-21 14:23:52 +01008637 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008638 }),
8639 fs.AddToFixture(),
8640 ).
8641 ExtendWithErrorHandler(errorHandler).
8642 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008643}
8644
8645func TestApexPermittedPackagesRules(t *testing.T) {
8646 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008647 name string
8648 expectedError string
8649 bp string
8650 bootJars []string
8651 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008652 }{
8653
8654 {
8655 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8656 expectedError: "",
8657 bp: `
8658 java_library {
8659 name: "bcp_lib1",
8660 srcs: ["lib1/src/*.java"],
8661 permitted_packages: ["foo.bar"],
8662 apex_available: ["myapex"],
8663 sdk_version: "none",
8664 system_modules: "none",
8665 }
8666 java_library {
8667 name: "nonbcp_lib2",
8668 srcs: ["lib2/src/*.java"],
8669 apex_available: ["myapex"],
8670 permitted_packages: ["a.b"],
8671 sdk_version: "none",
8672 system_modules: "none",
8673 }
8674 apex {
8675 name: "myapex",
8676 key: "myapex.key",
8677 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008678 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008679 }`,
8680 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008681 bcpPermittedPackages: map[string][]string{
8682 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008683 "foo.bar",
8684 },
8685 },
8686 },
8687 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008688 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008689 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 +01008690 bp: `
8691 java_library {
8692 name: "bcp_lib1",
8693 srcs: ["lib1/src/*.java"],
8694 apex_available: ["myapex"],
8695 permitted_packages: ["foo.bar"],
8696 sdk_version: "none",
8697 system_modules: "none",
8698 }
8699 java_library {
8700 name: "bcp_lib2",
8701 srcs: ["lib2/src/*.java"],
8702 apex_available: ["myapex"],
8703 permitted_packages: ["foo.bar", "bar.baz"],
8704 sdk_version: "none",
8705 system_modules: "none",
8706 }
8707 apex {
8708 name: "myapex",
8709 key: "myapex.key",
8710 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008711 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008712 }
8713 `,
8714 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008715 bcpPermittedPackages: map[string][]string{
8716 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008717 "foo.bar",
8718 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008719 "bcp_lib2": []string{
8720 "foo.bar",
8721 },
8722 },
8723 },
8724 {
8725 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8726 expectedError: "",
8727 bp: `
8728 java_library {
8729 name: "bcp_lib_restricted",
8730 srcs: ["lib1/src/*.java"],
8731 apex_available: ["myapex"],
8732 permitted_packages: ["foo.bar"],
8733 sdk_version: "none",
8734 min_sdk_version: "29",
8735 system_modules: "none",
8736 }
8737 java_library {
8738 name: "bcp_lib_unrestricted",
8739 srcs: ["lib2/src/*.java"],
8740 apex_available: ["myapex"],
8741 permitted_packages: ["foo.bar", "bar.baz"],
8742 sdk_version: "none",
8743 min_sdk_version: "29",
8744 system_modules: "none",
8745 }
8746 apex {
8747 name: "myapex",
8748 key: "myapex.key",
8749 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8750 updatable: true,
8751 min_sdk_version: "29",
8752 }
8753 `,
8754 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8755 bcpPermittedPackages: map[string][]string{
8756 "bcp_lib1_non_updateable": []string{
8757 "foo.bar",
8758 },
8759 // 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 +01008760 },
8761 },
8762 }
8763 for _, tc := range testcases {
8764 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008765 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8766 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008767 })
8768 }
8769}
8770
Jiyong Park62304bb2020-04-13 16:19:48 +09008771func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008772 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008773 apex {
8774 name: "myapex",
8775 key: "myapex.key",
8776 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008777 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008778 }
8779
8780 apex_key {
8781 name: "myapex.key",
8782 public_key: "testkey.avbpubkey",
8783 private_key: "testkey.pem",
8784 }
8785
8786 cc_library {
8787 name: "mylib",
8788 srcs: ["mylib.cpp"],
8789 system_shared_libs: [],
8790 stl: "none",
8791 stubs: {
8792 versions: ["1"],
8793 },
8794 apex_available: ["myapex"],
8795 }
8796
8797 cc_library {
8798 name: "myprivlib",
8799 srcs: ["mylib.cpp"],
8800 system_shared_libs: [],
8801 stl: "none",
8802 apex_available: ["myapex"],
8803 }
8804
8805
8806 cc_test {
8807 name: "mytest",
8808 gtest: false,
8809 srcs: ["mylib.cpp"],
8810 system_shared_libs: [],
8811 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008812 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008813 test_for: ["myapex"]
8814 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008815
8816 cc_library {
8817 name: "mytestlib",
8818 srcs: ["mylib.cpp"],
8819 system_shared_libs: [],
8820 shared_libs: ["mylib", "myprivlib"],
8821 stl: "none",
8822 test_for: ["myapex"],
8823 }
8824
8825 cc_benchmark {
8826 name: "mybench",
8827 srcs: ["mylib.cpp"],
8828 system_shared_libs: [],
8829 shared_libs: ["mylib", "myprivlib"],
8830 stl: "none",
8831 test_for: ["myapex"],
8832 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008833 `)
8834
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008835 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008836 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008837 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8838 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8839 }
8840
8841 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008842 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008843 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8844 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8845 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8846}
Jiyong Park46a512f2020-12-04 18:02:13 +09008847
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008848func TestIndirectTestFor(t *testing.T) {
8849 ctx := testApex(t, `
8850 apex {
8851 name: "myapex",
8852 key: "myapex.key",
8853 native_shared_libs: ["mylib", "myprivlib"],
8854 updatable: false,
8855 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008856
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008857 apex_key {
8858 name: "myapex.key",
8859 public_key: "testkey.avbpubkey",
8860 private_key: "testkey.pem",
8861 }
8862
8863 cc_library {
8864 name: "mylib",
8865 srcs: ["mylib.cpp"],
8866 system_shared_libs: [],
8867 stl: "none",
8868 stubs: {
8869 versions: ["1"],
8870 },
8871 apex_available: ["myapex"],
8872 }
8873
8874 cc_library {
8875 name: "myprivlib",
8876 srcs: ["mylib.cpp"],
8877 system_shared_libs: [],
8878 stl: "none",
8879 shared_libs: ["mylib"],
8880 apex_available: ["myapex"],
8881 }
8882
8883 cc_library {
8884 name: "mytestlib",
8885 srcs: ["mylib.cpp"],
8886 system_shared_libs: [],
8887 shared_libs: ["myprivlib"],
8888 stl: "none",
8889 test_for: ["myapex"],
8890 }
8891 `)
8892
8893 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008894 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008895 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8896 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8897 }
8898
8899 // The platform variant of mytestlib links to the platform variant of the
8900 // internal myprivlib.
8901 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8902
8903 // The platform variant of myprivlib links to the platform variant of mylib
8904 // and bypasses its stubs.
8905 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 +09008906}
8907
Martin Stjernholmec009002021-03-27 15:18:31 +00008908func TestTestForForLibInOtherApex(t *testing.T) {
8909 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8910 _ = testApex(t, `
8911 apex {
8912 name: "com.android.art",
8913 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008914 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008915 updatable: false,
8916 }
8917
8918 apex {
8919 name: "com.android.art.debug",
8920 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008921 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008922 updatable: false,
8923 }
8924
8925 apex_key {
8926 name: "myapex.key",
8927 public_key: "testkey.avbpubkey",
8928 private_key: "testkey.pem",
8929 }
8930
8931 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008932 name: "libnativebridge",
8933 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008934 system_shared_libs: [],
8935 stl: "none",
8936 stubs: {
8937 versions: ["1"],
8938 },
8939 apex_available: ["com.android.art", "com.android.art.debug"],
8940 }
8941
8942 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008943 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008944 srcs: ["mylib.cpp"],
8945 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008946 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008947 stl: "none",
8948 apex_available: ["com.android.art.debug"],
8949 test_for: ["com.android.art"],
8950 }
8951 `,
8952 android.MockFS{
8953 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8954 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8955 }.AddToFixture())
8956}
8957
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008958// TODO(jungjw): Move this to proptools
8959func intPtr(i int) *int {
8960 return &i
8961}
8962
8963func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008964 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008965 apex_set {
8966 name: "myapex",
8967 set: "myapex.apks",
8968 filename: "foo_v2.apex",
8969 overrides: ["foo"],
8970 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008971 `,
8972 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8973 variables.Platform_sdk_version = intPtr(30)
8974 }),
8975 android.FixtureModifyConfig(func(config android.Config) {
8976 config.Targets[android.Android] = []android.Target{
8977 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8978 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8979 }
8980 }),
8981 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008982
Paul Duffin24704672021-04-06 16:09:30 +01008983 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008984
8985 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008986 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008987 actual := extractedApex.Args["abis"]
8988 expected := "ARMEABI_V7A,ARM64_V8A"
8989 if actual != expected {
8990 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8991 }
8992 actual = extractedApex.Args["sdk-version"]
8993 expected = "30"
8994 if actual != expected {
8995 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8996 }
8997
Paul Duffin6717d882021-06-15 19:09:41 +01008998 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008999 a := m.Module().(*ApexSet)
9000 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009001 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009002 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9003 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9004 }
9005}
9006
Anton Hansson805e0a52022-11-25 14:06:46 +00009007func TestApexSet_NativeBridge(t *testing.T) {
9008 ctx := testApex(t, `
9009 apex_set {
9010 name: "myapex",
9011 set: "myapex.apks",
9012 filename: "foo_v2.apex",
9013 overrides: ["foo"],
9014 }
9015 `,
9016 android.FixtureModifyConfig(func(config android.Config) {
9017 config.Targets[android.Android] = []android.Target{
9018 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9019 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9020 }
9021 }),
9022 )
9023
9024 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9025
9026 // Check extract_apks tool parameters. No native bridge arch expected
9027 extractedApex := m.Output("extracted/myapex.apks")
9028 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9029}
9030
Jiyong Park7d95a512020-05-10 15:16:24 +09009031func TestNoStaticLinkingToStubsLib(t *testing.T) {
9032 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9033 apex {
9034 name: "myapex",
9035 key: "myapex.key",
9036 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009037 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009038 }
9039
9040 apex_key {
9041 name: "myapex.key",
9042 public_key: "testkey.avbpubkey",
9043 private_key: "testkey.pem",
9044 }
9045
9046 cc_library {
9047 name: "mylib",
9048 srcs: ["mylib.cpp"],
9049 static_libs: ["otherlib"],
9050 system_shared_libs: [],
9051 stl: "none",
9052 apex_available: [ "myapex" ],
9053 }
9054
9055 cc_library {
9056 name: "otherlib",
9057 srcs: ["mylib.cpp"],
9058 system_shared_libs: [],
9059 stl: "none",
9060 stubs: {
9061 versions: ["1", "2", "3"],
9062 },
9063 apex_available: [ "myapex" ],
9064 }
9065 `)
9066}
9067
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009068func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009069 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009070 apex {
9071 name: "myapex",
9072 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009073 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009074 custom_sign_tool: "sign_myapex",
9075 }
9076
9077 apex_key {
9078 name: "myapex.key",
9079 public_key: "testkey.avbpubkey",
9080 private_key: "testkey.pem",
9081 }
9082 `)
9083
9084 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9085 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009086 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
Jooyung Han09c11ad2021-10-27 03:45:31 +09009087}
9088
9089func TestApexKeysTxtOverrides(t *testing.T) {
9090 ctx := testApex(t, `
9091 apex {
9092 name: "myapex",
9093 key: "myapex.key",
9094 updatable: false,
9095 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009096 }
9097
9098 apex_key {
9099 name: "myapex.key",
9100 public_key: "testkey.avbpubkey",
9101 private_key: "testkey.pem",
9102 }
9103
9104 prebuilt_apex {
9105 name: "myapex",
9106 prefer: true,
9107 arch: {
9108 arm64: {
9109 src: "myapex-arm64.apex",
9110 },
9111 arm: {
9112 src: "myapex-arm.apex",
9113 },
9114 },
9115 }
9116
9117 apex_set {
9118 name: "myapex_set",
9119 set: "myapex.apks",
9120 filename: "myapex_set.apex",
9121 overrides: ["myapex"],
9122 }
9123 `)
9124
9125 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9126 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9127 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 +09009128 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 +09009129}
9130
Jooyung Han938b5932020-06-20 12:47:47 +09009131func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009132 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009133 apex {
9134 name: "myapex",
9135 key: "myapex.key",
9136 apps: ["app"],
9137 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009138 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009139 }
9140
9141 apex_key {
9142 name: "myapex.key",
9143 public_key: "testkey.avbpubkey",
9144 private_key: "testkey.pem",
9145 }
9146
9147 android_app {
9148 name: "app",
9149 srcs: ["foo/bar/MyClass.java"],
9150 package_name: "foo",
9151 sdk_version: "none",
9152 system_modules: "none",
9153 apex_available: [ "myapex" ],
9154 }
9155 `, withFiles(map[string][]byte{
9156 "sub/Android.bp": []byte(`
9157 override_apex {
9158 name: "override_myapex",
9159 base: "myapex",
9160 apps: ["override_app"],
9161 allowed_files: ":allowed",
9162 }
9163 // Overridable "path" property should be referenced indirectly
9164 filegroup {
9165 name: "allowed",
9166 srcs: ["allowed.txt"],
9167 }
9168 override_android_app {
9169 name: "override_app",
9170 base: "app",
9171 package_name: "bar",
9172 }
9173 `),
9174 }))
9175
Jooyung Hana0503a52023-08-23 13:12:50 +09009176 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009177 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9178 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9179 }
9180
Jooyung Hana0503a52023-08-23 13:12:50 +09009181 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009182 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9183 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9184 }
9185}
9186
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009187func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009188 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009189 apex {
9190 name: "myapex",
9191 key: "myapex.key",
9192 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009193 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009194 }
9195
9196 apex_key {
9197 name: "myapex.key",
9198 public_key: "testkey.avbpubkey",
9199 private_key: "testkey.pem",
9200 }
9201
9202 cc_library {
9203 name: "mylib",
9204 srcs: ["mylib.cpp"],
9205 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009206 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009207 },
9208 apex_available: ["myapex"],
9209 }
9210
9211 cc_prebuilt_library_shared {
9212 name: "mylib",
9213 prefer: false,
9214 srcs: ["prebuilt.so"],
9215 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009216 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009217 },
9218 apex_available: ["myapex"],
9219 }
9220 `)
9221}
9222
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009223func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009224 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009225 apex {
9226 name: "myapex",
9227 key: "myapex.key",
9228 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009229 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009230 }
9231 apex_key {
9232 name: "myapex.key",
9233 public_key: "testkey.avbpubkey",
9234 private_key: "testkey.pem",
9235 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009236 `,
9237 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9238 variables.CompressedApex = proptools.BoolPtr(true)
9239 }),
9240 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009241
Jooyung Hana0503a52023-08-23 13:12:50 +09009242 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009243 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9244
Jooyung Hana0503a52023-08-23 13:12:50 +09009245 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009246 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9247
9248 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009249 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009250 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9251
9252 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009253 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009254 var builder strings.Builder
9255 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9256 androidMk := builder.String()
9257 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9258}
9259
Martin Stjernholm2856c662020-12-02 15:03:42 +00009260func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009261 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009262 apex {
9263 name: "myapex",
9264 key: "myapex.key",
9265 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009266 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009267 }
9268
9269 apex_key {
9270 name: "myapex.key",
9271 public_key: "testkey.avbpubkey",
9272 private_key: "testkey.pem",
9273 }
9274
9275 cc_library {
9276 name: "mylib",
9277 srcs: ["mylib.cpp"],
9278 apex_available: ["myapex"],
9279 shared_libs: ["otherlib"],
9280 system_shared_libs: [],
9281 }
9282
9283 cc_library {
9284 name: "otherlib",
9285 srcs: ["mylib.cpp"],
9286 stubs: {
9287 versions: ["current"],
9288 },
9289 }
9290
9291 cc_prebuilt_library_shared {
9292 name: "otherlib",
9293 prefer: true,
9294 srcs: ["prebuilt.so"],
9295 stubs: {
9296 versions: ["current"],
9297 },
9298 }
9299 `)
9300
Jooyung Hana0503a52023-08-23 13:12:50 +09009301 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009302 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009303 var builder strings.Builder
9304 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9305 androidMk := builder.String()
9306
9307 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9308 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009309 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009310}
9311
Jiyong Parke3867542020-12-03 17:28:25 +09009312func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009313 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009314 apex {
9315 name: "myapex",
9316 key: "myapex.key",
9317 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009318 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009319 }
9320
9321 apex_key {
9322 name: "myapex.key",
9323 public_key: "testkey.avbpubkey",
9324 private_key: "testkey.pem",
9325 }
9326
9327 cc_library {
9328 name: "mylib",
9329 srcs: ["mylib.cpp"],
9330 system_shared_libs: [],
9331 stl: "none",
9332 apex_available: ["myapex"],
9333 shared_libs: ["mylib2"],
9334 target: {
9335 apex: {
9336 exclude_shared_libs: ["mylib2"],
9337 },
9338 },
9339 }
9340
9341 cc_library {
9342 name: "mylib2",
9343 srcs: ["mylib.cpp"],
9344 system_shared_libs: [],
9345 stl: "none",
9346 }
9347 `)
9348
9349 // Check if mylib is linked to mylib2 for the non-apex target
9350 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9351 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9352
9353 // Make sure that the link doesn't occur for the apex target
9354 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9355 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9356
9357 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009358 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009359 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9360}
9361
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009362func TestPrebuiltStubLibDep(t *testing.T) {
9363 bpBase := `
9364 apex {
9365 name: "myapex",
9366 key: "myapex.key",
9367 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009368 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009369 }
9370 apex_key {
9371 name: "myapex.key",
9372 public_key: "testkey.avbpubkey",
9373 private_key: "testkey.pem",
9374 }
9375 cc_library {
9376 name: "mylib",
9377 srcs: ["mylib.cpp"],
9378 apex_available: ["myapex"],
9379 shared_libs: ["stublib"],
9380 system_shared_libs: [],
9381 }
9382 apex {
9383 name: "otherapex",
9384 enabled: %s,
9385 key: "myapex.key",
9386 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009387 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009388 }
9389 `
9390
9391 stublibSourceBp := `
9392 cc_library {
9393 name: "stublib",
9394 srcs: ["mylib.cpp"],
9395 apex_available: ["otherapex"],
9396 system_shared_libs: [],
9397 stl: "none",
9398 stubs: {
9399 versions: ["1"],
9400 },
9401 }
9402 `
9403
9404 stublibPrebuiltBp := `
9405 cc_prebuilt_library_shared {
9406 name: "stublib",
9407 srcs: ["prebuilt.so"],
9408 apex_available: ["otherapex"],
9409 stubs: {
9410 versions: ["1"],
9411 },
9412 %s
9413 }
9414 `
9415
9416 tests := []struct {
9417 name string
9418 stublibBp string
9419 usePrebuilt bool
9420 modNames []string // Modules to collect AndroidMkEntries for
9421 otherApexEnabled []string
9422 }{
9423 {
9424 name: "only_source",
9425 stublibBp: stublibSourceBp,
9426 usePrebuilt: false,
9427 modNames: []string{"stublib"},
9428 otherApexEnabled: []string{"true", "false"},
9429 },
9430 {
9431 name: "source_preferred",
9432 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9433 usePrebuilt: false,
9434 modNames: []string{"stublib", "prebuilt_stublib"},
9435 otherApexEnabled: []string{"true", "false"},
9436 },
9437 {
9438 name: "prebuilt_preferred",
9439 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9440 usePrebuilt: true,
9441 modNames: []string{"stublib", "prebuilt_stublib"},
9442 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9443 },
9444 {
9445 name: "only_prebuilt",
9446 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9447 usePrebuilt: true,
9448 modNames: []string{"stublib"},
9449 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9450 },
9451 }
9452
9453 for _, test := range tests {
9454 t.Run(test.name, func(t *testing.T) {
9455 for _, otherApexEnabled := range test.otherApexEnabled {
9456 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009457 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009458
9459 type modAndMkEntries struct {
9460 mod *cc.Module
9461 mkEntries android.AndroidMkEntries
9462 }
9463 entries := []*modAndMkEntries{}
9464
9465 // Gather shared lib modules that are installable
9466 for _, modName := range test.modNames {
9467 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9468 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9469 continue
9470 }
9471 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009472 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009473 continue
9474 }
Colin Crossaa255532020-07-03 13:18:24 -07009475 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009476 if ent.Disabled {
9477 continue
9478 }
9479 entries = append(entries, &modAndMkEntries{
9480 mod: mod,
9481 mkEntries: ent,
9482 })
9483 }
9484 }
9485 }
9486
9487 var entry *modAndMkEntries = nil
9488 for _, ent := range entries {
9489 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9490 if entry != nil {
9491 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9492 } else {
9493 entry = ent
9494 }
9495 }
9496 }
9497
9498 if entry == nil {
9499 t.Errorf("AndroidMk entry for \"stublib\" missing")
9500 } else {
9501 isPrebuilt := entry.mod.Prebuilt() != nil
9502 if isPrebuilt != test.usePrebuilt {
9503 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9504 }
9505 if !entry.mod.IsStubs() {
9506 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9507 }
9508 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9509 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9510 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009511 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009512 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009513 if !android.InList(expected, cflags) {
9514 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9515 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009516 }
9517 })
9518 }
9519 })
9520 }
9521}
9522
Colin Crossc33e5212021-05-25 18:16:02 -07009523func TestApexJavaCoverage(t *testing.T) {
9524 bp := `
9525 apex {
9526 name: "myapex",
9527 key: "myapex.key",
9528 java_libs: ["mylib"],
9529 bootclasspath_fragments: ["mybootclasspathfragment"],
9530 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9531 updatable: false,
9532 }
9533
9534 apex_key {
9535 name: "myapex.key",
9536 public_key: "testkey.avbpubkey",
9537 private_key: "testkey.pem",
9538 }
9539
9540 java_library {
9541 name: "mylib",
9542 srcs: ["mylib.java"],
9543 apex_available: ["myapex"],
9544 compile_dex: true,
9545 }
9546
9547 bootclasspath_fragment {
9548 name: "mybootclasspathfragment",
9549 contents: ["mybootclasspathlib"],
9550 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009551 hidden_api: {
9552 split_packages: ["*"],
9553 },
Colin Crossc33e5212021-05-25 18:16:02 -07009554 }
9555
9556 java_library {
9557 name: "mybootclasspathlib",
9558 srcs: ["mybootclasspathlib.java"],
9559 apex_available: ["myapex"],
9560 compile_dex: true,
9561 }
9562
9563 systemserverclasspath_fragment {
9564 name: "mysystemserverclasspathfragment",
9565 contents: ["mysystemserverclasspathlib"],
9566 apex_available: ["myapex"],
9567 }
9568
9569 java_library {
9570 name: "mysystemserverclasspathlib",
9571 srcs: ["mysystemserverclasspathlib.java"],
9572 apex_available: ["myapex"],
9573 compile_dex: true,
9574 }
9575 `
9576
9577 result := android.GroupFixturePreparers(
9578 PrepareForTestWithApexBuildComponents,
9579 prepareForTestWithMyapex,
9580 java.PrepareForTestWithJavaDefaultModules,
9581 android.PrepareForTestWithAndroidBuildComponents,
9582 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009583 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9584 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009585 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009586 ).RunTest(t)
9587
9588 // Make sure jacoco ran on both mylib and mybootclasspathlib
9589 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9590 t.Errorf("Failed to find jacoco rule for mylib")
9591 }
9592 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9593 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9594 }
9595 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9596 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9597 }
9598}
9599
Jiyong Park192600a2021-08-03 07:52:17 +00009600func TestProhibitStaticExecutable(t *testing.T) {
9601 testApexError(t, `executable mybin is static`, `
9602 apex {
9603 name: "myapex",
9604 key: "myapex.key",
9605 binaries: ["mybin"],
9606 min_sdk_version: "29",
9607 }
9608
9609 apex_key {
9610 name: "myapex.key",
9611 public_key: "testkey.avbpubkey",
9612 private_key: "testkey.pem",
9613 }
9614
9615 cc_binary {
9616 name: "mybin",
9617 srcs: ["mylib.cpp"],
9618 relative_install_path: "foo/bar",
9619 static_executable: true,
9620 system_shared_libs: [],
9621 stl: "none",
9622 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009623 min_sdk_version: "29",
9624 }
9625 `)
9626
9627 testApexError(t, `executable mybin.rust is static`, `
9628 apex {
9629 name: "myapex",
9630 key: "myapex.key",
9631 binaries: ["mybin.rust"],
9632 min_sdk_version: "29",
9633 }
9634
9635 apex_key {
9636 name: "myapex.key",
9637 public_key: "testkey.avbpubkey",
9638 private_key: "testkey.pem",
9639 }
9640
9641 rust_binary {
9642 name: "mybin.rust",
9643 srcs: ["foo.rs"],
9644 static_executable: true,
9645 apex_available: ["myapex"],
9646 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009647 }
9648 `)
9649}
9650
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009651func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9652 ctx := testApex(t, `
9653 apex {
9654 name: "myapex",
9655 key: "myapex.key",
9656 updatable: false,
9657 java_libs: ["foo"],
9658 }
9659
9660 apex_key {
9661 name: "myapex.key",
9662 public_key: "testkey.avbpubkey",
9663 private_key: "testkey.pem",
9664 }
9665
9666 java_library {
9667 name: "foo",
9668 srcs: ["foo.java"],
9669 apex_available: ["myapex"],
9670 installable: true,
9671 }
9672 `,
9673 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9674 )
9675
Jooyung Hana0503a52023-08-23 13:12:50 +09009676 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009677 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9678 var builder strings.Builder
9679 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9680 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009681 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009682}
9683
9684func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9685 ctx := testApex(t, `
9686 prebuilt_apex {
9687 name: "myapex",
9688 arch: {
9689 arm64: {
9690 src: "myapex-arm64.apex",
9691 },
9692 arm: {
9693 src: "myapex-arm.apex",
9694 },
9695 },
9696 exported_java_libs: ["foo"],
9697 }
9698
9699 java_import {
9700 name: "foo",
9701 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009702 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009703 }
9704 `,
9705 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9706 )
9707
9708 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9709 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9710 mainModuleEntries := entriesList[0]
9711 android.AssertArrayString(t,
9712 "LOCAL_REQUIRED_MODULES",
9713 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9714 []string{
9715 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9716 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9717 })
9718}
9719
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009720func TestAndroidMk_RequiredModules(t *testing.T) {
9721 ctx := testApex(t, `
9722 apex {
9723 name: "myapex",
9724 key: "myapex.key",
9725 updatable: false,
9726 java_libs: ["foo"],
9727 required: ["otherapex"],
9728 }
9729
9730 apex {
9731 name: "otherapex",
9732 key: "myapex.key",
9733 updatable: false,
9734 java_libs: ["foo"],
9735 required: ["otherapex"],
9736 }
9737
9738 apex_key {
9739 name: "myapex.key",
9740 public_key: "testkey.avbpubkey",
9741 private_key: "testkey.pem",
9742 }
9743
9744 java_library {
9745 name: "foo",
9746 srcs: ["foo.java"],
9747 apex_available: ["myapex", "otherapex"],
9748 installable: true,
9749 }
9750 `)
9751
Jooyung Hana0503a52023-08-23 13:12:50 +09009752 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009753 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9754 var builder strings.Builder
9755 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9756 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009757 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009758}
9759
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009760func TestAndroidMk_RequiredDeps(t *testing.T) {
9761 ctx := testApex(t, `
9762 apex {
9763 name: "myapex",
9764 key: "myapex.key",
9765 updatable: false,
9766 }
9767
9768 apex_key {
9769 name: "myapex.key",
9770 public_key: "testkey.avbpubkey",
9771 private_key: "testkey.pem",
9772 }
9773 `)
9774
Jooyung Hana0503a52023-08-23 13:12:50 +09009775 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009776 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009777 data := android.AndroidMkDataForTest(t, ctx, bundle)
9778 var builder strings.Builder
9779 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9780 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009781 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009782}
9783
Jooyung Hana6d36672022-02-24 13:58:07 +09009784func TestApexOutputFileProducer(t *testing.T) {
9785 for _, tc := range []struct {
9786 name string
9787 ref string
9788 expected_data []string
9789 }{
9790 {
9791 name: "test_using_output",
9792 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009793 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009794 },
9795 {
9796 name: "test_using_apex",
9797 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009798 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009799 },
9800 } {
9801 t.Run(tc.name, func(t *testing.T) {
9802 ctx := testApex(t, `
9803 apex {
9804 name: "myapex",
9805 key: "myapex.key",
9806 compressible: true,
9807 updatable: false,
9808 }
9809
9810 apex_key {
9811 name: "myapex.key",
9812 public_key: "testkey.avbpubkey",
9813 private_key: "testkey.pem",
9814 }
9815
9816 java_test {
9817 name: "`+tc.name+`",
9818 srcs: ["a.java"],
9819 data: ["`+tc.ref+`"],
9820 }
9821 `,
9822 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9823 variables.CompressedApex = proptools.BoolPtr(true)
9824 }))
9825 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9826 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9827 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9828 })
9829 }
9830}
9831
satayev758968a2021-12-06 11:42:40 +00009832func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9833 preparer := android.GroupFixturePreparers(
9834 PrepareForTestWithApexBuildComponents,
9835 prepareForTestWithMyapex,
9836 java.PrepareForTestWithJavaSdkLibraryFiles,
9837 java.PrepareForTestWithJavaDefaultModules,
9838 android.PrepareForTestWithAndroidBuildComponents,
9839 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9840 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9841 )
9842
9843 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9844 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9845 preparer.RunTestWithBp(t, `
9846 apex {
9847 name: "myapex",
9848 key: "myapex.key",
9849 bootclasspath_fragments: ["mybootclasspathfragment"],
9850 min_sdk_version: "30",
9851 updatable: false,
9852 }
9853
9854 apex_key {
9855 name: "myapex.key",
9856 public_key: "testkey.avbpubkey",
9857 private_key: "testkey.pem",
9858 }
9859
9860 bootclasspath_fragment {
9861 name: "mybootclasspathfragment",
9862 contents: ["mybootclasspathlib"],
9863 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009864 hidden_api: {
9865 split_packages: ["*"],
9866 },
satayev758968a2021-12-06 11:42:40 +00009867 }
9868
9869 java_sdk_library {
9870 name: "mybootclasspathlib",
9871 srcs: ["mybootclasspathlib.java"],
9872 apex_available: ["myapex"],
9873 compile_dex: true,
9874 unsafe_ignore_missing_latest_api: true,
9875 min_sdk_version: "31",
9876 static_libs: ["util"],
9877 }
9878
9879 java_library {
9880 name: "util",
9881 srcs: ["a.java"],
9882 apex_available: ["myapex"],
9883 min_sdk_version: "31",
9884 static_libs: ["another_util"],
9885 }
9886
9887 java_library {
9888 name: "another_util",
9889 srcs: ["a.java"],
9890 min_sdk_version: "31",
9891 apex_available: ["myapex"],
9892 }
9893 `)
9894 })
9895
9896 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9897 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9898 preparer.RunTestWithBp(t, `
9899 apex {
9900 name: "myapex",
9901 key: "myapex.key",
9902 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9903 min_sdk_version: "30",
9904 updatable: false,
9905 }
9906
9907 apex_key {
9908 name: "myapex.key",
9909 public_key: "testkey.avbpubkey",
9910 private_key: "testkey.pem",
9911 }
9912
9913 systemserverclasspath_fragment {
9914 name: "mysystemserverclasspathfragment",
9915 contents: ["mysystemserverclasspathlib"],
9916 apex_available: ["myapex"],
9917 }
9918
9919 java_sdk_library {
9920 name: "mysystemserverclasspathlib",
9921 srcs: ["mysystemserverclasspathlib.java"],
9922 apex_available: ["myapex"],
9923 compile_dex: true,
9924 min_sdk_version: "32",
9925 unsafe_ignore_missing_latest_api: true,
9926 static_libs: ["util"],
9927 }
9928
9929 java_library {
9930 name: "util",
9931 srcs: ["a.java"],
9932 apex_available: ["myapex"],
9933 min_sdk_version: "31",
9934 static_libs: ["another_util"],
9935 }
9936
9937 java_library {
9938 name: "another_util",
9939 srcs: ["a.java"],
9940 min_sdk_version: "31",
9941 apex_available: ["myapex"],
9942 }
9943 `)
9944 })
9945
9946 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9947 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9948 RunTestWithBp(t, `
9949 apex {
9950 name: "myapex",
9951 key: "myapex.key",
9952 bootclasspath_fragments: ["mybootclasspathfragment"],
9953 min_sdk_version: "30",
9954 updatable: false,
9955 }
9956
9957 apex_key {
9958 name: "myapex.key",
9959 public_key: "testkey.avbpubkey",
9960 private_key: "testkey.pem",
9961 }
9962
9963 bootclasspath_fragment {
9964 name: "mybootclasspathfragment",
9965 contents: ["mybootclasspathlib"],
9966 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009967 hidden_api: {
9968 split_packages: ["*"],
9969 },
satayev758968a2021-12-06 11:42:40 +00009970 }
9971
9972 java_sdk_library {
9973 name: "mybootclasspathlib",
9974 srcs: ["mybootclasspathlib.java"],
9975 apex_available: ["myapex"],
9976 compile_dex: true,
9977 unsafe_ignore_missing_latest_api: true,
9978 }
9979 `)
9980 })
9981
9982 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9983 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9984 RunTestWithBp(t, `
9985 apex {
9986 name: "myapex",
9987 key: "myapex.key",
9988 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9989 min_sdk_version: "30",
9990 updatable: false,
9991 }
9992
9993 apex_key {
9994 name: "myapex.key",
9995 public_key: "testkey.avbpubkey",
9996 private_key: "testkey.pem",
9997 }
9998
9999 systemserverclasspath_fragment {
10000 name: "mysystemserverclasspathfragment",
10001 contents: ["mysystemserverclasspathlib"],
10002 apex_available: ["myapex"],
10003 }
10004
10005 java_sdk_library {
10006 name: "mysystemserverclasspathlib",
10007 srcs: ["mysystemserverclasspathlib.java"],
10008 apex_available: ["myapex"],
10009 compile_dex: true,
10010 unsafe_ignore_missing_latest_api: true,
10011 }
10012 `)
10013 })
10014}
10015
Jiakai Zhang6decef92022-01-12 17:56:19 +000010016// Verifies that the APEX depends on all the Make modules in the list.
10017func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10018 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10019 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010020 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010021 }
10022}
10023
10024// Verifies that the APEX does not depend on any of the Make modules in the list.
10025func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10026 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10027 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010028 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010029 }
10030}
10031
Cole Faust1021ccd2023-02-26 21:15:25 -080010032// TODO(b/193460475): Re-enable this test
10033//func TestApexStrictUpdtabilityLint(t *testing.T) {
10034// bpTemplate := `
10035// apex {
10036// name: "myapex",
10037// key: "myapex.key",
10038// java_libs: ["myjavalib"],
10039// updatable: %v,
10040// min_sdk_version: "29",
10041// }
10042// apex_key {
10043// name: "myapex.key",
10044// }
10045// java_library {
10046// name: "myjavalib",
10047// srcs: ["MyClass.java"],
10048// apex_available: [ "myapex" ],
10049// lint: {
10050// strict_updatability_linting: %v,
10051// },
10052// sdk_version: "current",
10053// min_sdk_version: "29",
10054// }
10055// `
10056// fs := android.MockFS{
10057// "lint-baseline.xml": nil,
10058// }
10059//
10060// testCases := []struct {
10061// testCaseName string
10062// apexUpdatable bool
10063// javaStrictUpdtabilityLint bool
10064// lintFileExists bool
10065// disallowedFlagExpected bool
10066// }{
10067// {
10068// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10069// apexUpdatable: true,
10070// javaStrictUpdtabilityLint: true,
10071// lintFileExists: false,
10072// disallowedFlagExpected: false,
10073// },
10074// {
10075// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10076// apexUpdatable: false,
10077// javaStrictUpdtabilityLint: false,
10078// lintFileExists: true,
10079// disallowedFlagExpected: false,
10080// },
10081// {
10082// testCaseName: "non-updatable apex respects strict updatability of javalib",
10083// apexUpdatable: false,
10084// javaStrictUpdtabilityLint: true,
10085// lintFileExists: true,
10086// disallowedFlagExpected: true,
10087// },
10088// {
10089// testCaseName: "updatable apex sets strict updatability of javalib to true",
10090// apexUpdatable: true,
10091// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10092// lintFileExists: true,
10093// disallowedFlagExpected: true,
10094// },
10095// }
10096//
10097// for _, testCase := range testCases {
10098// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10099// fixtures := []android.FixturePreparer{}
10100// if testCase.lintFileExists {
10101// fixtures = append(fixtures, fs.AddToFixture())
10102// }
10103//
10104// result := testApex(t, bp, fixtures...)
10105// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10106// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10107// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10108//
10109// if disallowedFlagActual != testCase.disallowedFlagExpected {
10110// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10111// }
10112// }
10113//}
10114//
10115//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10116// bp := `
10117// apex {
10118// name: "myapex",
10119// key: "myapex.key",
10120// java_libs: ["myjavalib"],
10121// updatable: true,
10122// min_sdk_version: "29",
10123// }
10124// apex_key {
10125// name: "myapex.key",
10126// }
10127// java_library {
10128// name: "myjavalib",
10129// srcs: ["MyClass.java"],
10130// apex_available: [ "myapex" ],
10131// sdk_version: "current",
10132// min_sdk_version: "29",
10133// }
10134// `
10135//
10136// testCases := []struct {
10137// testCaseName string
10138// moduleDirectory string
10139// disallowedFlagExpected bool
10140// }{
10141// {
10142// testCaseName: "lintable module defined outside libcore",
10143// moduleDirectory: "",
10144// disallowedFlagExpected: true,
10145// },
10146// {
10147// testCaseName: "lintable module defined in libcore root directory",
10148// moduleDirectory: "libcore/",
10149// disallowedFlagExpected: false,
10150// },
10151// {
10152// testCaseName: "lintable module defined in libcore child directory",
10153// moduleDirectory: "libcore/childdir/",
10154// disallowedFlagExpected: true,
10155// },
10156// }
10157//
10158// for _, testCase := range testCases {
10159// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10160// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10161// result := testApex(t, "", lintFileCreator, bpFileCreator)
10162// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10163// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10164// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10165// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10166//
10167// if disallowedFlagActual != testCase.disallowedFlagExpected {
10168// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10169// }
10170// }
10171//}
10172//
10173//// checks transtive deps of an apex coming from bootclasspath_fragment
10174//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10175// bp := `
10176// apex {
10177// name: "myapex",
10178// key: "myapex.key",
10179// bootclasspath_fragments: ["mybootclasspathfragment"],
10180// updatable: true,
10181// min_sdk_version: "29",
10182// }
10183// apex_key {
10184// name: "myapex.key",
10185// }
10186// bootclasspath_fragment {
10187// name: "mybootclasspathfragment",
10188// contents: ["myjavalib"],
10189// apex_available: ["myapex"],
10190// hidden_api: {
10191// split_packages: ["*"],
10192// },
10193// }
10194// java_library {
10195// name: "myjavalib",
10196// srcs: ["MyClass.java"],
10197// apex_available: [ "myapex" ],
10198// sdk_version: "current",
10199// min_sdk_version: "29",
10200// compile_dex: true,
10201// }
10202// `
10203// fs := android.MockFS{
10204// "lint-baseline.xml": nil,
10205// }
10206//
10207// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10208// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10209// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10210// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10211// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10212// }
10213//}
Spandan Das66773252022-01-15 00:23:18 +000010214
Spandan Das42e89502022-05-06 22:12:55 +000010215// updatable apexes should propagate updatable=true to its apps
10216func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10217 bp := `
10218 apex {
10219 name: "myapex",
10220 key: "myapex.key",
10221 updatable: %v,
10222 apps: [
10223 "myapp",
10224 ],
10225 min_sdk_version: "30",
10226 }
10227 apex_key {
10228 name: "myapex.key",
10229 }
10230 android_app {
10231 name: "myapp",
10232 updatable: %v,
10233 apex_available: [
10234 "myapex",
10235 ],
10236 sdk_version: "current",
10237 min_sdk_version: "30",
10238 }
10239 `
10240 testCases := []struct {
10241 name string
10242 apex_is_updatable_bp bool
10243 app_is_updatable_bp bool
10244 app_is_updatable_expected bool
10245 }{
10246 {
10247 name: "Non-updatable apex respects updatable property of non-updatable app",
10248 apex_is_updatable_bp: false,
10249 app_is_updatable_bp: false,
10250 app_is_updatable_expected: false,
10251 },
10252 {
10253 name: "Non-updatable apex respects updatable property of updatable app",
10254 apex_is_updatable_bp: false,
10255 app_is_updatable_bp: true,
10256 app_is_updatable_expected: true,
10257 },
10258 {
10259 name: "Updatable apex respects updatable property of updatable app",
10260 apex_is_updatable_bp: true,
10261 app_is_updatable_bp: true,
10262 app_is_updatable_expected: true,
10263 },
10264 {
10265 name: "Updatable apex sets updatable=true on non-updatable app",
10266 apex_is_updatable_bp: true,
10267 app_is_updatable_bp: false,
10268 app_is_updatable_expected: true,
10269 },
10270 }
10271 for _, testCase := range testCases {
10272 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10273 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10274 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10275 }
10276}
10277
Kiyoung Kim487689e2022-07-26 09:48:22 +090010278func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10279 bp := `
10280 apex {
10281 name: "myapex",
10282 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010283 native_shared_libs: ["libbaz"],
10284 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010285 min_sdk_version: "29",
10286 }
10287 apex_key {
10288 name: "myapex.key",
10289 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010290 cc_binary {
10291 name: "binfoo",
10292 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010293 apex_available: ["myapex"],
10294 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010295 recovery_available: false,
10296 }
10297 cc_library {
10298 name: "libbar",
10299 srcs: ["libbar.cc"],
10300 stubs: {
10301 symbol_file: "libbar.map.txt",
10302 versions: [
10303 "29",
10304 ],
10305 },
10306 }
10307 cc_library {
10308 name: "libbaz",
10309 srcs: ["libbaz.cc"],
10310 apex_available: ["myapex"],
10311 min_sdk_version: "29",
10312 stubs: {
10313 symbol_file: "libbaz.map.txt",
10314 versions: [
10315 "29",
10316 ],
10317 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010318 }
10319 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010320 name: "libbar",
10321 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010322 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010323 variants: ["apex.29"],
10324 }
10325 cc_api_variant {
10326 name: "libbar",
10327 variant: "apex",
10328 version: "29",
10329 src: "libbar_apex_29.so",
10330 }
10331 cc_api_library {
10332 name: "libbaz",
10333 src: "libbaz_stub.so",
10334 min_sdk_version: "29",
10335 variants: ["apex.29"],
10336 }
10337 cc_api_variant {
10338 name: "libbaz",
10339 variant: "apex",
10340 version: "29",
10341 src: "libbaz_apex_29.so",
10342 }
10343 cc_api_library {
10344 name: "libqux",
10345 src: "libqux_stub.so",
10346 min_sdk_version: "29",
10347 variants: ["apex.29"],
10348 }
10349 cc_api_variant {
10350 name: "libqux",
10351 variant: "apex",
10352 version: "29",
10353 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010354 }
10355 api_imports {
10356 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010357 apex_shared_libs: [
10358 "libbar",
10359 "libbaz",
10360 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010361 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010362 }
10363 `
10364 result := testApex(t, bp)
10365
10366 hasDep := func(m android.Module, wantDep android.Module) bool {
10367 t.Helper()
10368 var found bool
10369 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10370 if dep == wantDep {
10371 found = true
10372 }
10373 })
10374 return found
10375 }
10376
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010377 // Library defines stubs and cc_api_library should be used with cc_api_library
10378 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10379 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10380 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010381
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010382 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10383 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010384
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010385 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10386 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10387 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10388 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10389
10390 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10391 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10392 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10393 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10394 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10395
10396 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10397 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10398 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10399
10400 // cc_api_library defined without original library should be linked with cc_api_library
10401 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10402 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10403 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10404}
10405
10406func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10407 bp := `
10408 apex {
10409 name: "myapex",
10410 key: "myapex.key",
10411 native_shared_libs: ["libbar"],
10412 min_sdk_version: "29",
10413 }
10414 apex_key {
10415 name: "myapex.key",
10416 }
10417 cc_binary {
10418 name: "binfoo",
10419 shared_libs: ["libbar"],
10420 recovery_available: false,
10421 }
10422 cc_library {
10423 name: "libbar",
10424 srcs: ["libbar.cc"],
10425 apex_available: ["myapex"],
10426 min_sdk_version: "29",
10427 stubs: {
10428 symbol_file: "libbar.map.txt",
10429 versions: [
10430 "29",
10431 ],
10432 },
10433 }
10434 cc_api_library {
10435 name: "libbar",
10436 src: "libbar_stub.so",
10437 variants: ["apex.29"],
10438 }
10439 cc_api_variant {
10440 name: "libbar",
10441 variant: "apex",
10442 version: "29",
10443 src: "libbar_apex_29.so",
10444 }
10445 api_imports {
10446 name: "api_imports",
10447 apex_shared_libs: [
10448 "libbar",
10449 ],
10450 }
10451 `
10452
10453 result := testApex(t, bp)
10454
10455 hasDep := func(m android.Module, wantDep android.Module) bool {
10456 t.Helper()
10457 var found bool
10458 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10459 if dep == wantDep {
10460 found = true
10461 }
10462 })
10463 return found
10464 }
10465
10466 // Library defines stubs and cc_api_library should be used with cc_api_library
10467 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10468 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10469 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10470
10471 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10472 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10473
10474 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10475 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10476 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10477 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010478}
Dennis Shend4f5d932023-01-31 20:27:21 +000010479
10480func TestTrimmedApex(t *testing.T) {
10481 bp := `
10482 apex {
10483 name: "myapex",
10484 key: "myapex.key",
10485 native_shared_libs: ["libfoo","libbaz"],
10486 min_sdk_version: "29",
10487 trim_against: "mydcla",
10488 }
10489 apex {
10490 name: "mydcla",
10491 key: "myapex.key",
10492 native_shared_libs: ["libfoo","libbar"],
10493 min_sdk_version: "29",
10494 file_contexts: ":myapex-file_contexts",
10495 dynamic_common_lib_apex: true,
10496 }
10497 apex_key {
10498 name: "myapex.key",
10499 }
10500 cc_library {
10501 name: "libfoo",
10502 shared_libs: ["libc"],
10503 apex_available: ["myapex","mydcla"],
10504 min_sdk_version: "29",
10505 }
10506 cc_library {
10507 name: "libbar",
10508 shared_libs: ["libc"],
10509 apex_available: ["myapex","mydcla"],
10510 min_sdk_version: "29",
10511 }
10512 cc_library {
10513 name: "libbaz",
10514 shared_libs: ["libc"],
10515 apex_available: ["myapex","mydcla"],
10516 min_sdk_version: "29",
10517 }
10518 cc_api_library {
10519 name: "libc",
10520 src: "libc.so",
10521 min_sdk_version: "29",
10522 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010523 vendor_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010524 }
10525 api_imports {
10526 name: "api_imports",
10527 shared_libs: [
10528 "libc",
10529 ],
10530 header_libs: [],
10531 }
10532 `
10533 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010534 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010535 apexRule := module.MaybeRule("apexRule")
10536 if apexRule.Rule == nil {
10537 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10538 }
10539
10540 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010541 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010542 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10543 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10544 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10545 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10546}
Jingwen Chendea7a642023-03-28 11:30:50 +000010547
10548func TestCannedFsConfig(t *testing.T) {
10549 ctx := testApex(t, `
10550 apex {
10551 name: "myapex",
10552 key: "myapex.key",
10553 updatable: false,
10554 }
10555
10556 apex_key {
10557 name: "myapex.key",
10558 public_key: "testkey.avbpubkey",
10559 private_key: "testkey.pem",
10560 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010561 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010562 generateFsRule := mod.Rule("generateFsConfig")
10563 cmd := generateFsRule.RuleParams.Command
10564
10565 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10566}
10567
10568func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10569 ctx := testApex(t, `
10570 apex {
10571 name: "myapex",
10572 key: "myapex.key",
10573 canned_fs_config: "my_config",
10574 updatable: false,
10575 }
10576
10577 apex_key {
10578 name: "myapex.key",
10579 public_key: "testkey.avbpubkey",
10580 private_key: "testkey.pem",
10581 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010582 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010583 generateFsRule := mod.Rule("generateFsConfig")
10584 cmd := generateFsRule.RuleParams.Command
10585
10586 // Ensure that canned_fs_config has "cat my_config" at the end
10587 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10588}
Spandan Das20fce2d2023-04-12 17:21:39 +000010589
10590func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10591 testCases := []struct {
10592 desc string
10593 hasStubs bool
10594 apexAvailable string
10595 expectedError string
10596 }{
10597 {
10598 desc: "non-stub library can have multiple apex_available",
10599 hasStubs: false,
10600 apexAvailable: `["myapex", "otherapex"]`,
10601 },
10602 {
10603 desc: "stub library should not be available to anyapex",
10604 hasStubs: true,
10605 apexAvailable: `["//apex_available:anyapex"]`,
10606 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10607 },
10608 {
10609 desc: "stub library should not be available to multiple apexes",
10610 hasStubs: true,
10611 apexAvailable: `["myapex", "otherapex"]`,
10612 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10613 },
10614 {
10615 desc: "stub library can be available to a core apex and a test apex",
10616 hasStubs: true,
10617 apexAvailable: `["myapex", "test_myapex"]`,
10618 },
10619 }
10620 bpTemplate := `
10621 cc_library {
10622 name: "libfoo",
10623 %v
10624 apex_available: %v,
10625 }
10626 apex {
10627 name: "myapex",
10628 key: "apex.key",
10629 updatable: false,
10630 native_shared_libs: ["libfoo"],
10631 }
10632 apex {
10633 name: "otherapex",
10634 key: "apex.key",
10635 updatable: false,
10636 }
10637 apex_test {
10638 name: "test_myapex",
10639 key: "apex.key",
10640 updatable: false,
10641 native_shared_libs: ["libfoo"],
10642 }
10643 apex_key {
10644 name: "apex.key",
10645 }
10646 `
10647 for _, tc := range testCases {
10648 stubs := ""
10649 if tc.hasStubs {
10650 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10651 }
10652 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10653 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10654 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10655 })
10656 if tc.expectedError == "" {
10657 testApex(t, bp, mockFsFixturePreparer)
10658 } else {
10659 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10660 }
10661 }
10662}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010663
10664func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10665 context := android.GroupFixturePreparers(
10666 android.PrepareForIntegrationTestWithAndroid,
10667 cc.PrepareForIntegrationTestWithCc,
10668 PrepareForTestWithApexBuildComponents,
10669 prepareForTestWithMyapex,
10670 filesystem.PrepareForTestWithFilesystemBuildComponents,
10671 )
10672 result := context.RunTestWithBp(t, `
10673 android_system_image {
10674 name: "myfilesystem",
10675 deps: [
10676 "libfoo",
10677 ],
10678 linker_config_src: "linker.config.json",
10679 }
10680
10681 cc_library {
10682 name: "libfoo",
10683 shared_libs: [
10684 "libbar",
10685 ],
10686 stl: "none",
10687 }
10688
10689 cc_library {
10690 name: "libbar",
10691 stl: "none",
10692 apex_available: ["myapex"],
10693 }
10694
10695 apex {
10696 name: "myapex",
10697 native_shared_libs: ["libbar"],
10698 key: "myapex.key",
10699 updatable: false,
10700 }
10701
10702 apex_key {
10703 name: "myapex.key",
10704 public_key: "testkey.avbpubkey",
10705 private_key: "testkey.pem",
10706 }
10707 `)
10708
10709 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10710 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10711 inputs.Strings(),
10712 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10713}