blob: 2bed554b134fddf121da36d66fdbd0df2c7d588a [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 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003091 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003092
3093 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003094 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003095 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3096 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3097 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3098 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3099}
3100
Jooyung Han8e5685d2020-09-21 11:02:57 +09003101func TestApex_withPrebuiltFirmware(t *testing.T) {
3102 testCases := []struct {
3103 name string
3104 additionalProp string
3105 }{
3106 {"system apex with prebuilt_firmware", ""},
3107 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3108 }
3109 for _, tc := range testCases {
3110 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003111 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003112 apex {
3113 name: "myapex",
3114 key: "myapex.key",
3115 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003116 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003117 `+tc.additionalProp+`
3118 }
3119 apex_key {
3120 name: "myapex.key",
3121 public_key: "testkey.avbpubkey",
3122 private_key: "testkey.pem",
3123 }
3124 prebuilt_firmware {
3125 name: "myfirmware",
3126 src: "myfirmware.bin",
3127 filename_from_src: true,
3128 `+tc.additionalProp+`
3129 }
3130 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003131 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003132 "etc/firmware/myfirmware.bin",
3133 })
3134 })
3135 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003136}
3137
Jooyung Hanefb184e2020-06-25 17:14:25 +09003138func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003139 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003140 apex {
3141 name: "myapex",
3142 key: "myapex.key",
3143 vendor: true,
3144 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003145 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003146 }
3147
3148 apex_key {
3149 name: "myapex.key",
3150 public_key: "testkey.avbpubkey",
3151 private_key: "testkey.pem",
3152 }
3153
3154 cc_library {
3155 name: "mylib",
3156 vendor_available: true,
3157 }
3158 `)
3159
Jooyung Hana0503a52023-08-23 13:12:50 +09003160 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003161 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003162 name := apexBundle.BaseModuleName()
3163 prefix := "TARGET_"
3164 var builder strings.Builder
3165 data.Custom(&builder, name, prefix, "", data)
3166 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003167 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 +09003168}
3169
Jooyung Han2ed99d02020-06-24 23:26:26 +09003170func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003171 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003172 apex {
3173 name: "myapex",
3174 key: "myapex.key",
3175 vintf_fragments: ["fragment.xml"],
3176 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003177 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003178 }
3179 apex_key {
3180 name: "myapex.key",
3181 public_key: "testkey.avbpubkey",
3182 private_key: "testkey.pem",
3183 }
3184 cc_binary {
3185 name: "mybin",
3186 }
3187 `)
3188
Jooyung Hana0503a52023-08-23 13:12:50 +09003189 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003190 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003191 name := apexBundle.BaseModuleName()
3192 prefix := "TARGET_"
3193 var builder strings.Builder
3194 data.Custom(&builder, name, prefix, "", data)
3195 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003196 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003197 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003198}
3199
Jiyong Park16e91a02018-12-20 18:18:08 +09003200func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003201 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003202 apex {
3203 name: "myapex",
3204 key: "myapex.key",
3205 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003206 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003207 }
3208
3209 apex_key {
3210 name: "myapex.key",
3211 public_key: "testkey.avbpubkey",
3212 private_key: "testkey.pem",
3213 }
3214
3215 cc_library {
3216 name: "mylib",
3217 srcs: ["mylib.cpp"],
3218 system_shared_libs: [],
3219 stl: "none",
3220 stubs: {
3221 versions: ["1", "2", "3"],
3222 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003223 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003224 }
3225
3226 cc_binary {
3227 name: "not_in_apex",
3228 srcs: ["mylib.cpp"],
3229 static_libs: ["mylib"],
3230 static_executable: true,
3231 system_shared_libs: [],
3232 stl: "none",
3233 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003234 `)
3235
Colin Cross7113d202019-11-20 16:39:12 -08003236 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003237
3238 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003239 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003240}
Jiyong Park9335a262018-12-24 11:31:58 +09003241
3242func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003243 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003244 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003245 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003246 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003247 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003248 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003249 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003250 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003251 }
3252
3253 cc_library {
3254 name: "mylib",
3255 srcs: ["mylib.cpp"],
3256 system_shared_libs: [],
3257 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003258 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003259 }
3260
3261 apex_key {
3262 name: "myapex.key",
3263 public_key: "testkey.avbpubkey",
3264 private_key: "testkey.pem",
3265 }
3266
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003267 android_app_certificate {
3268 name: "myapex.certificate",
3269 certificate: "testkey",
3270 }
3271
3272 android_app_certificate {
3273 name: "myapex.certificate.override",
3274 certificate: "testkey.override",
3275 }
3276
Jiyong Park9335a262018-12-24 11:31:58 +09003277 `)
3278
3279 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003280 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003281
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003282 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3283 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003284 "vendor/foo/devkeys/testkey.avbpubkey")
3285 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003286 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3287 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003288 "vendor/foo/devkeys/testkey.pem")
3289 }
3290
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003291 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003292 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003293 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003294 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003295 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003296 }
3297}
Jiyong Park58e364a2019-01-19 19:24:06 +09003298
Jooyung Hanf121a652019-12-17 14:30:11 +09003299func TestCertificate(t *testing.T) {
3300 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003301 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003302 apex {
3303 name: "myapex",
3304 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003305 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003306 }
3307 apex_key {
3308 name: "myapex.key",
3309 public_key: "testkey.avbpubkey",
3310 private_key: "testkey.pem",
3311 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003312 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003313 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3314 if actual := rule.Args["certificates"]; actual != expected {
3315 t.Errorf("certificates should be %q, not %q", expected, actual)
3316 }
3317 })
3318 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003319 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003320 apex {
3321 name: "myapex_keytest",
3322 key: "myapex.key",
3323 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003324 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003325 }
3326 apex_key {
3327 name: "myapex.key",
3328 public_key: "testkey.avbpubkey",
3329 private_key: "testkey.pem",
3330 }
3331 android_app_certificate {
3332 name: "myapex.certificate.override",
3333 certificate: "testkey.override",
3334 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003335 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003336 expected := "testkey.override.x509.pem testkey.override.pk8"
3337 if actual := rule.Args["certificates"]; actual != expected {
3338 t.Errorf("certificates should be %q, not %q", expected, actual)
3339 }
3340 })
3341 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003342 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003343 apex {
3344 name: "myapex",
3345 key: "myapex.key",
3346 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003347 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003348 }
3349 apex_key {
3350 name: "myapex.key",
3351 public_key: "testkey.avbpubkey",
3352 private_key: "testkey.pem",
3353 }
3354 android_app_certificate {
3355 name: "myapex.certificate",
3356 certificate: "testkey",
3357 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003358 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003359 expected := "testkey.x509.pem testkey.pk8"
3360 if actual := rule.Args["certificates"]; actual != expected {
3361 t.Errorf("certificates should be %q, not %q", expected, actual)
3362 }
3363 })
3364 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003365 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003366 apex {
3367 name: "myapex_keytest",
3368 key: "myapex.key",
3369 file_contexts: ":myapex-file_contexts",
3370 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003371 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003372 }
3373 apex_key {
3374 name: "myapex.key",
3375 public_key: "testkey.avbpubkey",
3376 private_key: "testkey.pem",
3377 }
3378 android_app_certificate {
3379 name: "myapex.certificate.override",
3380 certificate: "testkey.override",
3381 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003382 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003383 expected := "testkey.override.x509.pem testkey.override.pk8"
3384 if actual := rule.Args["certificates"]; actual != expected {
3385 t.Errorf("certificates should be %q, not %q", expected, actual)
3386 }
3387 })
3388 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003389 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003390 apex {
3391 name: "myapex",
3392 key: "myapex.key",
3393 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003394 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003395 }
3396 apex_key {
3397 name: "myapex.key",
3398 public_key: "testkey.avbpubkey",
3399 private_key: "testkey.pem",
3400 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003401 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003402 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3403 if actual := rule.Args["certificates"]; actual != expected {
3404 t.Errorf("certificates should be %q, not %q", expected, actual)
3405 }
3406 })
3407 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003408 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003409 apex {
3410 name: "myapex_keytest",
3411 key: "myapex.key",
3412 file_contexts: ":myapex-file_contexts",
3413 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003414 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003415 }
3416 apex_key {
3417 name: "myapex.key",
3418 public_key: "testkey.avbpubkey",
3419 private_key: "testkey.pem",
3420 }
3421 android_app_certificate {
3422 name: "myapex.certificate.override",
3423 certificate: "testkey.override",
3424 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003425 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003426 expected := "testkey.override.x509.pem testkey.override.pk8"
3427 if actual := rule.Args["certificates"]; actual != expected {
3428 t.Errorf("certificates should be %q, not %q", expected, actual)
3429 }
3430 })
3431}
3432
Jiyong Park58e364a2019-01-19 19:24:06 +09003433func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003434 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003435 apex {
3436 name: "myapex",
3437 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003438 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003439 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003440 }
3441
3442 apex {
3443 name: "otherapex",
3444 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003445 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003446 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003447 }
3448
3449 apex_key {
3450 name: "myapex.key",
3451 public_key: "testkey.avbpubkey",
3452 private_key: "testkey.pem",
3453 }
3454
3455 cc_library {
3456 name: "mylib",
3457 srcs: ["mylib.cpp"],
3458 system_shared_libs: [],
3459 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003460 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003461 "myapex",
3462 "otherapex",
3463 ],
Jooyung Han24282772020-03-21 23:20:55 +09003464 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003465 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003466 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003467 cc_library {
3468 name: "mylib2",
3469 srcs: ["mylib.cpp"],
3470 system_shared_libs: [],
3471 stl: "none",
3472 apex_available: [
3473 "myapex",
3474 "otherapex",
3475 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003476 static_libs: ["mylib3"],
3477 recovery_available: true,
3478 min_sdk_version: "29",
3479 }
3480 cc_library {
3481 name: "mylib3",
3482 srcs: ["mylib.cpp"],
3483 system_shared_libs: [],
3484 stl: "none",
3485 apex_available: [
3486 "myapex",
3487 "otherapex",
3488 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003489 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003490 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003491 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003492 `)
3493
Jooyung Hanc87a0592020-03-02 17:44:33 +09003494 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003495 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003496 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003497
Vinh Tranf9754732023-01-19 22:41:46 -05003498 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003499 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003500 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003501
Vinh Tranf9754732023-01-19 22:41:46 -05003502 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003503 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003504 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003505
Colin Crossaede88c2020-08-11 12:17:01 -07003506 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3507 // each variant defines additional macros to distinguish which apex variant it is built for
3508
3509 // non-APEX variant does not have __ANDROID_APEX__ defined
3510 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3511 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3512
Vinh Tranf9754732023-01-19 22:41:46 -05003513 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003514 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3515 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003516
Jooyung Hanc87a0592020-03-02 17:44:33 +09003517 // non-APEX variant does not have __ANDROID_APEX__ defined
3518 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3519 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3520
Vinh Tranf9754732023-01-19 22:41:46 -05003521 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003522 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003523 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003524}
Jiyong Park7e636d02019-01-28 16:16:54 +09003525
3526func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003527 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003528 apex {
3529 name: "myapex",
3530 key: "myapex.key",
3531 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003532 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003533 }
3534
3535 apex_key {
3536 name: "myapex.key",
3537 public_key: "testkey.avbpubkey",
3538 private_key: "testkey.pem",
3539 }
3540
3541 cc_library_headers {
3542 name: "mylib_headers",
3543 export_include_dirs: ["my_include"],
3544 system_shared_libs: [],
3545 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003546 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003547 }
3548
3549 cc_library {
3550 name: "mylib",
3551 srcs: ["mylib.cpp"],
3552 system_shared_libs: [],
3553 stl: "none",
3554 header_libs: ["mylib_headers"],
3555 export_header_lib_headers: ["mylib_headers"],
3556 stubs: {
3557 versions: ["1", "2", "3"],
3558 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003559 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003560 }
3561
3562 cc_library {
3563 name: "otherlib",
3564 srcs: ["mylib.cpp"],
3565 system_shared_libs: [],
3566 stl: "none",
3567 shared_libs: ["mylib"],
3568 }
3569 `)
3570
Colin Cross7113d202019-11-20 16:39:12 -08003571 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003572
3573 // Ensure that the include path of the header lib is exported to 'otherlib'
3574 ensureContains(t, cFlags, "-Imy_include")
3575}
Alex Light9670d332019-01-29 18:07:33 -08003576
Jiyong Park7cd10e32020-01-14 09:22:18 +09003577type fileInApex struct {
3578 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003579 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003580 isLink bool
3581}
3582
Jooyung Han1724d582022-12-21 10:17:44 +09003583func (f fileInApex) String() string {
3584 return f.src + ":" + f.path
3585}
3586
3587func (f fileInApex) match(expectation string) bool {
3588 parts := strings.Split(expectation, ":")
3589 if len(parts) == 1 {
3590 match, _ := path.Match(parts[0], f.path)
3591 return match
3592 }
3593 if len(parts) == 2 {
3594 matchSrc, _ := path.Match(parts[0], f.src)
3595 matchDst, _ := path.Match(parts[1], f.path)
3596 return matchSrc && matchDst
3597 }
3598 panic("invalid expected file specification: " + expectation)
3599}
3600
Jooyung Hana57af4a2020-01-23 05:36:59 +00003601func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003602 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003603 module := ctx.ModuleForTests(moduleName, variant)
3604 apexRule := module.MaybeRule("apexRule")
3605 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003606 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003607 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003608 for _, cmd := range strings.Split(copyCmds, "&&") {
3609 cmd = strings.TrimSpace(cmd)
3610 if cmd == "" {
3611 continue
3612 }
3613 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003614 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003615 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003616 switch terms[0] {
3617 case "mkdir":
3618 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003619 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003620 t.Fatal("copyCmds contains invalid cp command", cmd)
3621 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003623 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003624 isLink = false
3625 case "ln":
3626 if len(terms) != 3 && len(terms) != 4 {
3627 // ln LINK TARGET or ln -s LINK TARGET
3628 t.Fatal("copyCmds contains invalid ln command", cmd)
3629 }
3630 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003631 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003632 isLink = true
3633 default:
3634 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3635 }
3636 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003637 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003638 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003639 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003640 }
Jooyung Han1724d582022-12-21 10:17:44 +09003641 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003642 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003643 }
3644 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003645 return ret
3646}
3647
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003648func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003649 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003650 var failed bool
3651 var surplus []string
3652 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003653 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003654 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003655 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003656 if file.match(expected) {
3657 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003658 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003659 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003660 }
3661 }
Jooyung Han1724d582022-12-21 10:17:44 +09003662 if !matchFound {
3663 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003664 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003665 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003666
Jooyung Han31c470b2019-10-18 16:26:59 +09003667 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003668 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003669 t.Log("surplus files", surplus)
3670 failed = true
3671 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003672
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003673 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003674 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003675 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003676 if !filesMatched[expected] {
3677 missing = append(missing, expected)
3678 }
3679 }
3680 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003681 t.Log("missing files", missing)
3682 failed = true
3683 }
3684 if failed {
3685 t.Fail()
3686 }
3687}
3688
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003689func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3690 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3691}
3692
3693func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3694 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3695 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3696 if deapexer.Output != nil {
3697 outputs = append(outputs, deapexer.Output.String())
3698 }
3699 for _, output := range deapexer.ImplicitOutputs {
3700 outputs = append(outputs, output.String())
3701 }
3702 actualFiles := make([]fileInApex, 0, len(outputs))
3703 for _, output := range outputs {
3704 dir := "/deapexer/"
3705 pos := strings.LastIndex(output, dir)
3706 if pos == -1 {
3707 t.Fatal("Unknown deapexer output ", output)
3708 }
3709 path := output[pos+len(dir):]
3710 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3711 }
3712 assertFileListEquals(t, files, actualFiles)
3713}
3714
Jooyung Han344d5432019-08-23 11:17:39 +09003715func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003716 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003717 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003718 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003719 "etc/llndk.libraries.29.txt",
3720 "etc/vndkcore.libraries.29.txt",
3721 "etc/vndksp.libraries.29.txt",
3722 "etc/vndkprivate.libraries.29.txt",
3723 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003724 }
3725 testCases := []struct {
3726 vndkVersion string
3727 expectedFiles []string
3728 }{
3729 {
3730 vndkVersion: "current",
3731 expectedFiles: append(commonFiles,
3732 "lib/libvndk.so",
3733 "lib/libvndksp.so",
3734 "lib64/libvndk.so",
3735 "lib64/libvndksp.so"),
3736 },
3737 {
3738 vndkVersion: "",
3739 expectedFiles: append(commonFiles,
3740 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3741 "lib/libvndksp.so",
3742 "lib64/libvndksp.so"),
3743 },
3744 }
3745 for _, tc := range testCases {
3746 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3747 ctx := testApex(t, `
3748 apex_vndk {
3749 name: "com.android.vndk.current",
3750 key: "com.android.vndk.current.key",
3751 updatable: false,
3752 }
3753
3754 apex_key {
3755 name: "com.android.vndk.current.key",
3756 public_key: "testkey.avbpubkey",
3757 private_key: "testkey.pem",
3758 }
3759
3760 cc_library {
3761 name: "libvndk",
3762 srcs: ["mylib.cpp"],
3763 vendor_available: true,
3764 product_available: true,
3765 vndk: {
3766 enabled: true,
3767 },
3768 system_shared_libs: [],
3769 stl: "none",
3770 apex_available: [ "com.android.vndk.current" ],
3771 }
3772
3773 cc_library {
3774 name: "libvndksp",
3775 srcs: ["mylib.cpp"],
3776 vendor_available: true,
3777 product_available: true,
3778 vndk: {
3779 enabled: true,
3780 support_system_process: true,
3781 },
3782 system_shared_libs: [],
3783 stl: "none",
3784 apex_available: [ "com.android.vndk.current" ],
3785 }
3786
3787 // VNDK-Ext should not cause any problems
3788
3789 cc_library {
3790 name: "libvndk.ext",
3791 srcs: ["mylib2.cpp"],
3792 vendor: true,
3793 vndk: {
3794 enabled: true,
3795 extends: "libvndk",
3796 },
3797 system_shared_libs: [],
3798 stl: "none",
3799 }
3800
3801 cc_library {
3802 name: "libvndksp.ext",
3803 srcs: ["mylib2.cpp"],
3804 vendor: true,
3805 vndk: {
3806 enabled: true,
3807 support_system_process: true,
3808 extends: "libvndksp",
3809 },
3810 system_shared_libs: [],
3811 stl: "none",
3812 }
3813 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3814 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003815 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003816 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003817 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003818 })
3819 }
Jooyung Han344d5432019-08-23 11:17:39 +09003820}
3821
3822func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003823 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003824 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003825 name: "com.android.vndk.current",
3826 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003827 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003828 }
3829
3830 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003831 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003832 public_key: "testkey.avbpubkey",
3833 private_key: "testkey.pem",
3834 }
3835
3836 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003837 name: "libvndk",
3838 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003839 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003840 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003841 vndk: {
3842 enabled: true,
3843 },
3844 system_shared_libs: [],
3845 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003846 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003847 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003848
3849 cc_prebuilt_library_shared {
3850 name: "libvndk.arm",
3851 srcs: ["libvndk.arm.so"],
3852 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003853 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003854 vndk: {
3855 enabled: true,
3856 },
3857 enabled: false,
3858 arch: {
3859 arm: {
3860 enabled: true,
3861 },
3862 },
3863 system_shared_libs: [],
3864 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003865 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003866 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003867 `+vndkLibrariesTxtFiles("current"),
3868 withFiles(map[string][]byte{
3869 "libvndk.so": nil,
3870 "libvndk.arm.so": nil,
3871 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003872 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003873 "lib/libvndk.so",
3874 "lib/libvndk.arm.so",
3875 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003876 "lib/libc++.so",
3877 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003878 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003879 })
Jooyung Han344d5432019-08-23 11:17:39 +09003880}
3881
Jooyung Han39edb6c2019-11-06 16:53:07 +09003882func vndkLibrariesTxtFiles(vers ...string) (result string) {
3883 for _, v := range vers {
3884 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003885 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003886 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003887 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003888 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003889 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003890 }
3891 `
3892 }
Justin Yund5784122023-10-25 13:25:32 +09003893 result += `
3894 llndk_libraries_txt {
3895 name: "llndk.libraries.txt",
3896 }
3897 llndk_libraries_txt_for_apex {
3898 name: "llndk.libraries.txt.apex",
3899 stem: "llndk.libraries.txt",
3900 insert_vndk_version: true,
3901 }
3902 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003903 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003904 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003905 result += `
3906 prebuilt_etc {
3907 name: "` + txt + `.libraries.` + v + `.txt",
3908 src: "dummy.txt",
3909 }
3910 `
3911 }
3912 }
3913 }
3914 return
3915}
3916
Jooyung Han344d5432019-08-23 11:17:39 +09003917func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003918 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003919 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003920 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003921 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003922 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003923 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003924 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003925 }
3926
3927 apex_key {
3928 name: "myapex.key",
3929 public_key: "testkey.avbpubkey",
3930 private_key: "testkey.pem",
3931 }
3932
Jooyung Han31c470b2019-10-18 16:26:59 +09003933 vndk_prebuilt_shared {
3934 name: "libvndk27",
3935 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003936 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003937 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003938 vndk: {
3939 enabled: true,
3940 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003941 target_arch: "arm64",
3942 arch: {
3943 arm: {
3944 srcs: ["libvndk27_arm.so"],
3945 },
3946 arm64: {
3947 srcs: ["libvndk27_arm64.so"],
3948 },
3949 },
Colin Cross2807f002021-03-02 10:15:29 -08003950 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003951 }
3952
3953 vndk_prebuilt_shared {
3954 name: "libvndk27",
3955 version: "27",
3956 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003957 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003958 vndk: {
3959 enabled: true,
3960 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003961 target_arch: "x86_64",
3962 arch: {
3963 x86: {
3964 srcs: ["libvndk27_x86.so"],
3965 },
3966 x86_64: {
3967 srcs: ["libvndk27_x86_64.so"],
3968 },
3969 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003970 }
3971 `+vndkLibrariesTxtFiles("27"),
3972 withFiles(map[string][]byte{
3973 "libvndk27_arm.so": nil,
3974 "libvndk27_arm64.so": nil,
3975 "libvndk27_x86.so": nil,
3976 "libvndk27_x86_64.so": nil,
3977 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003978
Jooyung Hana0503a52023-08-23 13:12:50 +09003979 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003980 "lib/libvndk27_arm.so",
3981 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003982 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003983 })
Jooyung Han344d5432019-08-23 11:17:39 +09003984}
3985
Jooyung Han90eee022019-10-01 20:02:42 +09003986func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003987 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003988 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003989 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003990 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003991 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003992 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003993 }
3994 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003995 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003996 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003997 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003998 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003999 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004000 }
4001 apex_key {
4002 name: "myapex.key",
4003 public_key: "testkey.avbpubkey",
4004 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004005 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004006
4007 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004008 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004009 apexManifestRule := module.Rule("apexManifestRule")
4010 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004011 }
4012
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004013 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004014 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004015}
4016
Jooyung Han344d5432019-08-23 11:17:39 +09004017func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004018 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004019 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004020 name: "com.android.vndk.current",
4021 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004022 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004023 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004024 }
4025
4026 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004027 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004028 public_key: "testkey.avbpubkey",
4029 private_key: "testkey.pem",
4030 }
4031
4032 cc_library {
4033 name: "libvndk",
4034 srcs: ["mylib.cpp"],
4035 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004036 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004037 native_bridge_supported: true,
4038 host_supported: true,
4039 vndk: {
4040 enabled: true,
4041 },
4042 system_shared_libs: [],
4043 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004044 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004045 }
Colin Cross2807f002021-03-02 10:15:29 -08004046 `+vndkLibrariesTxtFiles("current"),
4047 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004048
Jooyung Hana0503a52023-08-23 13:12:50 +09004049 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004050 "lib/libvndk.so",
4051 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004052 "lib/libc++.so",
4053 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004054 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004055 })
Jooyung Han344d5432019-08-23 11:17:39 +09004056}
4057
4058func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004059 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004060 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004061 name: "com.android.vndk.current",
4062 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004063 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004064 native_bridge_supported: true,
4065 }
4066
4067 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004068 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004069 public_key: "testkey.avbpubkey",
4070 private_key: "testkey.pem",
4071 }
4072
4073 cc_library {
4074 name: "libvndk",
4075 srcs: ["mylib.cpp"],
4076 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004077 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004078 native_bridge_supported: true,
4079 host_supported: true,
4080 vndk: {
4081 enabled: true,
4082 },
4083 system_shared_libs: [],
4084 stl: "none",
4085 }
4086 `)
4087}
4088
Jooyung Han31c470b2019-10-18 16:26:59 +09004089func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004090 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004091 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004092 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004093 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004094 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004095 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004096 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004097 }
4098
4099 apex_key {
4100 name: "myapex.key",
4101 public_key: "testkey.avbpubkey",
4102 private_key: "testkey.pem",
4103 }
4104
4105 vndk_prebuilt_shared {
4106 name: "libvndk27",
4107 version: "27",
4108 target_arch: "arm",
4109 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004110 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004111 vndk: {
4112 enabled: true,
4113 },
4114 arch: {
4115 arm: {
4116 srcs: ["libvndk27.so"],
4117 }
4118 },
4119 }
4120
4121 vndk_prebuilt_shared {
4122 name: "libvndk27",
4123 version: "27",
4124 target_arch: "arm",
4125 binder32bit: true,
4126 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004127 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 vndk: {
4129 enabled: true,
4130 },
4131 arch: {
4132 arm: {
4133 srcs: ["libvndk27binder32.so"],
4134 }
4135 },
Colin Cross2807f002021-03-02 10:15:29 -08004136 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004137 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004138 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004139 withFiles(map[string][]byte{
4140 "libvndk27.so": nil,
4141 "libvndk27binder32.so": nil,
4142 }),
4143 withBinder32bit,
4144 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004145 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004146 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4147 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004148 },
4149 }),
4150 )
4151
Jooyung Hana0503a52023-08-23 13:12:50 +09004152 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004153 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004154 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004155 })
4156}
4157
Jooyung Han45a96772020-06-15 14:59:42 +09004158func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004159 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004160 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004161 name: "com.android.vndk.current",
4162 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004163 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004164 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004165 }
4166
4167 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004168 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004169 public_key: "testkey.avbpubkey",
4170 private_key: "testkey.pem",
4171 }
4172
4173 cc_library {
4174 name: "libz",
4175 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004176 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004177 vndk: {
4178 enabled: true,
4179 },
4180 stubs: {
4181 symbol_file: "libz.map.txt",
4182 versions: ["30"],
4183 }
4184 }
4185 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4186 "libz.map.txt": nil,
4187 }))
4188
Jooyung Hana0503a52023-08-23 13:12:50 +09004189 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004190 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4191 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004192 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004193 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4194 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4195 "*/*",
4196 })
Jooyung Han45a96772020-06-15 14:59:42 +09004197}
4198
Jooyung Hane3f02812023-05-08 13:54:50 +09004199func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4200 ctx := testApex(t, "",
4201 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4202 variables.DeviceVndkVersion = proptools.StringPtr("27")
4203 }),
4204 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4205 cc.RegisterVendorSnapshotModules(ctx)
4206 }),
4207 withFiles(map[string][]byte{
4208 "vendor/foo/Android.bp": []byte(`
4209 apex {
4210 name: "myapex",
4211 binaries: ["foo"],
4212 key: "myapex.key",
4213 min_sdk_version: "27",
4214 vendor: true,
4215 }
4216
4217 cc_binary {
4218 name: "foo",
4219 vendor: true,
4220 srcs: ["abc.cpp"],
4221 shared_libs: [
4222 "libllndk",
4223 "libvndk",
4224 ],
4225 nocrt: true,
4226 system_shared_libs: [],
4227 min_sdk_version: "27",
4228 }
4229
4230 apex_key {
4231 name: "myapex.key",
4232 public_key: "testkey.avbpubkey",
4233 private_key: "testkey.pem",
4234 }
4235 `),
4236 // Simulate VNDK prebuilts with vendor_snapshot
4237 "prebuilts/vndk/Android.bp": []byte(`
4238 vndk_prebuilt_shared {
4239 name: "libllndk",
4240 version: "27",
4241 vendor_available: true,
4242 product_available: true,
4243 target_arch: "arm64",
4244 arch: {
4245 arm64: {
4246 srcs: ["libllndk.so"],
4247 },
4248 },
4249 }
4250
4251 vndk_prebuilt_shared {
4252 name: "libvndk",
4253 version: "27",
4254 vendor_available: true,
4255 product_available: true,
4256 target_arch: "arm64",
4257 arch: {
4258 arm64: {
4259 srcs: ["libvndk.so"],
4260 },
4261 },
4262 vndk: {
4263 enabled: true,
4264 },
4265 min_sdk_version: "27",
4266 }
4267
4268 vndk_prebuilt_shared {
4269 name: "libc++",
4270 version: "27",
4271 target_arch: "arm64",
4272 vendor_available: true,
4273 product_available: true,
4274 vndk: {
4275 enabled: true,
4276 support_system_process: true,
4277 },
4278 arch: {
4279 arm64: {
4280 srcs: ["libc++.so"],
4281 },
4282 },
4283 min_sdk_version: "apex_inherit",
4284 }
4285
4286 vendor_snapshot {
4287 name: "vendor_snapshot",
4288 version: "27",
4289 arch: {
4290 arm64: {
4291 vndk_libs: [
4292 "libc++",
4293 "libllndk",
4294 "libvndk",
4295 ],
4296 static_libs: [
4297 "libc++demangle",
4298 "libclang_rt.builtins",
4299 "libunwind",
4300 ],
4301 },
4302 }
4303 }
4304
4305 vendor_snapshot_static {
4306 name: "libclang_rt.builtins",
4307 version: "27",
4308 target_arch: "arm64",
4309 vendor: true,
4310 arch: {
4311 arm64: {
4312 src: "libclang_rt.builtins-aarch64-android.a",
4313 },
4314 },
4315 }
4316
4317 vendor_snapshot_static {
4318 name: "libc++demangle",
4319 version: "27",
4320 target_arch: "arm64",
4321 compile_multilib: "64",
4322 vendor: true,
4323 arch: {
4324 arm64: {
4325 src: "libc++demangle.a",
4326 },
4327 },
4328 min_sdk_version: "apex_inherit",
4329 }
4330
4331 vendor_snapshot_static {
4332 name: "libunwind",
4333 version: "27",
4334 target_arch: "arm64",
4335 compile_multilib: "64",
4336 vendor: true,
4337 arch: {
4338 arm64: {
4339 src: "libunwind.a",
4340 },
4341 },
4342 min_sdk_version: "apex_inherit",
4343 }
4344 `),
4345 }))
4346
4347 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004348 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004349 "bin/foo",
4350 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4351 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4352 })
4353
4354 // Should link foo with prebuilt libraries (shared/static)
4355 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4356 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4357 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4358 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4359 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4360
4361 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004362 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004363 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4364 ensureListContains(t, requireNativeLibs, "libllndk.so")
4365}
4366
Jooyung Hane1633032019-08-01 17:41:43 +09004367func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004368 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004369 apex {
4370 name: "myapex_nodep",
4371 key: "myapex.key",
4372 native_shared_libs: ["lib_nodep"],
4373 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004374 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004375 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004376 }
4377
4378 apex {
4379 name: "myapex_dep",
4380 key: "myapex.key",
4381 native_shared_libs: ["lib_dep"],
4382 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004383 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004384 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004385 }
4386
4387 apex {
4388 name: "myapex_provider",
4389 key: "myapex.key",
4390 native_shared_libs: ["libfoo"],
4391 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004392 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004393 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004394 }
4395
4396 apex {
4397 name: "myapex_selfcontained",
4398 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004399 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004400 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004401 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004402 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004403 }
4404
4405 apex_key {
4406 name: "myapex.key",
4407 public_key: "testkey.avbpubkey",
4408 private_key: "testkey.pem",
4409 }
4410
4411 cc_library {
4412 name: "lib_nodep",
4413 srcs: ["mylib.cpp"],
4414 system_shared_libs: [],
4415 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004416 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004417 }
4418
4419 cc_library {
4420 name: "lib_dep",
4421 srcs: ["mylib.cpp"],
4422 shared_libs: ["libfoo"],
4423 system_shared_libs: [],
4424 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004425 apex_available: [
4426 "myapex_dep",
4427 "myapex_provider",
4428 "myapex_selfcontained",
4429 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004430 }
4431
4432 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004433 name: "lib_dep_on_bar",
4434 srcs: ["mylib.cpp"],
4435 shared_libs: ["libbar"],
4436 system_shared_libs: [],
4437 stl: "none",
4438 apex_available: [
4439 "myapex_selfcontained",
4440 ],
4441 }
4442
4443
4444 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004445 name: "libfoo",
4446 srcs: ["mytest.cpp"],
4447 stubs: {
4448 versions: ["1"],
4449 },
4450 system_shared_libs: [],
4451 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004452 apex_available: [
4453 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004454 ],
4455 }
4456
4457 cc_library {
4458 name: "libbar",
4459 srcs: ["mytest.cpp"],
4460 stubs: {
4461 versions: ["1"],
4462 },
4463 system_shared_libs: [],
4464 stl: "none",
4465 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004466 "myapex_selfcontained",
4467 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004468 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004469
Jooyung Hane1633032019-08-01 17:41:43 +09004470 `)
4471
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004472 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004473 var provideNativeLibs, requireNativeLibs []string
4474
Jooyung Hana0503a52023-08-23 13:12:50 +09004475 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004476 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4477 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004478 ensureListEmpty(t, provideNativeLibs)
4479 ensureListEmpty(t, requireNativeLibs)
4480
Jooyung Hana0503a52023-08-23 13:12:50 +09004481 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004482 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4483 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004484 ensureListEmpty(t, provideNativeLibs)
4485 ensureListContains(t, requireNativeLibs, "libfoo.so")
4486
Jooyung Hana0503a52023-08-23 13:12:50 +09004487 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004488 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4489 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004490 ensureListContains(t, provideNativeLibs, "libfoo.so")
4491 ensureListEmpty(t, requireNativeLibs)
4492
Jooyung Hana0503a52023-08-23 13:12:50 +09004493 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004494 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4495 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004496 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004497 ensureListEmpty(t, requireNativeLibs)
4498}
4499
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004500func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4501 ctx := testApex(t, `
4502 apex {
4503 name: "myapex",
4504 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004505 native_shared_libs: ["mylib"],
4506 updatable: false,
4507 }
4508
4509 apex_key {
4510 name: "myapex.key",
4511 public_key: "testkey.avbpubkey",
4512 private_key: "testkey.pem",
4513 }
4514
4515 cc_library {
4516 name: "mylib",
4517 srcs: ["mylib.cpp"],
4518 system_shared_libs: [],
4519 stl: "none",
4520 apex_available: [
4521 "//apex_available:platform",
4522 "myapex",
4523 ],
4524 }
4525 `, android.FixtureMergeEnv(map[string]string{
4526 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4527 }))
4528
Jooyung Hana0503a52023-08-23 13:12:50 +09004529 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004530 apexManifestRule := module.Rule("apexManifestRule")
4531 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4532}
4533
Vinh Tran8f5310f2022-10-07 18:16:47 -04004534func TestCompileMultilibProp(t *testing.T) {
4535 testCases := []struct {
4536 compileMultiLibProp string
4537 containedLibs []string
4538 notContainedLibs []string
4539 }{
4540 {
4541 containedLibs: []string{
4542 "image.apex/lib64/mylib.so",
4543 "image.apex/lib/mylib.so",
4544 },
4545 compileMultiLibProp: `compile_multilib: "both",`,
4546 },
4547 {
4548 containedLibs: []string{"image.apex/lib64/mylib.so"},
4549 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4550 compileMultiLibProp: `compile_multilib: "first",`,
4551 },
4552 {
4553 containedLibs: []string{"image.apex/lib64/mylib.so"},
4554 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4555 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4556 },
4557 {
4558 containedLibs: []string{"image.apex/lib64/mylib.so"},
4559 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4560 compileMultiLibProp: `compile_multilib: "64",`,
4561 },
4562 {
4563 containedLibs: []string{"image.apex/lib/mylib.so"},
4564 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4565 compileMultiLibProp: `compile_multilib: "32",`,
4566 },
4567 }
4568 for _, testCase := range testCases {
4569 ctx := testApex(t, fmt.Sprintf(`
4570 apex {
4571 name: "myapex",
4572 key: "myapex.key",
4573 %s
4574 native_shared_libs: ["mylib"],
4575 updatable: false,
4576 }
4577 apex_key {
4578 name: "myapex.key",
4579 public_key: "testkey.avbpubkey",
4580 private_key: "testkey.pem",
4581 }
4582 cc_library {
4583 name: "mylib",
4584 srcs: ["mylib.cpp"],
4585 apex_available: [
4586 "//apex_available:platform",
4587 "myapex",
4588 ],
4589 }
4590 `, testCase.compileMultiLibProp),
4591 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004592 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004593 apexRule := module.Rule("apexRule")
4594 copyCmds := apexRule.Args["copy_commands"]
4595 for _, containedLib := range testCase.containedLibs {
4596 ensureContains(t, copyCmds, containedLib)
4597 }
4598 for _, notContainedLib := range testCase.notContainedLibs {
4599 ensureNotContains(t, copyCmds, notContainedLib)
4600 }
4601 }
4602}
4603
Alex Light0851b882019-02-07 13:20:53 -08004604func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004605 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004606 apex {
4607 name: "myapex",
4608 key: "myapex.key",
4609 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004610 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004611 }
4612
4613 apex_key {
4614 name: "myapex.key",
4615 public_key: "testkey.avbpubkey",
4616 private_key: "testkey.pem",
4617 }
4618
4619 cc_library {
4620 name: "mylib_common",
4621 srcs: ["mylib.cpp"],
4622 system_shared_libs: [],
4623 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004624 apex_available: [
4625 "//apex_available:platform",
4626 "myapex",
4627 ],
Alex Light0851b882019-02-07 13:20:53 -08004628 }
4629 `)
4630
Jooyung Hana0503a52023-08-23 13:12:50 +09004631 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004632 apexRule := module.Rule("apexRule")
4633 copyCmds := apexRule.Args["copy_commands"]
4634
4635 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4636 t.Log("Apex was a test apex!")
4637 t.Fail()
4638 }
4639 // Ensure that main rule creates an output
4640 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4641
4642 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004643 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004644
4645 // Ensure that both direct and indirect deps are copied into apex
4646 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4647
Colin Cross7113d202019-11-20 16:39:12 -08004648 // Ensure that the platform variant ends with _shared
4649 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004650
Colin Cross56a83212020-09-15 18:30:11 -07004651 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004652 t.Log("Found mylib_common not in any apex!")
4653 t.Fail()
4654 }
4655}
4656
4657func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004658 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004659 apex_test {
4660 name: "myapex",
4661 key: "myapex.key",
4662 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004663 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004664 }
4665
4666 apex_key {
4667 name: "myapex.key",
4668 public_key: "testkey.avbpubkey",
4669 private_key: "testkey.pem",
4670 }
4671
4672 cc_library {
4673 name: "mylib_common_test",
4674 srcs: ["mylib.cpp"],
4675 system_shared_libs: [],
4676 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004677 // TODO: remove //apex_available:platform
4678 apex_available: [
4679 "//apex_available:platform",
4680 "myapex",
4681 ],
Alex Light0851b882019-02-07 13:20:53 -08004682 }
4683 `)
4684
Jooyung Hana0503a52023-08-23 13:12:50 +09004685 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004686 apexRule := module.Rule("apexRule")
4687 copyCmds := apexRule.Args["copy_commands"]
4688
4689 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4690 t.Log("Apex was not a test apex!")
4691 t.Fail()
4692 }
4693 // Ensure that main rule creates an output
4694 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4695
4696 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004697 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004698
4699 // Ensure that both direct and indirect deps are copied into apex
4700 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4701
Colin Cross7113d202019-11-20 16:39:12 -08004702 // Ensure that the platform variant ends with _shared
4703 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004704}
4705
Alex Light9670d332019-01-29 18:07:33 -08004706func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004707 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004708 apex {
4709 name: "myapex",
4710 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004711 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004712 multilib: {
4713 first: {
4714 native_shared_libs: ["mylib_common"],
4715 }
4716 },
4717 target: {
4718 android: {
4719 multilib: {
4720 first: {
4721 native_shared_libs: ["mylib"],
4722 }
4723 }
4724 },
4725 host: {
4726 multilib: {
4727 first: {
4728 native_shared_libs: ["mylib2"],
4729 }
4730 }
4731 }
4732 }
4733 }
4734
4735 apex_key {
4736 name: "myapex.key",
4737 public_key: "testkey.avbpubkey",
4738 private_key: "testkey.pem",
4739 }
4740
4741 cc_library {
4742 name: "mylib",
4743 srcs: ["mylib.cpp"],
4744 system_shared_libs: [],
4745 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004746 // TODO: remove //apex_available:platform
4747 apex_available: [
4748 "//apex_available:platform",
4749 "myapex",
4750 ],
Alex Light9670d332019-01-29 18:07:33 -08004751 }
4752
4753 cc_library {
4754 name: "mylib_common",
4755 srcs: ["mylib.cpp"],
4756 system_shared_libs: [],
4757 stl: "none",
4758 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004759 // TODO: remove //apex_available:platform
4760 apex_available: [
4761 "//apex_available:platform",
4762 "myapex",
4763 ],
Alex Light9670d332019-01-29 18:07:33 -08004764 }
4765
4766 cc_library {
4767 name: "mylib2",
4768 srcs: ["mylib.cpp"],
4769 system_shared_libs: [],
4770 stl: "none",
4771 compile_multilib: "first",
4772 }
4773 `)
4774
Jooyung Hana0503a52023-08-23 13:12:50 +09004775 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004776 copyCmds := apexRule.Args["copy_commands"]
4777
4778 // Ensure that main rule creates an output
4779 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4780
4781 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004782 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4783 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4784 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004785
4786 // Ensure that both direct and indirect deps are copied into apex
4787 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4788 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4789 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4790
Colin Cross7113d202019-11-20 16:39:12 -08004791 // Ensure that the platform variant ends with _shared
4792 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4793 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4794 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004795}
Jiyong Park04480cf2019-02-06 00:16:29 +09004796
Jiyong Park59140302020-12-14 18:44:04 +09004797func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004798 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004799 apex {
4800 name: "myapex",
4801 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004802 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004803 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004804 arch: {
4805 arm64: {
4806 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004807 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004808 },
4809 x86_64: {
4810 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004811 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004812 },
4813 }
4814 }
4815
4816 apex_key {
4817 name: "myapex.key",
4818 public_key: "testkey.avbpubkey",
4819 private_key: "testkey.pem",
4820 }
4821
4822 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004823 name: "mylib.generic",
4824 srcs: ["mylib.cpp"],
4825 system_shared_libs: [],
4826 stl: "none",
4827 // TODO: remove //apex_available:platform
4828 apex_available: [
4829 "//apex_available:platform",
4830 "myapex",
4831 ],
4832 }
4833
4834 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004835 name: "mylib.arm64",
4836 srcs: ["mylib.cpp"],
4837 system_shared_libs: [],
4838 stl: "none",
4839 // TODO: remove //apex_available:platform
4840 apex_available: [
4841 "//apex_available:platform",
4842 "myapex",
4843 ],
4844 }
4845
4846 cc_library {
4847 name: "mylib.x64",
4848 srcs: ["mylib.cpp"],
4849 system_shared_libs: [],
4850 stl: "none",
4851 // TODO: remove //apex_available:platform
4852 apex_available: [
4853 "//apex_available:platform",
4854 "myapex",
4855 ],
4856 }
4857 `)
4858
Jooyung Hana0503a52023-08-23 13:12:50 +09004859 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004860 copyCmds := apexRule.Args["copy_commands"]
4861
4862 // Ensure that apex variant is created for the direct dep
4863 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004864 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004865 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4866
4867 // Ensure that both direct and indirect deps are copied into apex
4868 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4869 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4870}
4871
Jiyong Park04480cf2019-02-06 00:16:29 +09004872func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004873 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004874 apex {
4875 name: "myapex",
4876 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004877 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004878 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004879 }
4880
4881 apex_key {
4882 name: "myapex.key",
4883 public_key: "testkey.avbpubkey",
4884 private_key: "testkey.pem",
4885 }
4886
4887 sh_binary {
4888 name: "myscript",
4889 src: "mylib.cpp",
4890 filename: "myscript.sh",
4891 sub_dir: "script",
4892 }
4893 `)
4894
Jooyung Hana0503a52023-08-23 13:12:50 +09004895 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004896 copyCmds := apexRule.Args["copy_commands"]
4897
4898 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4899}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004900
Jooyung Han91df2082019-11-20 01:49:42 +09004901func TestApexInVariousPartition(t *testing.T) {
4902 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004903 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004904 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004905 {"", "system"},
4906 {"product_specific: true", "product"},
4907 {"soc_specific: true", "vendor"},
4908 {"proprietary: true", "vendor"},
4909 {"vendor: true", "vendor"},
4910 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004911 }
4912 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004913 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004914 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004915 apex {
4916 name: "myapex",
4917 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004918 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004919 `+tc.propName+`
4920 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004921
Jooyung Han91df2082019-11-20 01:49:42 +09004922 apex_key {
4923 name: "myapex.key",
4924 public_key: "testkey.avbpubkey",
4925 private_key: "testkey.pem",
4926 }
4927 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004928
Jooyung Hana0503a52023-08-23 13:12:50 +09004929 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004930 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004931 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004932 if actual != expected {
4933 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4934 }
Jooyung Han91df2082019-11-20 01:49:42 +09004935 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004936 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004937}
Jiyong Park67882562019-03-21 01:11:21 +09004938
Jooyung Han580eb4f2020-06-24 19:33:06 +09004939func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004940 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004941 apex {
4942 name: "myapex",
4943 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004944 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004945 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004946
Jooyung Han580eb4f2020-06-24 19:33:06 +09004947 apex_key {
4948 name: "myapex.key",
4949 public_key: "testkey.avbpubkey",
4950 private_key: "testkey.pem",
4951 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004952 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004953 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004954 rule := module.Output("file_contexts")
4955 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4956}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004957
Jooyung Han580eb4f2020-06-24 19:33:06 +09004958func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004959 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004960 apex {
4961 name: "myapex",
4962 key: "myapex.key",
4963 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004964 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004965 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004966
Jooyung Han580eb4f2020-06-24 19:33:06 +09004967 apex_key {
4968 name: "myapex.key",
4969 public_key: "testkey.avbpubkey",
4970 private_key: "testkey.pem",
4971 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004972 `, withFiles(map[string][]byte{
4973 "my_own_file_contexts": nil,
4974 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004975}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004976
Jooyung Han580eb4f2020-06-24 19:33:06 +09004977func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004978 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004979 apex {
4980 name: "myapex",
4981 key: "myapex.key",
4982 product_specific: true,
4983 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004984 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004985 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004986
Jooyung Han580eb4f2020-06-24 19:33:06 +09004987 apex_key {
4988 name: "myapex.key",
4989 public_key: "testkey.avbpubkey",
4990 private_key: "testkey.pem",
4991 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004992 `)
4993
Colin Cross1c460562021-02-16 17:55:47 -08004994 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004995 apex {
4996 name: "myapex",
4997 key: "myapex.key",
4998 product_specific: true,
4999 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005000 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005001 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005002
Jooyung Han580eb4f2020-06-24 19:33:06 +09005003 apex_key {
5004 name: "myapex.key",
5005 public_key: "testkey.avbpubkey",
5006 private_key: "testkey.pem",
5007 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005008 `, withFiles(map[string][]byte{
5009 "product_specific_file_contexts": nil,
5010 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005011 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005012 rule := module.Output("file_contexts")
5013 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5014}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005015
Jooyung Han580eb4f2020-06-24 19:33:06 +09005016func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005017 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005018 apex {
5019 name: "myapex",
5020 key: "myapex.key",
5021 product_specific: true,
5022 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005023 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005024 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005025
Jooyung Han580eb4f2020-06-24 19:33:06 +09005026 apex_key {
5027 name: "myapex.key",
5028 public_key: "testkey.avbpubkey",
5029 private_key: "testkey.pem",
5030 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005031
Jooyung Han580eb4f2020-06-24 19:33:06 +09005032 filegroup {
5033 name: "my-file-contexts",
5034 srcs: ["product_specific_file_contexts"],
5035 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005036 `, withFiles(map[string][]byte{
5037 "product_specific_file_contexts": nil,
5038 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005039 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005040 rule := module.Output("file_contexts")
5041 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005042}
5043
Jiyong Park67882562019-03-21 01:11:21 +09005044func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005045 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005046 apex_key {
5047 name: "myapex.key",
5048 public_key: ":my.avbpubkey",
5049 private_key: ":my.pem",
5050 product_specific: true,
5051 }
5052
5053 filegroup {
5054 name: "my.avbpubkey",
5055 srcs: ["testkey2.avbpubkey"],
5056 }
5057
5058 filegroup {
5059 name: "my.pem",
5060 srcs: ["testkey2.pem"],
5061 }
5062 `)
5063
5064 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5065 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005066 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005067 if actual_pubkey != expected_pubkey {
5068 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5069 }
5070 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005071 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005072 if actual_privkey != expected_privkey {
5073 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5074 }
5075}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005076
5077func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005078 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005079 prebuilt_apex {
5080 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005081 arch: {
5082 arm64: {
5083 src: "myapex-arm64.apex",
5084 },
5085 arm: {
5086 src: "myapex-arm.apex",
5087 },
5088 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005089 }
5090 `)
5091
Wei Li340ee8e2022-03-18 17:33:24 -07005092 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5093 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005094
Jiyong Parkc95714e2019-03-29 14:23:10 +09005095 expectedInput := "myapex-arm64.apex"
5096 if prebuilt.inputApex.String() != expectedInput {
5097 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5098 }
Wei Li340ee8e2022-03-18 17:33:24 -07005099 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5100 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5101 rule := testingModule.Rule("genProvenanceMetaData")
5102 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5103 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5104 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5105 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005106
5107 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5108 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005109}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005110
Paul Duffinc0609c62021-03-01 17:27:16 +00005111func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005112 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005113 prebuilt_apex {
5114 name: "myapex",
5115 }
5116 `)
5117}
5118
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005119func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005120 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005121 prebuilt_apex {
5122 name: "myapex",
5123 src: "myapex-arm.apex",
5124 filename: "notmyapex.apex",
5125 }
5126 `)
5127
Wei Li340ee8e2022-03-18 17:33:24 -07005128 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5129 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005130
5131 expected := "notmyapex.apex"
5132 if p.installFilename != expected {
5133 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5134 }
Wei Li340ee8e2022-03-18 17:33:24 -07005135 rule := testingModule.Rule("genProvenanceMetaData")
5136 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5137 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5138 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5139 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005140}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005141
Samiul Islam7c02e262021-09-08 17:48:28 +01005142func TestApexSetFilenameOverride(t *testing.T) {
5143 testApex(t, `
5144 apex_set {
5145 name: "com.company.android.myapex",
5146 apex_name: "com.android.myapex",
5147 set: "company-myapex.apks",
5148 filename: "com.company.android.myapex.apex"
5149 }
5150 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5151
5152 testApex(t, `
5153 apex_set {
5154 name: "com.company.android.myapex",
5155 apex_name: "com.android.myapex",
5156 set: "company-myapex.apks",
5157 filename: "com.company.android.myapex.capex"
5158 }
5159 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5160
5161 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5162 apex_set {
5163 name: "com.company.android.myapex",
5164 apex_name: "com.android.myapex",
5165 set: "company-myapex.apks",
5166 filename: "some-random-suffix"
5167 }
5168 `)
5169}
5170
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005171func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005172 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005173 prebuilt_apex {
5174 name: "myapex.prebuilt",
5175 src: "myapex-arm.apex",
5176 overrides: [
5177 "myapex",
5178 ],
5179 }
5180 `)
5181
Wei Li340ee8e2022-03-18 17:33:24 -07005182 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5183 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005184
5185 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005186 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005187 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005188 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005189 }
Wei Li340ee8e2022-03-18 17:33:24 -07005190 rule := testingModule.Rule("genProvenanceMetaData")
5191 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5192 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5193 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5194 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005195}
5196
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005197func TestPrebuiltApexName(t *testing.T) {
5198 testApex(t, `
5199 prebuilt_apex {
5200 name: "com.company.android.myapex",
5201 apex_name: "com.android.myapex",
5202 src: "company-myapex-arm.apex",
5203 }
5204 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5205
5206 testApex(t, `
5207 apex_set {
5208 name: "com.company.android.myapex",
5209 apex_name: "com.android.myapex",
5210 set: "company-myapex.apks",
5211 }
5212 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5213}
5214
5215func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5216 _ = android.GroupFixturePreparers(
5217 java.PrepareForTestWithJavaDefaultModules,
5218 PrepareForTestWithApexBuildComponents,
5219 android.FixtureWithRootAndroidBp(`
5220 platform_bootclasspath {
5221 name: "platform-bootclasspath",
5222 fragments: [
5223 {
5224 apex: "com.android.art",
5225 module: "art-bootclasspath-fragment",
5226 },
5227 ],
5228 }
5229
5230 prebuilt_apex {
5231 name: "com.company.android.art",
5232 apex_name: "com.android.art",
5233 src: "com.company.android.art-arm.apex",
5234 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5235 }
5236
5237 prebuilt_bootclasspath_fragment {
5238 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005239 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005240 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005241 hidden_api: {
5242 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5243 metadata: "my-bootclasspath-fragment/metadata.csv",
5244 index: "my-bootclasspath-fragment/index.csv",
5245 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5246 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5247 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005248 }
5249
5250 java_import {
5251 name: "core-oj",
5252 jars: ["prebuilt.jar"],
5253 }
5254 `),
5255 ).RunTest(t)
5256}
5257
Paul Duffin092153d2021-01-26 11:42:39 +00005258// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5259// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005260func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005261 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005262
Paul Duffin89886cb2021-02-05 16:44:03 +00005263 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005264 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005265 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005266 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005267 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005268 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005269 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5270 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5271 android.NormalizePathForTesting(dexJarBuildPath))
5272 }
5273
5274 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005275 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005276 // Make sure the import has been given the correct path to the dex jar.
5277 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5278 dexJarBuildPath := p.DexJarInstallPath()
5279 stem := android.RemoveOptionalPrebuiltPrefix(name)
5280 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5281 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5282 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005283 }
5284
Paul Duffin39853512021-02-26 11:09:39 +00005285 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005286 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005287 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005288 android.AssertArrayString(t, "Check if there is no source variant",
5289 []string{"android_common"},
5290 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005291 }
5292
5293 t.Run("prebuilt only", func(t *testing.T) {
5294 bp := `
5295 prebuilt_apex {
5296 name: "myapex",
5297 arch: {
5298 arm64: {
5299 src: "myapex-arm64.apex",
5300 },
5301 arm: {
5302 src: "myapex-arm.apex",
5303 },
5304 },
Paul Duffin39853512021-02-26 11:09:39 +00005305 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005306 }
5307
5308 java_import {
5309 name: "libfoo",
5310 jars: ["libfoo.jar"],
5311 }
Paul Duffin39853512021-02-26 11:09:39 +00005312
5313 java_sdk_library_import {
5314 name: "libbar",
5315 public: {
5316 jars: ["libbar.jar"],
5317 },
5318 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005319 `
5320
5321 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5322 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5323
Martin Stjernholm44825602021-09-17 01:44:12 +01005324 deapexerName := deapexerModuleName("myapex")
5325 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5326
Paul Duffinf6932af2021-02-26 18:21:56 +00005327 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005328 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005329 rule := deapexer.Rule("deapexer")
5330 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5331 t.Errorf("expected: %q, found: %q", expected, actual)
5332 }
5333
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005334 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005335 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005336 rule = prebuiltApex.Rule("android/soong/android.Cp")
5337 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5338 t.Errorf("expected: %q, found: %q", expected, actual)
5339 }
5340
Paul Duffin89886cb2021-02-05 16:44:03 +00005341 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005342 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005343
5344 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005345 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005346 })
5347
5348 t.Run("prebuilt with source preferred", func(t *testing.T) {
5349
5350 bp := `
5351 prebuilt_apex {
5352 name: "myapex",
5353 arch: {
5354 arm64: {
5355 src: "myapex-arm64.apex",
5356 },
5357 arm: {
5358 src: "myapex-arm.apex",
5359 },
5360 },
Paul Duffin39853512021-02-26 11:09:39 +00005361 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005362 }
5363
5364 java_import {
5365 name: "libfoo",
5366 jars: ["libfoo.jar"],
5367 }
5368
5369 java_library {
5370 name: "libfoo",
5371 }
Paul Duffin39853512021-02-26 11:09:39 +00005372
5373 java_sdk_library_import {
5374 name: "libbar",
5375 public: {
5376 jars: ["libbar.jar"],
5377 },
5378 }
5379
5380 java_sdk_library {
5381 name: "libbar",
5382 srcs: ["foo/bar/MyClass.java"],
5383 unsafe_ignore_missing_latest_api: true,
5384 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005385 `
5386
5387 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5388 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5389
Paul Duffin89886cb2021-02-05 16:44:03 +00005390 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005391 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005392 ensureNoSourceVariant(t, ctx, "libfoo")
5393
5394 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005395 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005396 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005397 })
5398
5399 t.Run("prebuilt preferred with source", func(t *testing.T) {
5400 bp := `
5401 prebuilt_apex {
5402 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005403 arch: {
5404 arm64: {
5405 src: "myapex-arm64.apex",
5406 },
5407 arm: {
5408 src: "myapex-arm.apex",
5409 },
5410 },
Paul Duffin39853512021-02-26 11:09:39 +00005411 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005412 }
5413
5414 java_import {
5415 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005416 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005417 jars: ["libfoo.jar"],
5418 }
5419
5420 java_library {
5421 name: "libfoo",
5422 }
Paul Duffin39853512021-02-26 11:09:39 +00005423
5424 java_sdk_library_import {
5425 name: "libbar",
5426 prefer: true,
5427 public: {
5428 jars: ["libbar.jar"],
5429 },
5430 }
5431
5432 java_sdk_library {
5433 name: "libbar",
5434 srcs: ["foo/bar/MyClass.java"],
5435 unsafe_ignore_missing_latest_api: true,
5436 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005437 `
5438
5439 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5440 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5441
Paul Duffin89886cb2021-02-05 16:44:03 +00005442 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005443 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005444 ensureNoSourceVariant(t, ctx, "libfoo")
5445
5446 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005447 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005448 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005449 })
5450}
5451
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005452func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005453 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005454 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005455 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5456 // is disabled.
5457 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5458 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005459
Paul Duffin37856732021-02-26 14:24:15 +00005460 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5461 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005462 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005463 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005464 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005466 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005467 foundLibfooJar = true
5468 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005469 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005470 }
5471 }
5472 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005473 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 +00005474 }
5475 }
5476
Paul Duffin40a3f652021-07-19 13:11:24 +01005477 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005478 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005479 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005480 var rule android.TestingBuildParams
5481
5482 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5483 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005484 }
5485
Paul Duffin40a3f652021-07-19 13:11:24 +01005486 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5487 t.Helper()
5488 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5489 var rule android.TestingBuildParams
5490
5491 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5492 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5493 }
5494
Paul Duffin89f570a2021-06-16 01:42:33 +01005495 fragment := java.ApexVariantReference{
5496 Apex: proptools.StringPtr("myapex"),
5497 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5498 }
5499
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005500 t.Run("prebuilt only", func(t *testing.T) {
5501 bp := `
5502 prebuilt_apex {
5503 name: "myapex",
5504 arch: {
5505 arm64: {
5506 src: "myapex-arm64.apex",
5507 },
5508 arm: {
5509 src: "myapex-arm.apex",
5510 },
5511 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005512 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5513 }
5514
5515 prebuilt_bootclasspath_fragment {
5516 name: "my-bootclasspath-fragment",
5517 contents: ["libfoo", "libbar"],
5518 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005519 hidden_api: {
5520 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5521 metadata: "my-bootclasspath-fragment/metadata.csv",
5522 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005523 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5524 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5525 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005526 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005527 }
5528
5529 java_import {
5530 name: "libfoo",
5531 jars: ["libfoo.jar"],
5532 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005533 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005534 }
Paul Duffin37856732021-02-26 14:24:15 +00005535
5536 java_sdk_library_import {
5537 name: "libbar",
5538 public: {
5539 jars: ["libbar.jar"],
5540 },
5541 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005542 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005543 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005544 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005545 `
5546
Paul Duffin89f570a2021-06-16 01:42:33 +01005547 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005548 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5549 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005550
Paul Duffin537ea3d2021-05-14 10:38:00 +01005551 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005552 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005553 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005554 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005555 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005556 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 +01005557 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005558 })
5559
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005560 t.Run("apex_set only", func(t *testing.T) {
5561 bp := `
5562 apex_set {
5563 name: "myapex",
5564 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005565 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005566 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005567 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5568 }
5569
5570 java_import {
5571 name: "myjavalib",
5572 jars: ["myjavalib.jar"],
5573 apex_available: ["myapex"],
5574 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005575 }
5576
5577 prebuilt_bootclasspath_fragment {
5578 name: "my-bootclasspath-fragment",
5579 contents: ["libfoo", "libbar"],
5580 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005581 hidden_api: {
5582 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5583 metadata: "my-bootclasspath-fragment/metadata.csv",
5584 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005585 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5586 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5587 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005588 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005589 }
5590
Liz Kammer2dc72442023-04-20 10:10:48 -04005591 prebuilt_systemserverclasspath_fragment {
5592 name: "my-systemserverclasspath-fragment",
5593 contents: ["libbaz"],
5594 apex_available: ["myapex"],
5595 }
5596
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005597 java_import {
5598 name: "libfoo",
5599 jars: ["libfoo.jar"],
5600 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005601 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005602 }
5603
5604 java_sdk_library_import {
5605 name: "libbar",
5606 public: {
5607 jars: ["libbar.jar"],
5608 },
5609 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005610 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005611 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005612 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005613
5614 java_sdk_library_import {
5615 name: "libbaz",
5616 public: {
5617 jars: ["libbaz.jar"],
5618 },
5619 apex_available: ["myapex"],
5620 shared_library: false,
5621 permitted_packages: ["baz"],
5622 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005623 `
5624
Paul Duffin89f570a2021-06-16 01:42:33 +01005625 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005626 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5627 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5628
Paul Duffin537ea3d2021-05-14 10:38:00 +01005629 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005630 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005631 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005632 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005633 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005634 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 +01005635 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005636
5637 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5638
5639 overrideNames := []string{
5640 "",
5641 "myjavalib.myapex",
5642 "libfoo.myapex",
5643 "libbar.myapex",
5644 "libbaz.myapex",
5645 }
5646 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5647 for i, e := range mkEntries {
5648 g := e.OverrideName
5649 if w := overrideNames[i]; w != g {
5650 t.Errorf("Expected override name %q, got %q", w, g)
5651 }
5652 }
5653
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005654 })
5655
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005656 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5657 bp := `
5658 prebuilt_apex {
5659 name: "myapex",
5660 arch: {
5661 arm64: {
5662 src: "myapex-arm64.apex",
5663 },
5664 arm: {
5665 src: "myapex-arm.apex",
5666 },
5667 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005668 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5669 }
5670
5671 prebuilt_bootclasspath_fragment {
5672 name: "my-bootclasspath-fragment",
5673 contents: ["libfoo", "libbar"],
5674 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005675 hidden_api: {
5676 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5677 metadata: "my-bootclasspath-fragment/metadata.csv",
5678 index: "my-bootclasspath-fragment/index.csv",
5679 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5680 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5681 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005682 }
5683
5684 java_import {
5685 name: "libfoo",
5686 jars: ["libfoo.jar"],
5687 apex_available: ["myapex"],
5688 }
5689
5690 java_library {
5691 name: "libfoo",
5692 srcs: ["foo/bar/MyClass.java"],
5693 apex_available: ["myapex"],
5694 }
Paul Duffin37856732021-02-26 14:24:15 +00005695
5696 java_sdk_library_import {
5697 name: "libbar",
5698 public: {
5699 jars: ["libbar.jar"],
5700 },
5701 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005702 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005703 }
5704
5705 java_sdk_library {
5706 name: "libbar",
5707 srcs: ["foo/bar/MyClass.java"],
5708 unsafe_ignore_missing_latest_api: true,
5709 apex_available: ["myapex"],
5710 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005711 `
5712
5713 // In this test the source (java_library) libfoo is active since the
5714 // prebuilt (java_import) defaults to prefer:false. However the
5715 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5716 // find the dex boot jar in it. We either need to disable the source libfoo
5717 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005718 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005719 // dexbootjar check is skipped if AllowMissingDependencies is true
5720 preparerAllowMissingDeps := android.GroupFixturePreparers(
5721 preparer,
5722 android.PrepareForTestWithAllowMissingDependencies,
5723 )
5724 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005725 })
5726
5727 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5728 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005729 apex {
5730 name: "myapex",
5731 key: "myapex.key",
5732 updatable: false,
5733 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5734 }
5735
5736 apex_key {
5737 name: "myapex.key",
5738 public_key: "testkey.avbpubkey",
5739 private_key: "testkey.pem",
5740 }
5741
5742 bootclasspath_fragment {
5743 name: "my-bootclasspath-fragment",
5744 contents: ["libfoo", "libbar"],
5745 apex_available: ["myapex"],
5746 hidden_api: {
5747 split_packages: ["*"],
5748 },
5749 }
5750
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005751 prebuilt_apex {
5752 name: "myapex",
5753 arch: {
5754 arm64: {
5755 src: "myapex-arm64.apex",
5756 },
5757 arm: {
5758 src: "myapex-arm.apex",
5759 },
5760 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005761 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5762 }
5763
5764 prebuilt_bootclasspath_fragment {
5765 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005766 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005767 contents: ["libfoo", "libbar"],
5768 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005769 hidden_api: {
5770 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5771 metadata: "my-bootclasspath-fragment/metadata.csv",
5772 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005773 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5774 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5775 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005776 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005777 }
5778
5779 java_import {
5780 name: "libfoo",
5781 prefer: true,
5782 jars: ["libfoo.jar"],
5783 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005784 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005785 }
5786
5787 java_library {
5788 name: "libfoo",
5789 srcs: ["foo/bar/MyClass.java"],
5790 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005791 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005792 }
Paul Duffin37856732021-02-26 14:24:15 +00005793
5794 java_sdk_library_import {
5795 name: "libbar",
5796 prefer: true,
5797 public: {
5798 jars: ["libbar.jar"],
5799 },
5800 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005801 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005802 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005803 }
5804
5805 java_sdk_library {
5806 name: "libbar",
5807 srcs: ["foo/bar/MyClass.java"],
5808 unsafe_ignore_missing_latest_api: true,
5809 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005810 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005811 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005812 `
5813
Paul Duffin89f570a2021-06-16 01:42:33 +01005814 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005815 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5816 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005817
Paul Duffin537ea3d2021-05-14 10:38:00 +01005818 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005819 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005820 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005821 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005822 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005823 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 +01005824 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005825 })
5826
5827 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5828 bp := `
5829 apex {
5830 name: "myapex",
5831 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005832 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005833 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005834 }
5835
5836 apex_key {
5837 name: "myapex.key",
5838 public_key: "testkey.avbpubkey",
5839 private_key: "testkey.pem",
5840 }
5841
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005842 bootclasspath_fragment {
5843 name: "my-bootclasspath-fragment",
5844 contents: ["libfoo", "libbar"],
5845 apex_available: ["myapex"],
5846 hidden_api: {
5847 split_packages: ["*"],
5848 },
5849 }
5850
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005851 prebuilt_apex {
5852 name: "myapex",
5853 arch: {
5854 arm64: {
5855 src: "myapex-arm64.apex",
5856 },
5857 arm: {
5858 src: "myapex-arm.apex",
5859 },
5860 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005861 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5862 }
5863
5864 prebuilt_bootclasspath_fragment {
5865 name: "my-bootclasspath-fragment",
5866 contents: ["libfoo", "libbar"],
5867 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005868 hidden_api: {
5869 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5870 metadata: "my-bootclasspath-fragment/metadata.csv",
5871 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005872 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5873 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5874 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005875 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005876 }
5877
5878 java_import {
5879 name: "libfoo",
5880 jars: ["libfoo.jar"],
5881 apex_available: ["myapex"],
5882 }
5883
5884 java_library {
5885 name: "libfoo",
5886 srcs: ["foo/bar/MyClass.java"],
5887 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005888 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005889 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005890 }
Paul Duffin37856732021-02-26 14:24:15 +00005891
5892 java_sdk_library_import {
5893 name: "libbar",
5894 public: {
5895 jars: ["libbar.jar"],
5896 },
5897 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005898 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005899 }
5900
5901 java_sdk_library {
5902 name: "libbar",
5903 srcs: ["foo/bar/MyClass.java"],
5904 unsafe_ignore_missing_latest_api: true,
5905 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005906 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005907 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005908 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005909 `
5910
Paul Duffin89f570a2021-06-16 01:42:33 +01005911 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005912 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5913 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005914
Paul Duffin537ea3d2021-05-14 10:38:00 +01005915 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005916 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005917 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5918 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005919 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5920 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 +01005921 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005922 })
5923
5924 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5925 bp := `
5926 apex {
5927 name: "myapex",
5928 enabled: false,
5929 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005930 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005931 }
5932
5933 apex_key {
5934 name: "myapex.key",
5935 public_key: "testkey.avbpubkey",
5936 private_key: "testkey.pem",
5937 }
5938
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005939 bootclasspath_fragment {
5940 name: "my-bootclasspath-fragment",
5941 enabled: false,
5942 contents: ["libfoo", "libbar"],
5943 apex_available: ["myapex"],
5944 hidden_api: {
5945 split_packages: ["*"],
5946 },
5947 }
5948
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005949 prebuilt_apex {
5950 name: "myapex",
5951 arch: {
5952 arm64: {
5953 src: "myapex-arm64.apex",
5954 },
5955 arm: {
5956 src: "myapex-arm.apex",
5957 },
5958 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005959 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5960 }
5961
5962 prebuilt_bootclasspath_fragment {
5963 name: "my-bootclasspath-fragment",
5964 contents: ["libfoo", "libbar"],
5965 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005966 hidden_api: {
5967 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5968 metadata: "my-bootclasspath-fragment/metadata.csv",
5969 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005970 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5971 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5972 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005973 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005974 }
5975
5976 java_import {
5977 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005978 jars: ["libfoo.jar"],
5979 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005980 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005981 }
5982
5983 java_library {
5984 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005985 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005986 srcs: ["foo/bar/MyClass.java"],
5987 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005988 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005989 }
Paul Duffin37856732021-02-26 14:24:15 +00005990
5991 java_sdk_library_import {
5992 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005993 public: {
5994 jars: ["libbar.jar"],
5995 },
5996 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005997 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005998 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005999 }
6000
6001 java_sdk_library {
6002 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006003 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006004 srcs: ["foo/bar/MyClass.java"],
6005 unsafe_ignore_missing_latest_api: true,
6006 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006007 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006008 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006009 `
6010
Paul Duffin89f570a2021-06-16 01:42:33 +01006011 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006012 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6013 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006014
Paul Duffin537ea3d2021-05-14 10:38:00 +01006015 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006016 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006017 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006018 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006019 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006020 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 +01006021 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006022 })
6023}
6024
Roland Levillain630846d2019-06-26 12:48:34 +01006025func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006026 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006027 apex_test {
6028 name: "myapex",
6029 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006030 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006031 tests: [
6032 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006033 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006034 ],
6035 }
6036
6037 apex_key {
6038 name: "myapex.key",
6039 public_key: "testkey.avbpubkey",
6040 private_key: "testkey.pem",
6041 }
6042
Liz Kammer1c14a212020-05-12 15:26:55 -07006043 filegroup {
6044 name: "fg",
6045 srcs: [
6046 "baz",
6047 "bar/baz"
6048 ],
6049 }
6050
Roland Levillain630846d2019-06-26 12:48:34 +01006051 cc_test {
6052 name: "mytest",
6053 gtest: false,
6054 srcs: ["mytest.cpp"],
6055 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006056 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006057 system_shared_libs: [],
6058 static_executable: true,
6059 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006060 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006061 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006062
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006063 cc_library {
6064 name: "mylib",
6065 srcs: ["mylib.cpp"],
6066 system_shared_libs: [],
6067 stl: "none",
6068 }
6069
Liz Kammer5bd365f2020-05-27 15:15:11 -07006070 filegroup {
6071 name: "fg2",
6072 srcs: [
6073 "testdata/baz"
6074 ],
6075 }
6076
Roland Levillain9b5fde92019-06-28 15:41:19 +01006077 cc_test {
6078 name: "mytests",
6079 gtest: false,
6080 srcs: [
6081 "mytest1.cpp",
6082 "mytest2.cpp",
6083 "mytest3.cpp",
6084 ],
6085 test_per_src: true,
6086 relative_install_path: "test",
6087 system_shared_libs: [],
6088 static_executable: true,
6089 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006090 data: [
6091 ":fg",
6092 ":fg2",
6093 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006094 }
Roland Levillain630846d2019-06-26 12:48:34 +01006095 `)
6096
Jooyung Hana0503a52023-08-23 13:12:50 +09006097 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006098 copyCmds := apexRule.Args["copy_commands"]
6099
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006100 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006101 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006102 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006103
Liz Kammer1c14a212020-05-12 15:26:55 -07006104 //Ensure that test data are copied into apex.
6105 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6106 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6107
Roland Levillain9b5fde92019-06-28 15:41:19 +01006108 // Ensure that test deps built with `test_per_src` are copied into apex.
6109 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6110 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6111 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006112
6113 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006114 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006115 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006116 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006117 prefix := "TARGET_"
6118 var builder strings.Builder
6119 data.Custom(&builder, name, prefix, "", data)
6120 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006121 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6122 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6123 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6124 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006125 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006126}
6127
Jooyung Hand48f3c32019-08-23 11:18:57 +09006128func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6129 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6130 apex {
6131 name: "myapex",
6132 key: "myapex.key",
6133 native_shared_libs: ["libfoo"],
6134 }
6135
6136 apex_key {
6137 name: "myapex.key",
6138 public_key: "testkey.avbpubkey",
6139 private_key: "testkey.pem",
6140 }
6141
6142 cc_library {
6143 name: "libfoo",
6144 stl: "none",
6145 system_shared_libs: [],
6146 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006147 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006148 }
6149 `)
6150 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6151 apex {
6152 name: "myapex",
6153 key: "myapex.key",
6154 java_libs: ["myjar"],
6155 }
6156
6157 apex_key {
6158 name: "myapex.key",
6159 public_key: "testkey.avbpubkey",
6160 private_key: "testkey.pem",
6161 }
6162
6163 java_library {
6164 name: "myjar",
6165 srcs: ["foo/bar/MyClass.java"],
6166 sdk_version: "none",
6167 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006168 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006169 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006170 }
6171 `)
6172}
6173
Bill Peckhama41a6962021-01-11 10:58:54 -08006174func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006175 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006176 apex {
6177 name: "myapex",
6178 key: "myapex.key",
6179 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006180 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006181 }
6182
6183 apex_key {
6184 name: "myapex.key",
6185 public_key: "testkey.avbpubkey",
6186 private_key: "testkey.pem",
6187 }
6188
6189 java_import {
6190 name: "myjavaimport",
6191 apex_available: ["myapex"],
6192 jars: ["my.jar"],
6193 compile_dex: true,
6194 }
6195 `)
6196
Jooyung Hana0503a52023-08-23 13:12:50 +09006197 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006198 apexRule := module.Rule("apexRule")
6199 copyCmds := apexRule.Args["copy_commands"]
6200 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6201}
6202
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006203func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006204 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006205 apex {
6206 name: "myapex",
6207 key: "myapex.key",
6208 apps: [
6209 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006210 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006211 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006212 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006213 }
6214
6215 apex_key {
6216 name: "myapex.key",
6217 public_key: "testkey.avbpubkey",
6218 private_key: "testkey.pem",
6219 }
6220
6221 android_app {
6222 name: "AppFoo",
6223 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006224 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006225 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006226 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006227 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006228 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006229 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006230
6231 android_app {
6232 name: "AppFooPriv",
6233 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006234 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006235 system_modules: "none",
6236 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006237 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006238 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006239 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006240 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006241
6242 cc_library_shared {
6243 name: "libjni",
6244 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006245 shared_libs: ["libfoo"],
6246 stl: "none",
6247 system_shared_libs: [],
6248 apex_available: [ "myapex" ],
6249 sdk_version: "current",
6250 }
6251
6252 cc_library_shared {
6253 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006254 stl: "none",
6255 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006256 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006257 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006258 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006259 `)
6260
Jooyung Hana0503a52023-08-23 13:12:50 +09006261 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006262 apexRule := module.Rule("apexRule")
6263 copyCmds := apexRule.Args["copy_commands"]
6264
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006265 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6266 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006267 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006268
Colin Crossaede88c2020-08-11 12:17:01 -07006269 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006270 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006271 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006272 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006273 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006274 // JNI libraries including transitive deps are
6275 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006276 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006277 // ... embedded inside APK (jnilibs.zip)
6278 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6279 // ... and not directly inside the APEX
6280 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6281 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006282
6283 apexBundle := module.Module().(*apexBundle)
6284 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6285 var builder strings.Builder
6286 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6287 androidMk := builder.String()
6288 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6289 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6290 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6291 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6292 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6293 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 +01006294}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006295
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006296func TestApexWithAppImportBuildId(t *testing.T) {
6297 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6298 for _, id := range invalidBuildIds {
6299 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6300 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6301 variables.BuildId = proptools.StringPtr(id)
6302 })
6303 testApexError(t, message, `apex {
6304 name: "myapex",
6305 key: "myapex.key",
6306 apps: ["AppFooPrebuilt"],
6307 updatable: false,
6308 }
6309
6310 apex_key {
6311 name: "myapex.key",
6312 public_key: "testkey.avbpubkey",
6313 private_key: "testkey.pem",
6314 }
6315
6316 android_app_import {
6317 name: "AppFooPrebuilt",
6318 apk: "PrebuiltAppFoo.apk",
6319 presigned: true,
6320 apex_available: ["myapex"],
6321 }
6322 `, fixture)
6323 }
6324}
6325
Dario Frenicde2a032019-10-27 00:29:22 +01006326func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006327 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006328 apex {
6329 name: "myapex",
6330 key: "myapex.key",
6331 apps: [
6332 "AppFooPrebuilt",
6333 "AppFooPrivPrebuilt",
6334 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006335 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006336 }
6337
6338 apex_key {
6339 name: "myapex.key",
6340 public_key: "testkey.avbpubkey",
6341 private_key: "testkey.pem",
6342 }
6343
6344 android_app_import {
6345 name: "AppFooPrebuilt",
6346 apk: "PrebuiltAppFoo.apk",
6347 presigned: true,
6348 dex_preopt: {
6349 enabled: false,
6350 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006351 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006352 }
6353
6354 android_app_import {
6355 name: "AppFooPrivPrebuilt",
6356 apk: "PrebuiltAppFooPriv.apk",
6357 privileged: true,
6358 presigned: true,
6359 dex_preopt: {
6360 enabled: false,
6361 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006362 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006363 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006364 }
6365 `)
6366
Jooyung Hana0503a52023-08-23 13:12:50 +09006367 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006368 apexRule := module.Rule("apexRule")
6369 copyCmds := apexRule.Args["copy_commands"]
6370
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006371 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6372 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006373}
6374
6375func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006376 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006377 apex {
6378 name: "myapex",
6379 key: "myapex.key",
6380 apps: [
6381 "AppFoo",
6382 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006383 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006384 }
6385
6386 apex_key {
6387 name: "myapex.key",
6388 public_key: "testkey.avbpubkey",
6389 private_key: "testkey.pem",
6390 }
6391
6392 android_app {
6393 name: "AppFoo",
6394 srcs: ["foo/bar/MyClass.java"],
6395 sdk_version: "none",
6396 system_modules: "none",
6397 apex_available: [ "myapex" ],
6398 }
6399
6400 android_app_import {
6401 name: "AppFoo",
6402 apk: "AppFooPrebuilt.apk",
6403 filename: "AppFooPrebuilt.apk",
6404 presigned: true,
6405 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006406 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006407 }
6408 `, withFiles(map[string][]byte{
6409 "AppFooPrebuilt.apk": nil,
6410 }))
6411
Jooyung Hana0503a52023-08-23 13:12:50 +09006412 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006413 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006414 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006415}
6416
Dario Freni6f3937c2019-12-20 22:58:03 +00006417func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006418 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006419 apex {
6420 name: "myapex",
6421 key: "myapex.key",
6422 apps: [
6423 "TesterHelpAppFoo",
6424 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006425 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006426 }
6427
6428 apex_key {
6429 name: "myapex.key",
6430 public_key: "testkey.avbpubkey",
6431 private_key: "testkey.pem",
6432 }
6433
6434 android_test_helper_app {
6435 name: "TesterHelpAppFoo",
6436 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006437 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006438 }
6439
6440 `)
6441
Jooyung Hana0503a52023-08-23 13:12:50 +09006442 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006443 apexRule := module.Rule("apexRule")
6444 copyCmds := apexRule.Args["copy_commands"]
6445
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006446 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006447}
6448
Jooyung Han18020ea2019-11-13 10:50:48 +09006449func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6450 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006451 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006452 apex {
6453 name: "myapex",
6454 key: "myapex.key",
6455 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006456 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006457 }
6458
6459 apex_key {
6460 name: "myapex.key",
6461 public_key: "testkey.avbpubkey",
6462 private_key: "testkey.pem",
6463 }
6464
6465 apex {
6466 name: "otherapex",
6467 key: "myapex.key",
6468 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006469 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006470 }
6471
6472 cc_defaults {
6473 name: "libfoo-defaults",
6474 apex_available: ["otherapex"],
6475 }
6476
6477 cc_library {
6478 name: "libfoo",
6479 defaults: ["libfoo-defaults"],
6480 stl: "none",
6481 system_shared_libs: [],
6482 }`)
6483}
6484
Paul Duffine52e66f2020-03-30 17:54:29 +01006485func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006486 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006487 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006488 apex {
6489 name: "myapex",
6490 key: "myapex.key",
6491 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006492 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006493 }
6494
6495 apex_key {
6496 name: "myapex.key",
6497 public_key: "testkey.avbpubkey",
6498 private_key: "testkey.pem",
6499 }
6500
6501 apex {
6502 name: "otherapex",
6503 key: "otherapex.key",
6504 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006505 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006506 }
6507
6508 apex_key {
6509 name: "otherapex.key",
6510 public_key: "testkey.avbpubkey",
6511 private_key: "testkey.pem",
6512 }
6513
6514 cc_library {
6515 name: "libfoo",
6516 stl: "none",
6517 system_shared_libs: [],
6518 apex_available: ["otherapex"],
6519 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006520}
Jiyong Park127b40b2019-09-30 16:04:35 +09006521
Paul Duffine52e66f2020-03-30 17:54:29 +01006522func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006523 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006524 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006525.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006526.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006527.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006528.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006529.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006530.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006531 apex {
6532 name: "myapex",
6533 key: "myapex.key",
6534 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006535 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006536 }
6537
6538 apex_key {
6539 name: "myapex.key",
6540 public_key: "testkey.avbpubkey",
6541 private_key: "testkey.pem",
6542 }
6543
Jiyong Park127b40b2019-09-30 16:04:35 +09006544 cc_library {
6545 name: "libfoo",
6546 stl: "none",
6547 shared_libs: ["libbar"],
6548 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006549 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006550 }
6551
6552 cc_library {
6553 name: "libbar",
6554 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006555 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006556 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006557 apex_available: ["myapex"],
6558 }
6559
6560 cc_library {
6561 name: "libbaz",
6562 stl: "none",
6563 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006564 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006565}
Jiyong Park127b40b2019-09-30 16:04:35 +09006566
Liz Kammer5f108fa2023-05-11 14:33:17 -04006567func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6568 testApex(t, `
6569 apex {
6570 name: "myapex",
6571 key: "myapex.key",
6572 native_shared_libs: ["libfoo"],
6573 updatable: false,
6574 }
6575
6576 apex_key {
6577 name: "myapex.key",
6578 public_key: "testkey.avbpubkey",
6579 private_key: "testkey.pem",
6580 }
6581
6582 cc_library {
6583 name: "libfoo",
6584 stl: "none",
6585 static_libs: ["libbar"],
6586 system_shared_libs: [],
6587 apex_available: ["myapex"],
6588 }
6589
6590 cc_library {
6591 name: "libbar",
6592 stl: "none",
6593 shared_libs: ["libbaz"],
6594 system_shared_libs: [],
6595 apex_available: ["myapex"],
6596 }
6597
6598 cc_library {
6599 name: "libbaz",
6600 stl: "none",
6601 system_shared_libs: [],
6602 }`)
6603
6604 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6605 apex {
6606 name: "myapex",
6607 key: "myapex.key",
6608 native_shared_libs: ["libfoo"],
6609 updatable: false,
6610 }
6611
6612 apex_key {
6613 name: "myapex.key",
6614 public_key: "testkey.avbpubkey",
6615 private_key: "testkey.pem",
6616 }
6617
6618 cc_library {
6619 name: "libfoo",
6620 stl: "none",
6621 static_libs: ["libbar"],
6622 system_shared_libs: [],
6623 apex_available: ["myapex"],
6624 }
6625
6626 cc_library {
6627 name: "libbar",
6628 stl: "none",
6629 system_shared_libs: [],
6630 }`)
6631}
6632
Paul Duffine52e66f2020-03-30 17:54:29 +01006633func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006634 testApexError(t, "\"otherapex\" is not a valid module name", `
6635 apex {
6636 name: "myapex",
6637 key: "myapex.key",
6638 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006639 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006640 }
6641
6642 apex_key {
6643 name: "myapex.key",
6644 public_key: "testkey.avbpubkey",
6645 private_key: "testkey.pem",
6646 }
6647
6648 cc_library {
6649 name: "libfoo",
6650 stl: "none",
6651 system_shared_libs: [],
6652 apex_available: ["otherapex"],
6653 }`)
6654
Paul Duffine52e66f2020-03-30 17:54:29 +01006655 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006656 apex {
6657 name: "myapex",
6658 key: "myapex.key",
6659 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006660 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006661 }
6662
6663 apex_key {
6664 name: "myapex.key",
6665 public_key: "testkey.avbpubkey",
6666 private_key: "testkey.pem",
6667 }
6668
6669 cc_library {
6670 name: "libfoo",
6671 stl: "none",
6672 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006673 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006674 apex_available: ["myapex"],
6675 }
6676
6677 cc_library {
6678 name: "libbar",
6679 stl: "none",
6680 system_shared_libs: [],
6681 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006682 }
6683
6684 cc_library {
6685 name: "libbaz",
6686 stl: "none",
6687 system_shared_libs: [],
6688 stubs: {
6689 versions: ["10", "20", "30"],
6690 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006691 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006692}
Jiyong Park127b40b2019-09-30 16:04:35 +09006693
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006694func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6695 t.Run("negative variant_version produces error", func(t *testing.T) {
6696 testApexError(t, "expected an integer between 0-9; got -1", `
6697 apex {
6698 name: "myapex",
6699 key: "myapex.key",
6700 apex_available_name: "com.android.foo",
6701 variant_version: "-1",
6702 updatable: false,
6703 }
6704 apex_key {
6705 name: "myapex.key",
6706 public_key: "testkey.avbpubkey",
6707 private_key: "testkey.pem",
6708 }
6709 `)
6710 })
6711
6712 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6713 testApexError(t, "expected an integer between 0-9; got 10", `
6714 apex {
6715 name: "myapex",
6716 key: "myapex.key",
6717 apex_available_name: "com.android.foo",
6718 variant_version: "10",
6719 updatable: false,
6720 }
6721 apex_key {
6722 name: "myapex.key",
6723 public_key: "testkey.avbpubkey",
6724 private_key: "testkey.pem",
6725 }
6726 `)
6727 })
6728}
6729
6730func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6731 context := android.GroupFixturePreparers(
6732 android.PrepareForIntegrationTestWithAndroid,
6733 PrepareForTestWithApexBuildComponents,
6734 android.FixtureMergeMockFs(android.MockFS{
6735 "system/sepolicy/apex/foo-file_contexts": nil,
6736 "system/sepolicy/apex/bar-file_contexts": nil,
6737 }),
6738 )
6739 result := context.RunTestWithBp(t, `
6740 apex {
6741 name: "foo",
6742 key: "myapex.key",
6743 apex_available_name: "com.android.foo",
6744 variant_version: "0",
6745 updatable: false,
6746 }
6747 apex {
6748 name: "bar",
6749 key: "myapex.key",
6750 apex_available_name: "com.android.foo",
6751 variant_version: "3",
6752 updatable: false,
6753 }
6754 apex_key {
6755 name: "myapex.key",
6756 public_key: "testkey.avbpubkey",
6757 private_key: "testkey.pem",
6758 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006759 override_apex {
6760 name: "myoverrideapex",
6761 base: "bar",
6762 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006763 `)
6764
Jooyung Hana0503a52023-08-23 13:12:50 +09006765 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006766 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6767 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6768 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6769 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6770 }
6771
Jooyung Hana0503a52023-08-23 13:12:50 +09006772 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006773 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6774 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6775 barActualDefaultVersion := barManifestRule.Args["default_version"]
6776 if barActualDefaultVersion != barExpectedDefaultVersion {
6777 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6778 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006779
Jooyung Hana0503a52023-08-23 13:12:50 +09006780 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006781 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6782 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6783 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6784 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006785}
6786
Sam Delmericoca816532023-06-02 14:09:50 -04006787func TestApexAvailable_ApexAvailableName(t *testing.T) {
6788 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6789 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6790 apex {
6791 name: "myapex_sminus",
6792 key: "myapex.key",
6793 apps: ["AppFoo"],
6794 apex_available_name: "myapex",
6795 updatable: false,
6796 }
6797 apex {
6798 name: "myapex",
6799 key: "myapex.key",
6800 apps: ["AppFoo"],
6801 updatable: false,
6802 }
6803 apex_key {
6804 name: "myapex.key",
6805 public_key: "testkey.avbpubkey",
6806 private_key: "testkey.pem",
6807 }
6808 android_app {
6809 name: "AppFoo",
6810 srcs: ["foo/bar/MyClass.java"],
6811 sdk_version: "none",
6812 system_modules: "none",
6813 apex_available: [ "myapex_sminus" ],
6814 }`,
6815 android.FixtureMergeMockFs(android.MockFS{
6816 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6817 }),
6818 )
6819 })
6820
6821 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6822 testApex(t, `
6823 apex {
6824 name: "myapex_sminus",
6825 key: "myapex.key",
6826 apps: ["AppFoo"],
6827 apex_available_name: "myapex",
6828 updatable: false,
6829 }
6830 apex {
6831 name: "myapex",
6832 key: "myapex.key",
6833 apps: ["AppFoo"],
6834 updatable: false,
6835 }
6836 apex_key {
6837 name: "myapex.key",
6838 public_key: "testkey.avbpubkey",
6839 private_key: "testkey.pem",
6840 }
6841 android_app {
6842 name: "AppFoo",
6843 srcs: ["foo/bar/MyClass.java"],
6844 sdk_version: "none",
6845 system_modules: "none",
6846 apex_available: [ "myapex" ],
6847 }`,
6848 android.FixtureMergeMockFs(android.MockFS{
6849 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6850 }),
6851 )
6852 })
6853
6854 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6855 testApex(t, `
6856 override_apex {
6857 name: "myoverrideapex_sminus",
6858 base: "myapex_sminus",
6859 key: "myapex.key",
6860 apps: ["AppFooOverride"],
6861 }
6862 override_apex {
6863 name: "myoverrideapex",
6864 base: "myapex",
6865 key: "myapex.key",
6866 apps: ["AppFooOverride"],
6867 }
6868 apex {
6869 name: "myapex_sminus",
6870 key: "myapex.key",
6871 apps: ["AppFoo"],
6872 apex_available_name: "myapex",
6873 updatable: false,
6874 }
6875 apex {
6876 name: "myapex",
6877 key: "myapex.key",
6878 apps: ["AppFoo"],
6879 updatable: false,
6880 }
6881 apex_key {
6882 name: "myapex.key",
6883 public_key: "testkey.avbpubkey",
6884 private_key: "testkey.pem",
6885 }
6886 android_app {
6887 name: "AppFooOverride",
6888 srcs: ["foo/bar/MyClass.java"],
6889 sdk_version: "none",
6890 system_modules: "none",
6891 apex_available: [ "myapex" ],
6892 }
6893 android_app {
6894 name: "AppFoo",
6895 srcs: ["foo/bar/MyClass.java"],
6896 sdk_version: "none",
6897 system_modules: "none",
6898 apex_available: [ "myapex" ],
6899 }`,
6900 android.FixtureMergeMockFs(android.MockFS{
6901 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6902 }),
6903 )
6904 })
6905}
6906
6907func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6908 context := android.GroupFixturePreparers(
6909 android.PrepareForIntegrationTestWithAndroid,
6910 PrepareForTestWithApexBuildComponents,
6911 java.PrepareForTestWithDexpreopt,
6912 android.FixtureMergeMockFs(android.MockFS{
6913 "system/sepolicy/apex/myapex-file_contexts": nil,
6914 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6915 }),
6916 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6917 variables.BuildId = proptools.StringPtr("buildid")
6918 }),
6919 )
6920 context.RunTestWithBp(t, `
6921 override_apex {
6922 name: "myoverrideapex_sminus",
6923 base: "myapex_sminus",
6924 }
6925 override_apex {
6926 name: "myoverrideapex",
6927 base: "myapex",
6928 }
6929 apex {
6930 name: "myapex",
6931 key: "myapex.key",
6932 apps: ["AppFoo"],
6933 updatable: false,
6934 }
6935 apex {
6936 name: "myapex_sminus",
6937 apex_available_name: "myapex",
6938 key: "myapex.key",
6939 apps: ["AppFoo_sminus"],
6940 updatable: false,
6941 }
6942 apex_key {
6943 name: "myapex.key",
6944 public_key: "testkey.avbpubkey",
6945 private_key: "testkey.pem",
6946 }
6947 android_app {
6948 name: "AppFoo",
6949 srcs: ["foo/bar/MyClass.java"],
6950 sdk_version: "none",
6951 system_modules: "none",
6952 apex_available: [ "myapex" ],
6953 }
6954 android_app {
6955 name: "AppFoo_sminus",
6956 srcs: ["foo/bar/MyClass.java"],
6957 sdk_version: "none",
6958 min_sdk_version: "29",
6959 system_modules: "none",
6960 apex_available: [ "myapex" ],
6961 }`)
6962}
6963
Jiyong Park89e850a2020-04-07 16:37:39 +09006964func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006965 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006966 apex {
6967 name: "myapex",
6968 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006969 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006970 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006971 }
6972
6973 apex_key {
6974 name: "myapex.key",
6975 public_key: "testkey.avbpubkey",
6976 private_key: "testkey.pem",
6977 }
6978
6979 cc_library {
6980 name: "libfoo",
6981 stl: "none",
6982 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006983 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006984 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006985 }
6986
6987 cc_library {
6988 name: "libfoo2",
6989 stl: "none",
6990 system_shared_libs: [],
6991 shared_libs: ["libbaz"],
6992 apex_available: ["//apex_available:platform"],
6993 }
6994
6995 cc_library {
6996 name: "libbar",
6997 stl: "none",
6998 system_shared_libs: [],
6999 apex_available: ["myapex"],
7000 }
7001
7002 cc_library {
7003 name: "libbaz",
7004 stl: "none",
7005 system_shared_libs: [],
7006 apex_available: ["myapex"],
7007 stubs: {
7008 versions: ["1"],
7009 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007010 }`)
7011
Jiyong Park89e850a2020-04-07 16:37:39 +09007012 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7013 // because it depends on libbar which isn't available to platform
7014 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7015 if libfoo.NotAvailableForPlatform() != true {
7016 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7017 }
7018
7019 // libfoo2 however can be available to platform because it depends on libbaz which provides
7020 // stubs
7021 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7022 if libfoo2.NotAvailableForPlatform() == true {
7023 t.Errorf("%q should be available to platform", libfoo2.String())
7024 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007025}
Jiyong Parka90ca002019-10-07 15:47:24 +09007026
Paul Duffine52e66f2020-03-30 17:54:29 +01007027func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007028 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007029 apex {
7030 name: "myapex",
7031 key: "myapex.key",
7032 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007033 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007034 }
7035
7036 apex_key {
7037 name: "myapex.key",
7038 public_key: "testkey.avbpubkey",
7039 private_key: "testkey.pem",
7040 }
7041
7042 cc_library {
7043 name: "libfoo",
7044 stl: "none",
7045 system_shared_libs: [],
7046 apex_available: ["myapex"],
7047 static: {
7048 apex_available: ["//apex_available:platform"],
7049 },
7050 }`)
7051
Jiyong Park89e850a2020-04-07 16:37:39 +09007052 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7053 if libfooShared.NotAvailableForPlatform() != true {
7054 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7055 }
7056 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7057 if libfooStatic.NotAvailableForPlatform() != false {
7058 t.Errorf("%q should be available to platform", libfooStatic.String())
7059 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007060}
7061
Jiyong Park5d790c32019-11-15 18:40:32 +09007062func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007063 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007064 apex {
7065 name: "myapex",
7066 key: "myapex.key",
7067 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007068 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007069 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007070 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007071 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007072 }
7073
7074 override_apex {
7075 name: "override_myapex",
7076 base: "myapex",
7077 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007078 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007079 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007080 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007081 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007082 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007083 key: "mynewapex.key",
7084 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007085 }
7086
7087 apex_key {
7088 name: "myapex.key",
7089 public_key: "testkey.avbpubkey",
7090 private_key: "testkey.pem",
7091 }
7092
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007093 apex_key {
7094 name: "mynewapex.key",
7095 public_key: "testkey2.avbpubkey",
7096 private_key: "testkey2.pem",
7097 }
7098
7099 android_app_certificate {
7100 name: "myapex.certificate",
7101 certificate: "testkey",
7102 }
7103
Jiyong Park5d790c32019-11-15 18:40:32 +09007104 android_app {
7105 name: "app",
7106 srcs: ["foo/bar/MyClass.java"],
7107 package_name: "foo",
7108 sdk_version: "none",
7109 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007110 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007111 }
7112
7113 override_android_app {
7114 name: "override_app",
7115 base: "app",
7116 package_name: "bar",
7117 }
markchien7c803b82021-08-26 22:10:06 +08007118
7119 bpf {
7120 name: "bpf",
7121 srcs: ["bpf.c"],
7122 }
7123
7124 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007125 name: "overrideBpf",
7126 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007127 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007128
7129 prebuilt_etc {
7130 name: "myetc",
7131 src: "myprebuilt",
7132 }
7133
7134 prebuilt_etc {
7135 name: "override_myetc",
7136 src: "override_myprebuilt",
7137 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007138 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007139
Jooyung Hana0503a52023-08-23 13:12:50 +09007140 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7141 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007142 if originalVariant.GetOverriddenBy() != "" {
7143 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7144 }
7145 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7146 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7147 }
7148
Jooyung Hana0503a52023-08-23 13:12:50 +09007149 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007150 apexRule := module.Rule("apexRule")
7151 copyCmds := apexRule.Args["copy_commands"]
7152
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007153 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7154 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007155
markchien7c803b82021-08-26 22:10:06 +08007156 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007157 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007158
Daniel Norman5a3ce132021-08-26 15:44:43 -07007159 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7160 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7161
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007162 apexBundle := module.Module().(*apexBundle)
7163 name := apexBundle.Name()
7164 if name != "override_myapex" {
7165 t.Errorf("name should be \"override_myapex\", but was %q", name)
7166 }
7167
Baligh Uddin004d7172020-02-19 21:29:28 -08007168 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7169 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7170 }
7171
Jiyong Park20bacab2020-03-03 11:45:41 +09007172 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007173 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007174 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7175
7176 signApkRule := module.Rule("signapk")
7177 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007178
Colin Crossaa255532020-07-03 13:18:24 -07007179 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007180 var builder strings.Builder
7181 data.Custom(&builder, name, "TARGET_", "", data)
7182 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007183 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7184 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007185 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007186 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007187 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007188 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007189 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007190 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007191}
7192
Albert Martineefabcf2022-03-21 20:11:16 +00007193func TestMinSdkVersionOverride(t *testing.T) {
7194 // Override from 29 to 31
7195 minSdkOverride31 := "31"
7196 ctx := testApex(t, `
7197 apex {
7198 name: "myapex",
7199 key: "myapex.key",
7200 native_shared_libs: ["mylib"],
7201 updatable: true,
7202 min_sdk_version: "29"
7203 }
7204
7205 override_apex {
7206 name: "override_myapex",
7207 base: "myapex",
7208 logging_parent: "com.foo.bar",
7209 package_name: "test.overridden.package"
7210 }
7211
7212 apex_key {
7213 name: "myapex.key",
7214 public_key: "testkey.avbpubkey",
7215 private_key: "testkey.pem",
7216 }
7217
7218 cc_library {
7219 name: "mylib",
7220 srcs: ["mylib.cpp"],
7221 runtime_libs: ["libbar"],
7222 system_shared_libs: [],
7223 stl: "none",
7224 apex_available: [ "myapex" ],
7225 min_sdk_version: "apex_inherit"
7226 }
7227
7228 cc_library {
7229 name: "libbar",
7230 srcs: ["mylib.cpp"],
7231 system_shared_libs: [],
7232 stl: "none",
7233 apex_available: [ "myapex" ],
7234 min_sdk_version: "apex_inherit"
7235 }
7236
7237 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7238
Jooyung Hana0503a52023-08-23 13:12:50 +09007239 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007240 copyCmds := apexRule.Args["copy_commands"]
7241
7242 // Ensure that direct non-stubs dep is always included
7243 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7244
7245 // Ensure that runtime_libs dep in included
7246 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7247
7248 // Ensure libraries target overridden min_sdk_version value
7249 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7250}
7251
7252func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7253 // Attempt to override from 31 to 29, should be a NOOP
7254 minSdkOverride29 := "29"
7255 ctx := testApex(t, `
7256 apex {
7257 name: "myapex",
7258 key: "myapex.key",
7259 native_shared_libs: ["mylib"],
7260 updatable: true,
7261 min_sdk_version: "31"
7262 }
7263
7264 override_apex {
7265 name: "override_myapex",
7266 base: "myapex",
7267 logging_parent: "com.foo.bar",
7268 package_name: "test.overridden.package"
7269 }
7270
7271 apex_key {
7272 name: "myapex.key",
7273 public_key: "testkey.avbpubkey",
7274 private_key: "testkey.pem",
7275 }
7276
7277 cc_library {
7278 name: "mylib",
7279 srcs: ["mylib.cpp"],
7280 runtime_libs: ["libbar"],
7281 system_shared_libs: [],
7282 stl: "none",
7283 apex_available: [ "myapex" ],
7284 min_sdk_version: "apex_inherit"
7285 }
7286
7287 cc_library {
7288 name: "libbar",
7289 srcs: ["mylib.cpp"],
7290 system_shared_libs: [],
7291 stl: "none",
7292 apex_available: [ "myapex" ],
7293 min_sdk_version: "apex_inherit"
7294 }
7295
7296 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7297
Jooyung Hana0503a52023-08-23 13:12:50 +09007298 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007299 copyCmds := apexRule.Args["copy_commands"]
7300
7301 // Ensure that direct non-stubs dep is always included
7302 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7303
7304 // Ensure that runtime_libs dep in included
7305 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7306
7307 // Ensure libraries target the original min_sdk_version value rather than the overridden
7308 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7309}
7310
Jooyung Han214bf372019-11-12 13:03:50 +09007311func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007312 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007313 apex {
7314 name: "myapex",
7315 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007316 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007317 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007318 }
7319
7320 apex_key {
7321 name: "myapex.key",
7322 public_key: "testkey.avbpubkey",
7323 private_key: "testkey.pem",
7324 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007325
7326 cc_library {
7327 name: "mylib",
7328 srcs: ["mylib.cpp"],
7329 stl: "libc++",
7330 system_shared_libs: [],
7331 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007332 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007333 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007334 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007335
Jooyung Hana0503a52023-08-23 13:12:50 +09007336 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007337 args := module.Rule("apexRule").Args
7338 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007339 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007340
7341 // The copies of the libraries in the apex should have one more dependency than
7342 // the ones outside the apex, namely the unwinder. Ideally we should check
7343 // the dependency names directly here but for some reason the names are blank in
7344 // this test.
7345 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007346 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007347 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7348 if len(apexImplicits) != len(nonApexImplicits)+1 {
7349 t.Errorf("%q missing unwinder dep", lib)
7350 }
7351 }
Jooyung Han214bf372019-11-12 13:03:50 +09007352}
7353
Paul Duffine05480a2021-03-08 15:07:14 +00007354var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007355 "api/current.txt": nil,
7356 "api/removed.txt": nil,
7357 "api/system-current.txt": nil,
7358 "api/system-removed.txt": nil,
7359 "api/test-current.txt": nil,
7360 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007361
Anton Hanssondff2c782020-12-21 17:10:01 +00007362 "100/public/api/foo.txt": nil,
7363 "100/public/api/foo-removed.txt": nil,
7364 "100/system/api/foo.txt": nil,
7365 "100/system/api/foo-removed.txt": nil,
7366
Paul Duffineedc5d52020-06-12 17:46:39 +01007367 // For java_sdk_library_import
7368 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007369}
7370
Jooyung Han58f26ab2019-12-18 15:34:32 +09007371func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007372 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007373 apex {
7374 name: "myapex",
7375 key: "myapex.key",
7376 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007377 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007378 }
7379
7380 apex_key {
7381 name: "myapex.key",
7382 public_key: "testkey.avbpubkey",
7383 private_key: "testkey.pem",
7384 }
7385
7386 java_sdk_library {
7387 name: "foo",
7388 srcs: ["a.java"],
7389 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007390 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007391 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007392
7393 prebuilt_apis {
7394 name: "sdk",
7395 api_dirs: ["100"],
7396 }
Paul Duffin9b879592020-05-26 13:21:35 +01007397 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007398
7399 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007400 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007401 "javalib/foo.jar",
7402 "etc/permissions/foo.xml",
7403 })
7404 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007405 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007406 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 +09007407}
7408
Paul Duffin9b879592020-05-26 13:21:35 +01007409func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007410 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007411 apex {
7412 name: "myapex",
7413 key: "myapex.key",
7414 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007415 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007416 }
7417
7418 apex_key {
7419 name: "myapex.key",
7420 public_key: "testkey.avbpubkey",
7421 private_key: "testkey.pem",
7422 }
7423
7424 java_sdk_library {
7425 name: "foo",
7426 srcs: ["a.java"],
7427 api_packages: ["foo"],
7428 apex_available: ["myapex"],
7429 sdk_version: "none",
7430 system_modules: "none",
7431 }
7432
7433 java_library {
7434 name: "bar",
7435 srcs: ["a.java"],
7436 libs: ["foo"],
7437 apex_available: ["myapex"],
7438 sdk_version: "none",
7439 system_modules: "none",
7440 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007441
7442 prebuilt_apis {
7443 name: "sdk",
7444 api_dirs: ["100"],
7445 }
Paul Duffin9b879592020-05-26 13:21:35 +01007446 `, withFiles(filesForSdkLibrary))
7447
7448 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007449 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007450 "javalib/bar.jar",
7451 "javalib/foo.jar",
7452 "etc/permissions/foo.xml",
7453 })
7454
7455 // The bar library should depend on the implementation jar.
7456 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007457 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007458 t.Errorf("expected %q, found %#q", expected, actual)
7459 }
7460}
7461
7462func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007463 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007464 apex {
7465 name: "myapex",
7466 key: "myapex.key",
7467 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007468 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007469 }
7470
7471 apex_key {
7472 name: "myapex.key",
7473 public_key: "testkey.avbpubkey",
7474 private_key: "testkey.pem",
7475 }
7476
7477 java_sdk_library {
7478 name: "foo",
7479 srcs: ["a.java"],
7480 api_packages: ["foo"],
7481 apex_available: ["myapex"],
7482 sdk_version: "none",
7483 system_modules: "none",
7484 }
7485
7486 java_library {
7487 name: "bar",
7488 srcs: ["a.java"],
7489 libs: ["foo"],
7490 sdk_version: "none",
7491 system_modules: "none",
7492 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007493
7494 prebuilt_apis {
7495 name: "sdk",
7496 api_dirs: ["100"],
7497 }
Paul Duffin9b879592020-05-26 13:21:35 +01007498 `, withFiles(filesForSdkLibrary))
7499
7500 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007501 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007502 "javalib/foo.jar",
7503 "etc/permissions/foo.xml",
7504 })
7505
7506 // The bar library should depend on the stubs jar.
7507 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007508 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007509 t.Errorf("expected %q, found %#q", expected, actual)
7510 }
7511}
7512
Paul Duffineedc5d52020-06-12 17:46:39 +01007513func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007514 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007515 prebuilt_apis {
7516 name: "sdk",
7517 api_dirs: ["100"],
7518 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007519 withFiles(map[string][]byte{
7520 "apex/a.java": nil,
7521 "apex/apex_manifest.json": nil,
7522 "apex/Android.bp": []byte(`
7523 package {
7524 default_visibility: ["//visibility:private"],
7525 }
7526
7527 apex {
7528 name: "myapex",
7529 key: "myapex.key",
7530 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007531 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007532 }
7533
7534 apex_key {
7535 name: "myapex.key",
7536 public_key: "testkey.avbpubkey",
7537 private_key: "testkey.pem",
7538 }
7539
7540 java_library {
7541 name: "bar",
7542 srcs: ["a.java"],
7543 libs: ["foo"],
7544 apex_available: ["myapex"],
7545 sdk_version: "none",
7546 system_modules: "none",
7547 }
7548`),
7549 "source/a.java": nil,
7550 "source/api/current.txt": nil,
7551 "source/api/removed.txt": nil,
7552 "source/Android.bp": []byte(`
7553 package {
7554 default_visibility: ["//visibility:private"],
7555 }
7556
7557 java_sdk_library {
7558 name: "foo",
7559 visibility: ["//apex"],
7560 srcs: ["a.java"],
7561 api_packages: ["foo"],
7562 apex_available: ["myapex"],
7563 sdk_version: "none",
7564 system_modules: "none",
7565 public: {
7566 enabled: true,
7567 },
7568 }
7569`),
7570 "prebuilt/a.jar": nil,
7571 "prebuilt/Android.bp": []byte(`
7572 package {
7573 default_visibility: ["//visibility:private"],
7574 }
7575
7576 java_sdk_library_import {
7577 name: "foo",
7578 visibility: ["//apex", "//source"],
7579 apex_available: ["myapex"],
7580 prefer: true,
7581 public: {
7582 jars: ["a.jar"],
7583 },
7584 }
7585`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007586 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007587 )
7588
7589 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007590 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007591 "javalib/bar.jar",
7592 "javalib/foo.jar",
7593 "etc/permissions/foo.xml",
7594 })
7595
7596 // The bar library should depend on the implementation jar.
7597 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007598 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007599 t.Errorf("expected %q, found %#q", expected, actual)
7600 }
7601}
7602
7603func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7604 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7605 apex {
7606 name: "myapex",
7607 key: "myapex.key",
7608 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007609 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007610 }
7611
7612 apex_key {
7613 name: "myapex.key",
7614 public_key: "testkey.avbpubkey",
7615 private_key: "testkey.pem",
7616 }
7617
7618 java_sdk_library_import {
7619 name: "foo",
7620 apex_available: ["myapex"],
7621 prefer: true,
7622 public: {
7623 jars: ["a.jar"],
7624 },
7625 }
7626
7627 `, withFiles(filesForSdkLibrary))
7628}
7629
atrost6e126252020-01-27 17:01:16 +00007630func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007631 result := android.GroupFixturePreparers(
7632 prepareForApexTest,
7633 java.PrepareForTestWithPlatformCompatConfig,
7634 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007635 apex {
7636 name: "myapex",
7637 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007638 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007639 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007640 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007641 }
7642
7643 apex_key {
7644 name: "myapex.key",
7645 public_key: "testkey.avbpubkey",
7646 private_key: "testkey.pem",
7647 }
7648
7649 platform_compat_config {
7650 name: "myjar-platform-compat-config",
7651 src: ":myjar",
7652 }
7653
7654 java_library {
7655 name: "myjar",
7656 srcs: ["foo/bar/MyClass.java"],
7657 sdk_version: "none",
7658 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007659 apex_available: [ "myapex" ],
7660 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007661
7662 // Make sure that a preferred prebuilt does not affect the apex contents.
7663 prebuilt_platform_compat_config {
7664 name: "myjar-platform-compat-config",
7665 metadata: "compat-config/metadata.xml",
7666 prefer: true,
7667 }
atrost6e126252020-01-27 17:01:16 +00007668 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007669 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007670 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007671 "etc/compatconfig/myjar-platform-compat-config.xml",
7672 "javalib/myjar.jar",
7673 })
7674}
7675
Jooyung Han862c0d62022-12-21 10:15:37 +09007676func TestNoDupeApexFiles(t *testing.T) {
7677 android.GroupFixturePreparers(
7678 android.PrepareForTestWithAndroidBuildComponents,
7679 PrepareForTestWithApexBuildComponents,
7680 prepareForTestWithMyapex,
7681 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7682 ).
7683 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7684 RunTestWithBp(t, `
7685 apex {
7686 name: "myapex",
7687 key: "myapex.key",
7688 prebuilts: ["foo", "bar"],
7689 updatable: false,
7690 }
7691
7692 apex_key {
7693 name: "myapex.key",
7694 public_key: "testkey.avbpubkey",
7695 private_key: "testkey.pem",
7696 }
7697
7698 prebuilt_etc {
7699 name: "foo",
7700 src: "myprebuilt",
7701 filename_from_src: true,
7702 }
7703
7704 prebuilt_etc {
7705 name: "bar",
7706 src: "myprebuilt",
7707 filename_from_src: true,
7708 }
7709 `)
7710}
7711
Jiyong Park479321d2019-12-16 11:47:12 +09007712func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7713 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7714 apex {
7715 name: "myapex",
7716 key: "myapex.key",
7717 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007718 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007719 }
7720
7721 apex_key {
7722 name: "myapex.key",
7723 public_key: "testkey.avbpubkey",
7724 private_key: "testkey.pem",
7725 }
7726
7727 java_library {
7728 name: "myjar",
7729 srcs: ["foo/bar/MyClass.java"],
7730 sdk_version: "none",
7731 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007732 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007733 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007734 }
7735 `)
7736}
7737
Jiyong Park7afd1072019-12-30 16:56:33 +09007738func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007739 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007740 apex {
7741 name: "myapex",
7742 key: "myapex.key",
7743 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007744 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007745 }
7746
7747 apex_key {
7748 name: "myapex.key",
7749 public_key: "testkey.avbpubkey",
7750 private_key: "testkey.pem",
7751 }
7752
7753 cc_library {
7754 name: "mylib",
7755 srcs: ["mylib.cpp"],
7756 system_shared_libs: [],
7757 stl: "none",
7758 required: ["a", "b"],
7759 host_required: ["c", "d"],
7760 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007761 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007762 }
7763 `)
7764
Jooyung Hana0503a52023-08-23 13:12:50 +09007765 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007766 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007767 name := apexBundle.BaseModuleName()
7768 prefix := "TARGET_"
7769 var builder strings.Builder
7770 data.Custom(&builder, name, prefix, "", data)
7771 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007772 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007773 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7774 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007775}
7776
Jiyong Park7cd10e32020-01-14 09:22:18 +09007777func TestSymlinksFromApexToSystem(t *testing.T) {
7778 bp := `
7779 apex {
7780 name: "myapex",
7781 key: "myapex.key",
7782 native_shared_libs: ["mylib"],
7783 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007784 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007785 }
7786
Jiyong Park9d677202020-02-19 16:29:35 +09007787 apex {
7788 name: "myapex.updatable",
7789 key: "myapex.key",
7790 native_shared_libs: ["mylib"],
7791 java_libs: ["myjar"],
7792 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007793 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007794 }
7795
Jiyong Park7cd10e32020-01-14 09:22:18 +09007796 apex_key {
7797 name: "myapex.key",
7798 public_key: "testkey.avbpubkey",
7799 private_key: "testkey.pem",
7800 }
7801
7802 cc_library {
7803 name: "mylib",
7804 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007805 shared_libs: [
7806 "myotherlib",
7807 "myotherlib_ext",
7808 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007809 system_shared_libs: [],
7810 stl: "none",
7811 apex_available: [
7812 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007813 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007814 "//apex_available:platform",
7815 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007816 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007817 }
7818
7819 cc_library {
7820 name: "myotherlib",
7821 srcs: ["mylib.cpp"],
7822 system_shared_libs: [],
7823 stl: "none",
7824 apex_available: [
7825 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007826 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007827 "//apex_available:platform",
7828 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007829 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007830 }
7831
Jiyong Parkce243632023-02-17 18:22:25 +09007832 cc_library {
7833 name: "myotherlib_ext",
7834 srcs: ["mylib.cpp"],
7835 system_shared_libs: [],
7836 system_ext_specific: true,
7837 stl: "none",
7838 apex_available: [
7839 "myapex",
7840 "myapex.updatable",
7841 "//apex_available:platform",
7842 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007843 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007844 }
7845
Jiyong Park7cd10e32020-01-14 09:22:18 +09007846 java_library {
7847 name: "myjar",
7848 srcs: ["foo/bar/MyClass.java"],
7849 sdk_version: "none",
7850 system_modules: "none",
7851 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007852 apex_available: [
7853 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007854 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007855 "//apex_available:platform",
7856 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007857 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007858 }
7859
7860 java_library {
7861 name: "myotherjar",
7862 srcs: ["foo/bar/MyClass.java"],
7863 sdk_version: "none",
7864 system_modules: "none",
7865 apex_available: [
7866 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007867 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007868 "//apex_available:platform",
7869 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007870 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007871 }
7872 `
7873
7874 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7875 for _, f := range files {
7876 if f.path == file {
7877 if f.isLink {
7878 t.Errorf("%q is not a real file", file)
7879 }
7880 return
7881 }
7882 }
7883 t.Errorf("%q is not found", file)
7884 }
7885
Jiyong Parkce243632023-02-17 18:22:25 +09007886 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007887 for _, f := range files {
7888 if f.path == file {
7889 if !f.isLink {
7890 t.Errorf("%q is not a symlink", file)
7891 }
Jiyong Parkce243632023-02-17 18:22:25 +09007892 if f.src != target {
7893 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7894 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007895 return
7896 }
7897 }
7898 t.Errorf("%q is not found", file)
7899 }
7900
Jiyong Park9d677202020-02-19 16:29:35 +09007901 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7902 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007903 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007904 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007905 ensureRealfileExists(t, files, "javalib/myjar.jar")
7906 ensureRealfileExists(t, files, "lib64/mylib.so")
7907 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007908 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007909
Jooyung Hana0503a52023-08-23 13:12:50 +09007910 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007911 ensureRealfileExists(t, files, "javalib/myjar.jar")
7912 ensureRealfileExists(t, files, "lib64/mylib.so")
7913 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007914 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007915
7916 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007917 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007918 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007919 ensureRealfileExists(t, files, "javalib/myjar.jar")
7920 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007921 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7922 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007923
Jooyung Hana0503a52023-08-23 13:12:50 +09007924 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007925 ensureRealfileExists(t, files, "javalib/myjar.jar")
7926 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007927 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7928 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007929}
7930
Yo Chiange8128052020-07-23 20:09:18 +08007931func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007932 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007933 apex {
7934 name: "myapex",
7935 key: "myapex.key",
7936 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007937 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007938 }
7939
7940 apex_key {
7941 name: "myapex.key",
7942 public_key: "testkey.avbpubkey",
7943 private_key: "testkey.pem",
7944 }
7945
7946 cc_library_shared {
7947 name: "mylib",
7948 srcs: ["mylib.cpp"],
7949 shared_libs: ["myotherlib"],
7950 system_shared_libs: [],
7951 stl: "none",
7952 apex_available: [
7953 "myapex",
7954 "//apex_available:platform",
7955 ],
7956 }
7957
7958 cc_prebuilt_library_shared {
7959 name: "myotherlib",
7960 srcs: ["prebuilt.so"],
7961 system_shared_libs: [],
7962 stl: "none",
7963 apex_available: [
7964 "myapex",
7965 "//apex_available:platform",
7966 ],
7967 }
7968 `)
7969
Jooyung Hana0503a52023-08-23 13:12:50 +09007970 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007971 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007972 var builder strings.Builder
7973 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7974 androidMk := builder.String()
7975 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007976 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007977 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7978 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7979 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007980 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007981}
7982
Jooyung Han643adc42020-02-27 13:50:06 +09007983func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007984 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007985 apex {
7986 name: "myapex",
7987 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007988 binaries: ["mybin"],
7989 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007990 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007991 }
7992
7993 apex_key {
7994 name: "myapex.key",
7995 public_key: "testkey.avbpubkey",
7996 private_key: "testkey.pem",
7997 }
7998
7999 cc_library {
8000 name: "mylib",
8001 srcs: ["mylib.cpp"],
8002 shared_libs: ["mylib2"],
8003 system_shared_libs: [],
8004 stl: "none",
8005 apex_available: [ "myapex" ],
8006 }
8007
8008 cc_library {
8009 name: "mylib2",
8010 srcs: ["mylib.cpp"],
8011 system_shared_libs: [],
8012 stl: "none",
8013 apex_available: [ "myapex" ],
8014 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008015
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008016 // Used as both a JNI library and a regular shared library.
8017 cc_library {
8018 name: "mylib3",
8019 srcs: ["mylib.cpp"],
8020 system_shared_libs: [],
8021 stl: "none",
8022 apex_available: [ "myapex" ],
8023 }
8024
8025 cc_binary {
8026 name: "mybin",
8027 srcs: ["mybin.cpp"],
8028 shared_libs: ["mylib3"],
8029 system_shared_libs: [],
8030 stl: "none",
8031 apex_available: [ "myapex" ],
8032 }
8033
Jiyong Park34d5c332022-02-24 18:02:44 +09008034 rust_ffi_shared {
8035 name: "libfoo.rust",
8036 crate_name: "foo",
8037 srcs: ["foo.rs"],
8038 shared_libs: ["libfoo.shared_from_rust"],
8039 prefer_rlib: true,
8040 apex_available: ["myapex"],
8041 }
8042
8043 cc_library_shared {
8044 name: "libfoo.shared_from_rust",
8045 srcs: ["mylib.cpp"],
8046 system_shared_libs: [],
8047 stl: "none",
8048 stubs: {
8049 versions: ["10", "11", "12"],
8050 },
8051 }
8052
Jooyung Han643adc42020-02-27 13:50:06 +09008053 `)
8054
Jooyung Hana0503a52023-08-23 13:12:50 +09008055 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008056 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008057 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008058 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008059 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008060 "lib64/mylib.so",
8061 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008062 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008063 "lib64/libfoo.rust.so",
8064 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8065 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008066 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008067
8068 // b/220397949
8069 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008070}
8071
Jooyung Han49f67012020-04-17 13:43:10 +09008072func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008073 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008074 apex {
8075 name: "myapex",
8076 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008077 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008078 }
8079 apex_key {
8080 name: "myapex.key",
8081 public_key: "testkey.avbpubkey",
8082 private_key: "testkey.pem",
8083 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008084 `,
8085 android.FixtureModifyConfig(func(config android.Config) {
8086 delete(config.Targets, android.Android)
8087 config.AndroidCommonTarget = android.Target{}
8088 }),
8089 )
Jooyung Han49f67012020-04-17 13:43:10 +09008090
8091 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8092 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8093 }
8094}
8095
Jiyong Parkbd159612020-02-28 15:22:21 +09008096func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008097 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008098 apex {
8099 name: "myapex",
8100 key: "myapex.key",
8101 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008102 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008103 }
8104
8105 apex_key {
8106 name: "myapex.key",
8107 public_key: "testkey.avbpubkey",
8108 private_key: "testkey.pem",
8109 }
8110
8111 android_app {
8112 name: "AppFoo",
8113 srcs: ["foo/bar/MyClass.java"],
8114 sdk_version: "none",
8115 system_modules: "none",
8116 apex_available: [ "myapex" ],
8117 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008118 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008119
Jooyung Hana0503a52023-08-23 13:12:50 +09008120 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008121 content := bundleConfigRule.Args["content"]
8122
8123 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008124 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 +09008125}
8126
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008127func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008128 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008129 apex {
8130 name: "myapex",
8131 key: "myapex.key",
8132 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008133 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008134 }
8135
8136 apex_key {
8137 name: "myapex.key",
8138 public_key: "testkey.avbpubkey",
8139 private_key: "testkey.pem",
8140 }
8141
8142 android_app_set {
8143 name: "AppSet",
8144 set: "AppSet.apks",
8145 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008146 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008147 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008148 content := bundleConfigRule.Args["content"]
8149 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8150 s := mod.Rule("apexRule").Args["copy_commands"]
8151 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008152 if len(copyCmds) != 4 {
8153 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008154 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008155 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8156 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008157 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8158 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008159
8160 // Ensure that canned_fs_config has an entry for the app set zip file
8161 generateFsRule := mod.Rule("generateFsConfig")
8162 cmd := generateFsRule.RuleParams.Command
8163 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008164}
8165
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008166func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008167 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008168 apex_set {
8169 name: "myapex",
8170 filename: "foo_v2.apex",
8171 sanitized: {
8172 none: { set: "myapex.apks", },
8173 hwaddress: { set: "myapex.hwasan.apks", },
8174 },
Paul Duffin24704672021-04-06 16:09:30 +01008175 }
8176 `
8177 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008178
Paul Duffin24704672021-04-06 16:09:30 +01008179 // Check that the extractor produces the correct output file from the correct input file.
8180 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008181
Paul Duffin24704672021-04-06 16:09:30 +01008182 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8183 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008184
Paul Duffin24704672021-04-06 16:09:30 +01008185 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8186
8187 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008188 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8189 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008190
8191 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008192}
8193
Pranav Guptaeba03b02022-09-27 00:27:08 +00008194func TestApexSetApksModuleAssignment(t *testing.T) {
8195 ctx := testApex(t, `
8196 apex_set {
8197 name: "myapex",
8198 set: ":myapex_apks_file",
8199 }
8200
8201 filegroup {
8202 name: "myapex_apks_file",
8203 srcs: ["myapex.apks"],
8204 }
8205 `)
8206
8207 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8208
8209 // Check that the extractor produces the correct apks file from the input module
8210 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8211 extractedApex := m.Output(extractorOutput)
8212
8213 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8214}
8215
Paul Duffin89f570a2021-06-16 01:42:33 +01008216func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008217 t.Helper()
8218
Paul Duffin55607122021-03-30 23:32:51 +01008219 fs := android.MockFS{
8220 "a.java": nil,
8221 "a.jar": nil,
8222 "apex_manifest.json": nil,
8223 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008224 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008225 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8226 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8227 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008228 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008229 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008230
Paul Duffin55607122021-03-30 23:32:51 +01008231 errorHandler := android.FixtureExpectsNoErrors
8232 if errmsg != "" {
8233 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008234 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008235
Paul Duffin55607122021-03-30 23:32:51 +01008236 result := android.GroupFixturePreparers(
8237 cc.PrepareForTestWithCcDefaultModules,
8238 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008239 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008240 java.PrepareForTestWithJavaSdkLibraryFiles,
8241 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008242 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008243 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008244 android.FixtureModifyMockFS(func(fs android.MockFS) {
8245 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8246 insert := ""
8247 for _, fragment := range fragments {
8248 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8249 }
8250 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8251 platform_bootclasspath {
8252 name: "platform-bootclasspath",
8253 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008254 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008255 %s
8256 ],
8257 }
8258 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008259 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008260 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008261 // Dexpreopt for boot jars requires the ART boot image profile.
8262 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8263 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008264 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008265 ).
8266 ExtendWithErrorHandler(errorHandler).
8267 RunTestWithBp(t, bp)
8268
8269 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008270}
8271
Paul Duffin5556c5f2022-06-09 17:32:21 +00008272func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008273 preparers := android.GroupFixturePreparers(
8274 java.PrepareForTestWithJavaDefaultModules,
8275 PrepareForTestWithApexBuildComponents,
8276 ).
8277 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8278 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8279
8280 bpBase := `
8281 apex_set {
8282 name: "com.android.myapex",
8283 installable: true,
8284 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8285 set: "myapex.apks",
8286 }
8287
8288 apex_set {
8289 name: "com.mycompany.android.myapex",
8290 apex_name: "com.android.myapex",
8291 installable: true,
8292 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8293 set: "company-myapex.apks",
8294 }
8295
8296 prebuilt_bootclasspath_fragment {
8297 name: "my-bootclasspath-fragment",
8298 apex_available: ["com.android.myapex"],
8299 %s
8300 }
8301 `
8302
8303 t.Run("java_import", func(t *testing.T) {
8304 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8305 java_import {
8306 name: "libfoo",
8307 jars: ["libfoo.jar"],
8308 apex_available: ["com.android.myapex"],
8309 }
8310 `)
8311 })
8312
8313 t.Run("java_sdk_library_import", func(t *testing.T) {
8314 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8315 java_sdk_library_import {
8316 name: "libfoo",
8317 public: {
8318 jars: ["libbar.jar"],
8319 },
8320 apex_available: ["com.android.myapex"],
8321 }
8322 `)
8323 })
8324
8325 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8326 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8327 image_name: "art",
8328 contents: ["libfoo"],
8329 `)+`
8330 java_sdk_library_import {
8331 name: "libfoo",
8332 public: {
8333 jars: ["libbar.jar"],
8334 },
8335 apex_available: ["com.android.myapex"],
8336 }
8337 `)
8338 })
8339}
8340
Paul Duffin5556c5f2022-06-09 17:32:21 +00008341func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8342 preparers := android.GroupFixturePreparers(
8343 java.PrepareForTestWithJavaDefaultModules,
8344 PrepareForTestWithApexBuildComponents,
8345 )
8346
8347 bpBase := `
8348 apex_set {
8349 name: "com.android.myapex",
8350 installable: true,
8351 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8352 set: "myapex.apks",
8353 }
8354
8355 apex_set {
8356 name: "com.android.myapex_compressed",
8357 apex_name: "com.android.myapex",
8358 installable: true,
8359 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8360 set: "myapex_compressed.apks",
8361 }
8362
8363 prebuilt_bootclasspath_fragment {
8364 name: "my-bootclasspath-fragment",
8365 apex_available: [
8366 "com.android.myapex",
8367 "com.android.myapex_compressed",
8368 ],
8369 hidden_api: {
8370 annotation_flags: "annotation-flags.csv",
8371 metadata: "metadata.csv",
8372 index: "index.csv",
8373 signature_patterns: "signature_patterns.csv",
8374 },
8375 %s
8376 }
8377 `
8378
8379 t.Run("java_import", func(t *testing.T) {
8380 result := preparers.RunTestWithBp(t,
8381 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8382 java_import {
8383 name: "libfoo",
8384 jars: ["libfoo.jar"],
8385 apex_available: [
8386 "com.android.myapex",
8387 "com.android.myapex_compressed",
8388 ],
8389 }
8390 `)
8391
8392 module := result.Module("libfoo", "android_common_com.android.myapex")
8393 usesLibraryDep := module.(java.UsesLibraryDependency)
8394 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8395 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8396 usesLibraryDep.DexJarBuildPath().Path())
8397 })
8398
8399 t.Run("java_sdk_library_import", func(t *testing.T) {
8400 result := preparers.RunTestWithBp(t,
8401 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8402 java_sdk_library_import {
8403 name: "libfoo",
8404 public: {
8405 jars: ["libbar.jar"],
8406 },
8407 apex_available: [
8408 "com.android.myapex",
8409 "com.android.myapex_compressed",
8410 ],
8411 compile_dex: true,
8412 }
8413 `)
8414
8415 module := result.Module("libfoo", "android_common_com.android.myapex")
8416 usesLibraryDep := module.(java.UsesLibraryDependency)
8417 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8418 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8419 usesLibraryDep.DexJarBuildPath().Path())
8420 })
8421
8422 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8423 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8424 image_name: "art",
8425 contents: ["libfoo"],
8426 `)+`
8427 java_sdk_library_import {
8428 name: "libfoo",
8429 public: {
8430 jars: ["libbar.jar"],
8431 },
8432 apex_available: [
8433 "com.android.myapex",
8434 "com.android.myapex_compressed",
8435 ],
8436 compile_dex: true,
8437 }
8438 `)
8439 })
8440}
8441
Jooyung Han548640b2020-04-27 12:10:30 +09008442func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8443 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8444 apex {
8445 name: "myapex",
8446 key: "myapex.key",
8447 updatable: true,
8448 }
8449
8450 apex_key {
8451 name: "myapex.key",
8452 public_key: "testkey.avbpubkey",
8453 private_key: "testkey.pem",
8454 }
8455 `)
8456}
8457
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008458func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8459 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8460 apex {
8461 name: "myapex",
8462 key: "myapex.key",
8463 }
8464
8465 apex_key {
8466 name: "myapex.key",
8467 public_key: "testkey.avbpubkey",
8468 private_key: "testkey.pem",
8469 }
8470 `)
8471}
8472
Jooyung Handfc864c2023-03-20 18:19:07 +09008473func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8474 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008475 apex {
8476 name: "myapex",
8477 key: "myapex.key",
8478 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008479 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008480 soc_specific: true,
8481 }
8482
8483 apex_key {
8484 name: "myapex.key",
8485 public_key: "testkey.avbpubkey",
8486 private_key: "testkey.pem",
8487 }
8488 `)
8489}
8490
Jooyung Han02873da2023-03-22 17:41:03 +09008491func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8492 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8493 apex {
8494 name: "myapex",
8495 key: "myapex.key",
8496 updatable: false,
8497 min_sdk_version: "29",
8498 use_vndk_as_stable: true,
8499 vendor: true,
8500 }
8501
8502 apex_key {
8503 name: "myapex.key",
8504 public_key: "testkey.avbpubkey",
8505 private_key: "testkey.pem",
8506 }
8507 `)
8508}
8509
Jooyung Handfc864c2023-03-20 18:19:07 +09008510func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8511 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8512 apex {
8513 name: "myapex",
8514 key: "myapex.key",
8515 updatable: false,
8516 use_vndk_as_stable: true,
8517 }
8518
8519 apex_key {
8520 name: "myapex.key",
8521 public_key: "testkey.avbpubkey",
8522 private_key: "testkey.pem",
8523 }
8524 `)
8525}
8526
satayevb98371c2021-06-15 16:49:50 +01008527func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8528 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8529 apex {
8530 name: "myapex",
8531 key: "myapex.key",
8532 systemserverclasspath_fragments: [
8533 "mysystemserverclasspathfragment",
8534 ],
8535 min_sdk_version: "29",
8536 updatable: true,
8537 }
8538
8539 apex_key {
8540 name: "myapex.key",
8541 public_key: "testkey.avbpubkey",
8542 private_key: "testkey.pem",
8543 }
8544
8545 java_library {
8546 name: "foo",
8547 srcs: ["b.java"],
8548 min_sdk_version: "29",
8549 installable: true,
8550 apex_available: [
8551 "myapex",
8552 ],
8553 }
8554
8555 systemserverclasspath_fragment {
8556 name: "mysystemserverclasspathfragment",
8557 generate_classpaths_proto: false,
8558 contents: [
8559 "foo",
8560 ],
8561 apex_available: [
8562 "myapex",
8563 ],
8564 }
satayevabcd5972021-08-06 17:49:46 +01008565 `,
8566 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8567 )
satayevb98371c2021-06-15 16:49:50 +01008568}
8569
Paul Duffin064b70c2020-11-02 17:32:38 +00008570func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008571 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008572 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008573 fragment := java.ApexVariantReference{
8574 Apex: proptools.StringPtr("myapex"),
8575 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8576 }
8577
Paul Duffin064b70c2020-11-02 17:32:38 +00008578 testDexpreoptWithApexes(t, `
8579 prebuilt_apex {
8580 name: "myapex" ,
8581 arch: {
8582 arm64: {
8583 src: "myapex-arm64.apex",
8584 },
8585 arm: {
8586 src: "myapex-arm.apex",
8587 },
8588 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008589 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8590 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008591
Paul Duffin89f570a2021-06-16 01:42:33 +01008592 prebuilt_bootclasspath_fragment {
8593 name: "my-bootclasspath-fragment",
8594 contents: ["libfoo"],
8595 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008596 hidden_api: {
8597 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8598 metadata: "my-bootclasspath-fragment/metadata.csv",
8599 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008600 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8601 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8602 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008603 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008604 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008605
Paul Duffin89f570a2021-06-16 01:42:33 +01008606 java_import {
8607 name: "libfoo",
8608 jars: ["libfoo.jar"],
8609 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008610 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008611 }
8612 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008613 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008614}
8615
Spandan Dasf14e2542021-11-12 00:01:37 +00008616func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008617 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008618 bp += `
8619 apex_key {
8620 name: "myapex.key",
8621 public_key: "testkey.avbpubkey",
8622 private_key: "testkey.pem",
8623 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008624 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008625 "lib1/src/A.java": nil,
8626 "lib2/src/B.java": nil,
8627 "system/sepolicy/apex/myapex-file_contexts": nil,
8628 }
8629
Paul Duffin45338f02021-03-30 23:07:52 +01008630 errorHandler := android.FixtureExpectsNoErrors
8631 if errmsg != "" {
8632 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008633 }
Colin Crossae8600b2020-10-29 17:09:13 -07008634
Paul Duffin45338f02021-03-30 23:07:52 +01008635 android.GroupFixturePreparers(
8636 android.PrepareForTestWithAndroidBuildComponents,
8637 java.PrepareForTestWithJavaBuildComponents,
8638 PrepareForTestWithApexBuildComponents,
8639 android.PrepareForTestWithNeverallowRules(rules),
8640 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008641 apexBootJars := make([]string, 0, len(bootJars))
8642 for _, apexBootJar := range bootJars {
8643 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008644 }
satayevd604b212021-07-21 14:23:52 +01008645 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008646 }),
8647 fs.AddToFixture(),
8648 ).
8649 ExtendWithErrorHandler(errorHandler).
8650 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008651}
8652
8653func TestApexPermittedPackagesRules(t *testing.T) {
8654 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008655 name string
8656 expectedError string
8657 bp string
8658 bootJars []string
8659 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008660 }{
8661
8662 {
8663 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8664 expectedError: "",
8665 bp: `
8666 java_library {
8667 name: "bcp_lib1",
8668 srcs: ["lib1/src/*.java"],
8669 permitted_packages: ["foo.bar"],
8670 apex_available: ["myapex"],
8671 sdk_version: "none",
8672 system_modules: "none",
8673 }
8674 java_library {
8675 name: "nonbcp_lib2",
8676 srcs: ["lib2/src/*.java"],
8677 apex_available: ["myapex"],
8678 permitted_packages: ["a.b"],
8679 sdk_version: "none",
8680 system_modules: "none",
8681 }
8682 apex {
8683 name: "myapex",
8684 key: "myapex.key",
8685 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008686 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008687 }`,
8688 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008689 bcpPermittedPackages: map[string][]string{
8690 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008691 "foo.bar",
8692 },
8693 },
8694 },
8695 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008696 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008697 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 +01008698 bp: `
8699 java_library {
8700 name: "bcp_lib1",
8701 srcs: ["lib1/src/*.java"],
8702 apex_available: ["myapex"],
8703 permitted_packages: ["foo.bar"],
8704 sdk_version: "none",
8705 system_modules: "none",
8706 }
8707 java_library {
8708 name: "bcp_lib2",
8709 srcs: ["lib2/src/*.java"],
8710 apex_available: ["myapex"],
8711 permitted_packages: ["foo.bar", "bar.baz"],
8712 sdk_version: "none",
8713 system_modules: "none",
8714 }
8715 apex {
8716 name: "myapex",
8717 key: "myapex.key",
8718 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008719 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008720 }
8721 `,
8722 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008723 bcpPermittedPackages: map[string][]string{
8724 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008725 "foo.bar",
8726 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008727 "bcp_lib2": []string{
8728 "foo.bar",
8729 },
8730 },
8731 },
8732 {
8733 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8734 expectedError: "",
8735 bp: `
8736 java_library {
8737 name: "bcp_lib_restricted",
8738 srcs: ["lib1/src/*.java"],
8739 apex_available: ["myapex"],
8740 permitted_packages: ["foo.bar"],
8741 sdk_version: "none",
8742 min_sdk_version: "29",
8743 system_modules: "none",
8744 }
8745 java_library {
8746 name: "bcp_lib_unrestricted",
8747 srcs: ["lib2/src/*.java"],
8748 apex_available: ["myapex"],
8749 permitted_packages: ["foo.bar", "bar.baz"],
8750 sdk_version: "none",
8751 min_sdk_version: "29",
8752 system_modules: "none",
8753 }
8754 apex {
8755 name: "myapex",
8756 key: "myapex.key",
8757 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8758 updatable: true,
8759 min_sdk_version: "29",
8760 }
8761 `,
8762 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8763 bcpPermittedPackages: map[string][]string{
8764 "bcp_lib1_non_updateable": []string{
8765 "foo.bar",
8766 },
8767 // 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 +01008768 },
8769 },
8770 }
8771 for _, tc := range testcases {
8772 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008773 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8774 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008775 })
8776 }
8777}
8778
Jiyong Park62304bb2020-04-13 16:19:48 +09008779func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008780 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008781 apex {
8782 name: "myapex",
8783 key: "myapex.key",
8784 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008785 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008786 }
8787
8788 apex_key {
8789 name: "myapex.key",
8790 public_key: "testkey.avbpubkey",
8791 private_key: "testkey.pem",
8792 }
8793
8794 cc_library {
8795 name: "mylib",
8796 srcs: ["mylib.cpp"],
8797 system_shared_libs: [],
8798 stl: "none",
8799 stubs: {
8800 versions: ["1"],
8801 },
8802 apex_available: ["myapex"],
8803 }
8804
8805 cc_library {
8806 name: "myprivlib",
8807 srcs: ["mylib.cpp"],
8808 system_shared_libs: [],
8809 stl: "none",
8810 apex_available: ["myapex"],
8811 }
8812
8813
8814 cc_test {
8815 name: "mytest",
8816 gtest: false,
8817 srcs: ["mylib.cpp"],
8818 system_shared_libs: [],
8819 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008820 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008821 test_for: ["myapex"]
8822 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008823
8824 cc_library {
8825 name: "mytestlib",
8826 srcs: ["mylib.cpp"],
8827 system_shared_libs: [],
8828 shared_libs: ["mylib", "myprivlib"],
8829 stl: "none",
8830 test_for: ["myapex"],
8831 }
8832
8833 cc_benchmark {
8834 name: "mybench",
8835 srcs: ["mylib.cpp"],
8836 system_shared_libs: [],
8837 shared_libs: ["mylib", "myprivlib"],
8838 stl: "none",
8839 test_for: ["myapex"],
8840 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008841 `)
8842
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008843 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008844 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008845 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8846 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8847 }
8848
8849 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008850 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008851 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8852 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8853 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8854}
Jiyong Park46a512f2020-12-04 18:02:13 +09008855
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008856func TestIndirectTestFor(t *testing.T) {
8857 ctx := testApex(t, `
8858 apex {
8859 name: "myapex",
8860 key: "myapex.key",
8861 native_shared_libs: ["mylib", "myprivlib"],
8862 updatable: false,
8863 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008864
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008865 apex_key {
8866 name: "myapex.key",
8867 public_key: "testkey.avbpubkey",
8868 private_key: "testkey.pem",
8869 }
8870
8871 cc_library {
8872 name: "mylib",
8873 srcs: ["mylib.cpp"],
8874 system_shared_libs: [],
8875 stl: "none",
8876 stubs: {
8877 versions: ["1"],
8878 },
8879 apex_available: ["myapex"],
8880 }
8881
8882 cc_library {
8883 name: "myprivlib",
8884 srcs: ["mylib.cpp"],
8885 system_shared_libs: [],
8886 stl: "none",
8887 shared_libs: ["mylib"],
8888 apex_available: ["myapex"],
8889 }
8890
8891 cc_library {
8892 name: "mytestlib",
8893 srcs: ["mylib.cpp"],
8894 system_shared_libs: [],
8895 shared_libs: ["myprivlib"],
8896 stl: "none",
8897 test_for: ["myapex"],
8898 }
8899 `)
8900
8901 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008902 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008903 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8904 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8905 }
8906
8907 // The platform variant of mytestlib links to the platform variant of the
8908 // internal myprivlib.
8909 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8910
8911 // The platform variant of myprivlib links to the platform variant of mylib
8912 // and bypasses its stubs.
8913 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 +09008914}
8915
Martin Stjernholmec009002021-03-27 15:18:31 +00008916func TestTestForForLibInOtherApex(t *testing.T) {
8917 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8918 _ = testApex(t, `
8919 apex {
8920 name: "com.android.art",
8921 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008922 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008923 updatable: false,
8924 }
8925
8926 apex {
8927 name: "com.android.art.debug",
8928 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008929 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008930 updatable: false,
8931 }
8932
8933 apex_key {
8934 name: "myapex.key",
8935 public_key: "testkey.avbpubkey",
8936 private_key: "testkey.pem",
8937 }
8938
8939 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008940 name: "libnativebridge",
8941 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008942 system_shared_libs: [],
8943 stl: "none",
8944 stubs: {
8945 versions: ["1"],
8946 },
8947 apex_available: ["com.android.art", "com.android.art.debug"],
8948 }
8949
8950 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008951 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008952 srcs: ["mylib.cpp"],
8953 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008954 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008955 stl: "none",
8956 apex_available: ["com.android.art.debug"],
8957 test_for: ["com.android.art"],
8958 }
8959 `,
8960 android.MockFS{
8961 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8962 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8963 }.AddToFixture())
8964}
8965
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008966// TODO(jungjw): Move this to proptools
8967func intPtr(i int) *int {
8968 return &i
8969}
8970
8971func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008972 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008973 apex_set {
8974 name: "myapex",
8975 set: "myapex.apks",
8976 filename: "foo_v2.apex",
8977 overrides: ["foo"],
8978 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008979 `,
8980 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8981 variables.Platform_sdk_version = intPtr(30)
8982 }),
8983 android.FixtureModifyConfig(func(config android.Config) {
8984 config.Targets[android.Android] = []android.Target{
8985 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8986 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8987 }
8988 }),
8989 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008990
Paul Duffin24704672021-04-06 16:09:30 +01008991 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008992
8993 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008994 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008995 actual := extractedApex.Args["abis"]
8996 expected := "ARMEABI_V7A,ARM64_V8A"
8997 if actual != expected {
8998 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8999 }
9000 actual = extractedApex.Args["sdk-version"]
9001 expected = "30"
9002 if actual != expected {
9003 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9004 }
9005
Paul Duffin6717d882021-06-15 19:09:41 +01009006 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009007 a := m.Module().(*ApexSet)
9008 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009009 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009010 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9011 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9012 }
9013}
9014
Anton Hansson805e0a52022-11-25 14:06:46 +00009015func TestApexSet_NativeBridge(t *testing.T) {
9016 ctx := testApex(t, `
9017 apex_set {
9018 name: "myapex",
9019 set: "myapex.apks",
9020 filename: "foo_v2.apex",
9021 overrides: ["foo"],
9022 }
9023 `,
9024 android.FixtureModifyConfig(func(config android.Config) {
9025 config.Targets[android.Android] = []android.Target{
9026 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9027 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9028 }
9029 }),
9030 )
9031
9032 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9033
9034 // Check extract_apks tool parameters. No native bridge arch expected
9035 extractedApex := m.Output("extracted/myapex.apks")
9036 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9037}
9038
Jiyong Park7d95a512020-05-10 15:16:24 +09009039func TestNoStaticLinkingToStubsLib(t *testing.T) {
9040 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9041 apex {
9042 name: "myapex",
9043 key: "myapex.key",
9044 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009045 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009046 }
9047
9048 apex_key {
9049 name: "myapex.key",
9050 public_key: "testkey.avbpubkey",
9051 private_key: "testkey.pem",
9052 }
9053
9054 cc_library {
9055 name: "mylib",
9056 srcs: ["mylib.cpp"],
9057 static_libs: ["otherlib"],
9058 system_shared_libs: [],
9059 stl: "none",
9060 apex_available: [ "myapex" ],
9061 }
9062
9063 cc_library {
9064 name: "otherlib",
9065 srcs: ["mylib.cpp"],
9066 system_shared_libs: [],
9067 stl: "none",
9068 stubs: {
9069 versions: ["1", "2", "3"],
9070 },
9071 apex_available: [ "myapex" ],
9072 }
9073 `)
9074}
9075
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009076func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009077 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009078 apex {
9079 name: "myapex",
9080 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009081 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009082 custom_sign_tool: "sign_myapex",
9083 }
9084
9085 apex_key {
9086 name: "myapex.key",
9087 public_key: "testkey.avbpubkey",
9088 private_key: "testkey.pem",
9089 }
9090 `)
9091
9092 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9093 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009094 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 +09009095}
9096
9097func TestApexKeysTxtOverrides(t *testing.T) {
9098 ctx := testApex(t, `
9099 apex {
9100 name: "myapex",
9101 key: "myapex.key",
9102 updatable: false,
9103 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009104 }
9105
9106 apex_key {
9107 name: "myapex.key",
9108 public_key: "testkey.avbpubkey",
9109 private_key: "testkey.pem",
9110 }
9111
9112 prebuilt_apex {
9113 name: "myapex",
9114 prefer: true,
9115 arch: {
9116 arm64: {
9117 src: "myapex-arm64.apex",
9118 },
9119 arm: {
9120 src: "myapex-arm.apex",
9121 },
9122 },
9123 }
9124
9125 apex_set {
9126 name: "myapex_set",
9127 set: "myapex.apks",
9128 filename: "myapex_set.apex",
9129 overrides: ["myapex"],
9130 }
9131 `)
9132
9133 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9134 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9135 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 +09009136 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 +09009137}
9138
Jooyung Han938b5932020-06-20 12:47:47 +09009139func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009140 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009141 apex {
9142 name: "myapex",
9143 key: "myapex.key",
9144 apps: ["app"],
9145 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009146 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009147 }
9148
9149 apex_key {
9150 name: "myapex.key",
9151 public_key: "testkey.avbpubkey",
9152 private_key: "testkey.pem",
9153 }
9154
9155 android_app {
9156 name: "app",
9157 srcs: ["foo/bar/MyClass.java"],
9158 package_name: "foo",
9159 sdk_version: "none",
9160 system_modules: "none",
9161 apex_available: [ "myapex" ],
9162 }
9163 `, withFiles(map[string][]byte{
9164 "sub/Android.bp": []byte(`
9165 override_apex {
9166 name: "override_myapex",
9167 base: "myapex",
9168 apps: ["override_app"],
9169 allowed_files: ":allowed",
9170 }
9171 // Overridable "path" property should be referenced indirectly
9172 filegroup {
9173 name: "allowed",
9174 srcs: ["allowed.txt"],
9175 }
9176 override_android_app {
9177 name: "override_app",
9178 base: "app",
9179 package_name: "bar",
9180 }
9181 `),
9182 }))
9183
Jooyung Hana0503a52023-08-23 13:12:50 +09009184 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009185 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9186 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9187 }
9188
Jooyung Hana0503a52023-08-23 13:12:50 +09009189 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009190 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9191 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9192 }
9193}
9194
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009195func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009196 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009197 apex {
9198 name: "myapex",
9199 key: "myapex.key",
9200 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009201 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009202 }
9203
9204 apex_key {
9205 name: "myapex.key",
9206 public_key: "testkey.avbpubkey",
9207 private_key: "testkey.pem",
9208 }
9209
9210 cc_library {
9211 name: "mylib",
9212 srcs: ["mylib.cpp"],
9213 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009214 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009215 },
9216 apex_available: ["myapex"],
9217 }
9218
9219 cc_prebuilt_library_shared {
9220 name: "mylib",
9221 prefer: false,
9222 srcs: ["prebuilt.so"],
9223 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009224 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009225 },
9226 apex_available: ["myapex"],
9227 }
9228 `)
9229}
9230
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009231func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009232 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009233 apex {
9234 name: "myapex",
9235 key: "myapex.key",
9236 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009237 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009238 }
9239 apex_key {
9240 name: "myapex.key",
9241 public_key: "testkey.avbpubkey",
9242 private_key: "testkey.pem",
9243 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009244 `,
9245 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9246 variables.CompressedApex = proptools.BoolPtr(true)
9247 }),
9248 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009249
Jooyung Hana0503a52023-08-23 13:12:50 +09009250 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009251 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9252
Jooyung Hana0503a52023-08-23 13:12:50 +09009253 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009254 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9255
9256 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009257 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009258 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9259
9260 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009261 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009262 var builder strings.Builder
9263 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9264 androidMk := builder.String()
9265 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9266}
9267
Martin Stjernholm2856c662020-12-02 15:03:42 +00009268func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009269 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009270 apex {
9271 name: "myapex",
9272 key: "myapex.key",
9273 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009274 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009275 }
9276
9277 apex_key {
9278 name: "myapex.key",
9279 public_key: "testkey.avbpubkey",
9280 private_key: "testkey.pem",
9281 }
9282
9283 cc_library {
9284 name: "mylib",
9285 srcs: ["mylib.cpp"],
9286 apex_available: ["myapex"],
9287 shared_libs: ["otherlib"],
9288 system_shared_libs: [],
9289 }
9290
9291 cc_library {
9292 name: "otherlib",
9293 srcs: ["mylib.cpp"],
9294 stubs: {
9295 versions: ["current"],
9296 },
9297 }
9298
9299 cc_prebuilt_library_shared {
9300 name: "otherlib",
9301 prefer: true,
9302 srcs: ["prebuilt.so"],
9303 stubs: {
9304 versions: ["current"],
9305 },
9306 }
9307 `)
9308
Jooyung Hana0503a52023-08-23 13:12:50 +09009309 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009310 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009311 var builder strings.Builder
9312 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9313 androidMk := builder.String()
9314
9315 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9316 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009317 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009318}
9319
Jiyong Parke3867542020-12-03 17:28:25 +09009320func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009321 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009322 apex {
9323 name: "myapex",
9324 key: "myapex.key",
9325 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009326 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009327 }
9328
9329 apex_key {
9330 name: "myapex.key",
9331 public_key: "testkey.avbpubkey",
9332 private_key: "testkey.pem",
9333 }
9334
9335 cc_library {
9336 name: "mylib",
9337 srcs: ["mylib.cpp"],
9338 system_shared_libs: [],
9339 stl: "none",
9340 apex_available: ["myapex"],
9341 shared_libs: ["mylib2"],
9342 target: {
9343 apex: {
9344 exclude_shared_libs: ["mylib2"],
9345 },
9346 },
9347 }
9348
9349 cc_library {
9350 name: "mylib2",
9351 srcs: ["mylib.cpp"],
9352 system_shared_libs: [],
9353 stl: "none",
9354 }
9355 `)
9356
9357 // Check if mylib is linked to mylib2 for the non-apex target
9358 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9359 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9360
9361 // Make sure that the link doesn't occur for the apex target
9362 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9363 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9364
9365 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009366 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009367 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9368}
9369
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009370func TestPrebuiltStubLibDep(t *testing.T) {
9371 bpBase := `
9372 apex {
9373 name: "myapex",
9374 key: "myapex.key",
9375 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009376 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009377 }
9378 apex_key {
9379 name: "myapex.key",
9380 public_key: "testkey.avbpubkey",
9381 private_key: "testkey.pem",
9382 }
9383 cc_library {
9384 name: "mylib",
9385 srcs: ["mylib.cpp"],
9386 apex_available: ["myapex"],
9387 shared_libs: ["stublib"],
9388 system_shared_libs: [],
9389 }
9390 apex {
9391 name: "otherapex",
9392 enabled: %s,
9393 key: "myapex.key",
9394 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009395 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009396 }
9397 `
9398
9399 stublibSourceBp := `
9400 cc_library {
9401 name: "stublib",
9402 srcs: ["mylib.cpp"],
9403 apex_available: ["otherapex"],
9404 system_shared_libs: [],
9405 stl: "none",
9406 stubs: {
9407 versions: ["1"],
9408 },
9409 }
9410 `
9411
9412 stublibPrebuiltBp := `
9413 cc_prebuilt_library_shared {
9414 name: "stublib",
9415 srcs: ["prebuilt.so"],
9416 apex_available: ["otherapex"],
9417 stubs: {
9418 versions: ["1"],
9419 },
9420 %s
9421 }
9422 `
9423
9424 tests := []struct {
9425 name string
9426 stublibBp string
9427 usePrebuilt bool
9428 modNames []string // Modules to collect AndroidMkEntries for
9429 otherApexEnabled []string
9430 }{
9431 {
9432 name: "only_source",
9433 stublibBp: stublibSourceBp,
9434 usePrebuilt: false,
9435 modNames: []string{"stublib"},
9436 otherApexEnabled: []string{"true", "false"},
9437 },
9438 {
9439 name: "source_preferred",
9440 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9441 usePrebuilt: false,
9442 modNames: []string{"stublib", "prebuilt_stublib"},
9443 otherApexEnabled: []string{"true", "false"},
9444 },
9445 {
9446 name: "prebuilt_preferred",
9447 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9448 usePrebuilt: true,
9449 modNames: []string{"stublib", "prebuilt_stublib"},
9450 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9451 },
9452 {
9453 name: "only_prebuilt",
9454 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9455 usePrebuilt: true,
9456 modNames: []string{"stublib"},
9457 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9458 },
9459 }
9460
9461 for _, test := range tests {
9462 t.Run(test.name, func(t *testing.T) {
9463 for _, otherApexEnabled := range test.otherApexEnabled {
9464 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009465 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009466
9467 type modAndMkEntries struct {
9468 mod *cc.Module
9469 mkEntries android.AndroidMkEntries
9470 }
9471 entries := []*modAndMkEntries{}
9472
9473 // Gather shared lib modules that are installable
9474 for _, modName := range test.modNames {
9475 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9476 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9477 continue
9478 }
9479 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009480 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009481 continue
9482 }
Colin Crossaa255532020-07-03 13:18:24 -07009483 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009484 if ent.Disabled {
9485 continue
9486 }
9487 entries = append(entries, &modAndMkEntries{
9488 mod: mod,
9489 mkEntries: ent,
9490 })
9491 }
9492 }
9493 }
9494
9495 var entry *modAndMkEntries = nil
9496 for _, ent := range entries {
9497 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9498 if entry != nil {
9499 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9500 } else {
9501 entry = ent
9502 }
9503 }
9504 }
9505
9506 if entry == nil {
9507 t.Errorf("AndroidMk entry for \"stublib\" missing")
9508 } else {
9509 isPrebuilt := entry.mod.Prebuilt() != nil
9510 if isPrebuilt != test.usePrebuilt {
9511 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9512 }
9513 if !entry.mod.IsStubs() {
9514 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9515 }
9516 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9517 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9518 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009519 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009520 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009521 if !android.InList(expected, cflags) {
9522 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9523 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009524 }
9525 })
9526 }
9527 })
9528 }
9529}
9530
Colin Crossc33e5212021-05-25 18:16:02 -07009531func TestApexJavaCoverage(t *testing.T) {
9532 bp := `
9533 apex {
9534 name: "myapex",
9535 key: "myapex.key",
9536 java_libs: ["mylib"],
9537 bootclasspath_fragments: ["mybootclasspathfragment"],
9538 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9539 updatable: false,
9540 }
9541
9542 apex_key {
9543 name: "myapex.key",
9544 public_key: "testkey.avbpubkey",
9545 private_key: "testkey.pem",
9546 }
9547
9548 java_library {
9549 name: "mylib",
9550 srcs: ["mylib.java"],
9551 apex_available: ["myapex"],
9552 compile_dex: true,
9553 }
9554
9555 bootclasspath_fragment {
9556 name: "mybootclasspathfragment",
9557 contents: ["mybootclasspathlib"],
9558 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009559 hidden_api: {
9560 split_packages: ["*"],
9561 },
Colin Crossc33e5212021-05-25 18:16:02 -07009562 }
9563
9564 java_library {
9565 name: "mybootclasspathlib",
9566 srcs: ["mybootclasspathlib.java"],
9567 apex_available: ["myapex"],
9568 compile_dex: true,
9569 }
9570
9571 systemserverclasspath_fragment {
9572 name: "mysystemserverclasspathfragment",
9573 contents: ["mysystemserverclasspathlib"],
9574 apex_available: ["myapex"],
9575 }
9576
9577 java_library {
9578 name: "mysystemserverclasspathlib",
9579 srcs: ["mysystemserverclasspathlib.java"],
9580 apex_available: ["myapex"],
9581 compile_dex: true,
9582 }
9583 `
9584
9585 result := android.GroupFixturePreparers(
9586 PrepareForTestWithApexBuildComponents,
9587 prepareForTestWithMyapex,
9588 java.PrepareForTestWithJavaDefaultModules,
9589 android.PrepareForTestWithAndroidBuildComponents,
9590 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009591 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9592 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009593 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009594 ).RunTest(t)
9595
9596 // Make sure jacoco ran on both mylib and mybootclasspathlib
9597 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9598 t.Errorf("Failed to find jacoco rule for mylib")
9599 }
9600 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9601 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9602 }
9603 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9604 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9605 }
9606}
9607
Jiyong Park192600a2021-08-03 07:52:17 +00009608func TestProhibitStaticExecutable(t *testing.T) {
9609 testApexError(t, `executable mybin is static`, `
9610 apex {
9611 name: "myapex",
9612 key: "myapex.key",
9613 binaries: ["mybin"],
9614 min_sdk_version: "29",
9615 }
9616
9617 apex_key {
9618 name: "myapex.key",
9619 public_key: "testkey.avbpubkey",
9620 private_key: "testkey.pem",
9621 }
9622
9623 cc_binary {
9624 name: "mybin",
9625 srcs: ["mylib.cpp"],
9626 relative_install_path: "foo/bar",
9627 static_executable: true,
9628 system_shared_libs: [],
9629 stl: "none",
9630 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009631 min_sdk_version: "29",
9632 }
9633 `)
9634
9635 testApexError(t, `executable mybin.rust is static`, `
9636 apex {
9637 name: "myapex",
9638 key: "myapex.key",
9639 binaries: ["mybin.rust"],
9640 min_sdk_version: "29",
9641 }
9642
9643 apex_key {
9644 name: "myapex.key",
9645 public_key: "testkey.avbpubkey",
9646 private_key: "testkey.pem",
9647 }
9648
9649 rust_binary {
9650 name: "mybin.rust",
9651 srcs: ["foo.rs"],
9652 static_executable: true,
9653 apex_available: ["myapex"],
9654 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009655 }
9656 `)
9657}
9658
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009659func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9660 ctx := testApex(t, `
9661 apex {
9662 name: "myapex",
9663 key: "myapex.key",
9664 updatable: false,
9665 java_libs: ["foo"],
9666 }
9667
9668 apex_key {
9669 name: "myapex.key",
9670 public_key: "testkey.avbpubkey",
9671 private_key: "testkey.pem",
9672 }
9673
9674 java_library {
9675 name: "foo",
9676 srcs: ["foo.java"],
9677 apex_available: ["myapex"],
9678 installable: true,
9679 }
9680 `,
9681 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9682 )
9683
Jooyung Hana0503a52023-08-23 13:12:50 +09009684 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009685 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9686 var builder strings.Builder
9687 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9688 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009689 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 +00009690}
9691
9692func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9693 ctx := testApex(t, `
9694 prebuilt_apex {
9695 name: "myapex",
9696 arch: {
9697 arm64: {
9698 src: "myapex-arm64.apex",
9699 },
9700 arm: {
9701 src: "myapex-arm.apex",
9702 },
9703 },
9704 exported_java_libs: ["foo"],
9705 }
9706
9707 java_import {
9708 name: "foo",
9709 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009710 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009711 }
9712 `,
9713 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9714 )
9715
9716 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9717 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9718 mainModuleEntries := entriesList[0]
9719 android.AssertArrayString(t,
9720 "LOCAL_REQUIRED_MODULES",
9721 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9722 []string{
9723 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9724 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9725 })
9726}
9727
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009728func TestAndroidMk_RequiredModules(t *testing.T) {
9729 ctx := testApex(t, `
9730 apex {
9731 name: "myapex",
9732 key: "myapex.key",
9733 updatable: false,
9734 java_libs: ["foo"],
9735 required: ["otherapex"],
9736 }
9737
9738 apex {
9739 name: "otherapex",
9740 key: "myapex.key",
9741 updatable: false,
9742 java_libs: ["foo"],
9743 required: ["otherapex"],
9744 }
9745
9746 apex_key {
9747 name: "myapex.key",
9748 public_key: "testkey.avbpubkey",
9749 private_key: "testkey.pem",
9750 }
9751
9752 java_library {
9753 name: "foo",
9754 srcs: ["foo.java"],
9755 apex_available: ["myapex", "otherapex"],
9756 installable: true,
9757 }
9758 `)
9759
Jooyung Hana0503a52023-08-23 13:12:50 +09009760 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009761 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9762 var builder strings.Builder
9763 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9764 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009765 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009766}
9767
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009768func TestAndroidMk_RequiredDeps(t *testing.T) {
9769 ctx := testApex(t, `
9770 apex {
9771 name: "myapex",
9772 key: "myapex.key",
9773 updatable: false,
9774 }
9775
9776 apex_key {
9777 name: "myapex.key",
9778 public_key: "testkey.avbpubkey",
9779 private_key: "testkey.pem",
9780 }
9781 `)
9782
Jooyung Hana0503a52023-08-23 13:12:50 +09009783 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009784 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009785 data := android.AndroidMkDataForTest(t, ctx, bundle)
9786 var builder strings.Builder
9787 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9788 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009789 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009790}
9791
Jooyung Hana6d36672022-02-24 13:58:07 +09009792func TestApexOutputFileProducer(t *testing.T) {
9793 for _, tc := range []struct {
9794 name string
9795 ref string
9796 expected_data []string
9797 }{
9798 {
9799 name: "test_using_output",
9800 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009801 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009802 },
9803 {
9804 name: "test_using_apex",
9805 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009806 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009807 },
9808 } {
9809 t.Run(tc.name, func(t *testing.T) {
9810 ctx := testApex(t, `
9811 apex {
9812 name: "myapex",
9813 key: "myapex.key",
9814 compressible: true,
9815 updatable: false,
9816 }
9817
9818 apex_key {
9819 name: "myapex.key",
9820 public_key: "testkey.avbpubkey",
9821 private_key: "testkey.pem",
9822 }
9823
9824 java_test {
9825 name: "`+tc.name+`",
9826 srcs: ["a.java"],
9827 data: ["`+tc.ref+`"],
9828 }
9829 `,
9830 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9831 variables.CompressedApex = proptools.BoolPtr(true)
9832 }))
9833 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9834 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9835 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9836 })
9837 }
9838}
9839
satayev758968a2021-12-06 11:42:40 +00009840func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9841 preparer := android.GroupFixturePreparers(
9842 PrepareForTestWithApexBuildComponents,
9843 prepareForTestWithMyapex,
9844 java.PrepareForTestWithJavaSdkLibraryFiles,
9845 java.PrepareForTestWithJavaDefaultModules,
9846 android.PrepareForTestWithAndroidBuildComponents,
9847 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9848 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9849 )
9850
9851 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9852 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9853 preparer.RunTestWithBp(t, `
9854 apex {
9855 name: "myapex",
9856 key: "myapex.key",
9857 bootclasspath_fragments: ["mybootclasspathfragment"],
9858 min_sdk_version: "30",
9859 updatable: false,
9860 }
9861
9862 apex_key {
9863 name: "myapex.key",
9864 public_key: "testkey.avbpubkey",
9865 private_key: "testkey.pem",
9866 }
9867
9868 bootclasspath_fragment {
9869 name: "mybootclasspathfragment",
9870 contents: ["mybootclasspathlib"],
9871 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009872 hidden_api: {
9873 split_packages: ["*"],
9874 },
satayev758968a2021-12-06 11:42:40 +00009875 }
9876
9877 java_sdk_library {
9878 name: "mybootclasspathlib",
9879 srcs: ["mybootclasspathlib.java"],
9880 apex_available: ["myapex"],
9881 compile_dex: true,
9882 unsafe_ignore_missing_latest_api: true,
9883 min_sdk_version: "31",
9884 static_libs: ["util"],
9885 }
9886
9887 java_library {
9888 name: "util",
9889 srcs: ["a.java"],
9890 apex_available: ["myapex"],
9891 min_sdk_version: "31",
9892 static_libs: ["another_util"],
9893 }
9894
9895 java_library {
9896 name: "another_util",
9897 srcs: ["a.java"],
9898 min_sdk_version: "31",
9899 apex_available: ["myapex"],
9900 }
9901 `)
9902 })
9903
9904 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9905 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9906 preparer.RunTestWithBp(t, `
9907 apex {
9908 name: "myapex",
9909 key: "myapex.key",
9910 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9911 min_sdk_version: "30",
9912 updatable: false,
9913 }
9914
9915 apex_key {
9916 name: "myapex.key",
9917 public_key: "testkey.avbpubkey",
9918 private_key: "testkey.pem",
9919 }
9920
9921 systemserverclasspath_fragment {
9922 name: "mysystemserverclasspathfragment",
9923 contents: ["mysystemserverclasspathlib"],
9924 apex_available: ["myapex"],
9925 }
9926
9927 java_sdk_library {
9928 name: "mysystemserverclasspathlib",
9929 srcs: ["mysystemserverclasspathlib.java"],
9930 apex_available: ["myapex"],
9931 compile_dex: true,
9932 min_sdk_version: "32",
9933 unsafe_ignore_missing_latest_api: true,
9934 static_libs: ["util"],
9935 }
9936
9937 java_library {
9938 name: "util",
9939 srcs: ["a.java"],
9940 apex_available: ["myapex"],
9941 min_sdk_version: "31",
9942 static_libs: ["another_util"],
9943 }
9944
9945 java_library {
9946 name: "another_util",
9947 srcs: ["a.java"],
9948 min_sdk_version: "31",
9949 apex_available: ["myapex"],
9950 }
9951 `)
9952 })
9953
9954 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9955 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9956 RunTestWithBp(t, `
9957 apex {
9958 name: "myapex",
9959 key: "myapex.key",
9960 bootclasspath_fragments: ["mybootclasspathfragment"],
9961 min_sdk_version: "30",
9962 updatable: false,
9963 }
9964
9965 apex_key {
9966 name: "myapex.key",
9967 public_key: "testkey.avbpubkey",
9968 private_key: "testkey.pem",
9969 }
9970
9971 bootclasspath_fragment {
9972 name: "mybootclasspathfragment",
9973 contents: ["mybootclasspathlib"],
9974 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009975 hidden_api: {
9976 split_packages: ["*"],
9977 },
satayev758968a2021-12-06 11:42:40 +00009978 }
9979
9980 java_sdk_library {
9981 name: "mybootclasspathlib",
9982 srcs: ["mybootclasspathlib.java"],
9983 apex_available: ["myapex"],
9984 compile_dex: true,
9985 unsafe_ignore_missing_latest_api: true,
9986 }
9987 `)
9988 })
9989
9990 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9991 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9992 RunTestWithBp(t, `
9993 apex {
9994 name: "myapex",
9995 key: "myapex.key",
9996 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9997 min_sdk_version: "30",
9998 updatable: false,
9999 }
10000
10001 apex_key {
10002 name: "myapex.key",
10003 public_key: "testkey.avbpubkey",
10004 private_key: "testkey.pem",
10005 }
10006
10007 systemserverclasspath_fragment {
10008 name: "mysystemserverclasspathfragment",
10009 contents: ["mysystemserverclasspathlib"],
10010 apex_available: ["myapex"],
10011 }
10012
10013 java_sdk_library {
10014 name: "mysystemserverclasspathlib",
10015 srcs: ["mysystemserverclasspathlib.java"],
10016 apex_available: ["myapex"],
10017 compile_dex: true,
10018 unsafe_ignore_missing_latest_api: true,
10019 }
10020 `)
10021 })
10022}
10023
Jiakai Zhang6decef92022-01-12 17:56:19 +000010024// Verifies that the APEX depends on all the Make modules in the list.
10025func ensureContainsRequiredDeps(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.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010029 }
10030}
10031
10032// Verifies that the APEX does not depend on any of the Make modules in the list.
10033func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10034 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10035 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010036 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010037 }
10038}
10039
Cole Faust1021ccd2023-02-26 21:15:25 -080010040// TODO(b/193460475): Re-enable this test
10041//func TestApexStrictUpdtabilityLint(t *testing.T) {
10042// bpTemplate := `
10043// apex {
10044// name: "myapex",
10045// key: "myapex.key",
10046// java_libs: ["myjavalib"],
10047// updatable: %v,
10048// min_sdk_version: "29",
10049// }
10050// apex_key {
10051// name: "myapex.key",
10052// }
10053// java_library {
10054// name: "myjavalib",
10055// srcs: ["MyClass.java"],
10056// apex_available: [ "myapex" ],
10057// lint: {
10058// strict_updatability_linting: %v,
10059// },
10060// sdk_version: "current",
10061// min_sdk_version: "29",
10062// }
10063// `
10064// fs := android.MockFS{
10065// "lint-baseline.xml": nil,
10066// }
10067//
10068// testCases := []struct {
10069// testCaseName string
10070// apexUpdatable bool
10071// javaStrictUpdtabilityLint bool
10072// lintFileExists bool
10073// disallowedFlagExpected bool
10074// }{
10075// {
10076// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10077// apexUpdatable: true,
10078// javaStrictUpdtabilityLint: true,
10079// lintFileExists: false,
10080// disallowedFlagExpected: false,
10081// },
10082// {
10083// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10084// apexUpdatable: false,
10085// javaStrictUpdtabilityLint: false,
10086// lintFileExists: true,
10087// disallowedFlagExpected: false,
10088// },
10089// {
10090// testCaseName: "non-updatable apex respects strict updatability of javalib",
10091// apexUpdatable: false,
10092// javaStrictUpdtabilityLint: true,
10093// lintFileExists: true,
10094// disallowedFlagExpected: true,
10095// },
10096// {
10097// testCaseName: "updatable apex sets strict updatability of javalib to true",
10098// apexUpdatable: true,
10099// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10100// lintFileExists: true,
10101// disallowedFlagExpected: true,
10102// },
10103// }
10104//
10105// for _, testCase := range testCases {
10106// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10107// fixtures := []android.FixturePreparer{}
10108// if testCase.lintFileExists {
10109// fixtures = append(fixtures, fs.AddToFixture())
10110// }
10111//
10112// result := testApex(t, bp, fixtures...)
10113// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10114// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10115// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10116//
10117// if disallowedFlagActual != testCase.disallowedFlagExpected {
10118// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10119// }
10120// }
10121//}
10122//
10123//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10124// bp := `
10125// apex {
10126// name: "myapex",
10127// key: "myapex.key",
10128// java_libs: ["myjavalib"],
10129// updatable: true,
10130// min_sdk_version: "29",
10131// }
10132// apex_key {
10133// name: "myapex.key",
10134// }
10135// java_library {
10136// name: "myjavalib",
10137// srcs: ["MyClass.java"],
10138// apex_available: [ "myapex" ],
10139// sdk_version: "current",
10140// min_sdk_version: "29",
10141// }
10142// `
10143//
10144// testCases := []struct {
10145// testCaseName string
10146// moduleDirectory string
10147// disallowedFlagExpected bool
10148// }{
10149// {
10150// testCaseName: "lintable module defined outside libcore",
10151// moduleDirectory: "",
10152// disallowedFlagExpected: true,
10153// },
10154// {
10155// testCaseName: "lintable module defined in libcore root directory",
10156// moduleDirectory: "libcore/",
10157// disallowedFlagExpected: false,
10158// },
10159// {
10160// testCaseName: "lintable module defined in libcore child directory",
10161// moduleDirectory: "libcore/childdir/",
10162// disallowedFlagExpected: true,
10163// },
10164// }
10165//
10166// for _, testCase := range testCases {
10167// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10168// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10169// result := testApex(t, "", lintFileCreator, bpFileCreator)
10170// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10171// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10172// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10173// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10174//
10175// if disallowedFlagActual != testCase.disallowedFlagExpected {
10176// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10177// }
10178// }
10179//}
10180//
10181//// checks transtive deps of an apex coming from bootclasspath_fragment
10182//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10183// bp := `
10184// apex {
10185// name: "myapex",
10186// key: "myapex.key",
10187// bootclasspath_fragments: ["mybootclasspathfragment"],
10188// updatable: true,
10189// min_sdk_version: "29",
10190// }
10191// apex_key {
10192// name: "myapex.key",
10193// }
10194// bootclasspath_fragment {
10195// name: "mybootclasspathfragment",
10196// contents: ["myjavalib"],
10197// apex_available: ["myapex"],
10198// hidden_api: {
10199// split_packages: ["*"],
10200// },
10201// }
10202// java_library {
10203// name: "myjavalib",
10204// srcs: ["MyClass.java"],
10205// apex_available: [ "myapex" ],
10206// sdk_version: "current",
10207// min_sdk_version: "29",
10208// compile_dex: true,
10209// }
10210// `
10211// fs := android.MockFS{
10212// "lint-baseline.xml": nil,
10213// }
10214//
10215// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10216// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10217// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10218// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10219// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10220// }
10221//}
Spandan Das66773252022-01-15 00:23:18 +000010222
Spandan Das42e89502022-05-06 22:12:55 +000010223// updatable apexes should propagate updatable=true to its apps
10224func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10225 bp := `
10226 apex {
10227 name: "myapex",
10228 key: "myapex.key",
10229 updatable: %v,
10230 apps: [
10231 "myapp",
10232 ],
10233 min_sdk_version: "30",
10234 }
10235 apex_key {
10236 name: "myapex.key",
10237 }
10238 android_app {
10239 name: "myapp",
10240 updatable: %v,
10241 apex_available: [
10242 "myapex",
10243 ],
10244 sdk_version: "current",
10245 min_sdk_version: "30",
10246 }
10247 `
10248 testCases := []struct {
10249 name string
10250 apex_is_updatable_bp bool
10251 app_is_updatable_bp bool
10252 app_is_updatable_expected bool
10253 }{
10254 {
10255 name: "Non-updatable apex respects updatable property of non-updatable app",
10256 apex_is_updatable_bp: false,
10257 app_is_updatable_bp: false,
10258 app_is_updatable_expected: false,
10259 },
10260 {
10261 name: "Non-updatable apex respects updatable property of updatable app",
10262 apex_is_updatable_bp: false,
10263 app_is_updatable_bp: true,
10264 app_is_updatable_expected: true,
10265 },
10266 {
10267 name: "Updatable apex respects updatable property of updatable app",
10268 apex_is_updatable_bp: true,
10269 app_is_updatable_bp: true,
10270 app_is_updatable_expected: true,
10271 },
10272 {
10273 name: "Updatable apex sets updatable=true on non-updatable app",
10274 apex_is_updatable_bp: true,
10275 app_is_updatable_bp: false,
10276 app_is_updatable_expected: true,
10277 },
10278 }
10279 for _, testCase := range testCases {
10280 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10281 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10282 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10283 }
10284}
10285
Kiyoung Kim487689e2022-07-26 09:48:22 +090010286func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10287 bp := `
10288 apex {
10289 name: "myapex",
10290 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010291 native_shared_libs: ["libbaz"],
10292 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010293 min_sdk_version: "29",
10294 }
10295 apex_key {
10296 name: "myapex.key",
10297 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010298 cc_binary {
10299 name: "binfoo",
10300 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010301 apex_available: ["myapex"],
10302 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010303 recovery_available: false,
10304 }
10305 cc_library {
10306 name: "libbar",
10307 srcs: ["libbar.cc"],
10308 stubs: {
10309 symbol_file: "libbar.map.txt",
10310 versions: [
10311 "29",
10312 ],
10313 },
10314 }
10315 cc_library {
10316 name: "libbaz",
10317 srcs: ["libbaz.cc"],
10318 apex_available: ["myapex"],
10319 min_sdk_version: "29",
10320 stubs: {
10321 symbol_file: "libbaz.map.txt",
10322 versions: [
10323 "29",
10324 ],
10325 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010326 }
10327 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010328 name: "libbar",
10329 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010330 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010331 variants: ["apex.29"],
10332 }
10333 cc_api_variant {
10334 name: "libbar",
10335 variant: "apex",
10336 version: "29",
10337 src: "libbar_apex_29.so",
10338 }
10339 cc_api_library {
10340 name: "libbaz",
10341 src: "libbaz_stub.so",
10342 min_sdk_version: "29",
10343 variants: ["apex.29"],
10344 }
10345 cc_api_variant {
10346 name: "libbaz",
10347 variant: "apex",
10348 version: "29",
10349 src: "libbaz_apex_29.so",
10350 }
10351 cc_api_library {
10352 name: "libqux",
10353 src: "libqux_stub.so",
10354 min_sdk_version: "29",
10355 variants: ["apex.29"],
10356 }
10357 cc_api_variant {
10358 name: "libqux",
10359 variant: "apex",
10360 version: "29",
10361 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010362 }
10363 api_imports {
10364 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010365 apex_shared_libs: [
10366 "libbar",
10367 "libbaz",
10368 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010369 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010370 }
10371 `
10372 result := testApex(t, bp)
10373
10374 hasDep := func(m android.Module, wantDep android.Module) bool {
10375 t.Helper()
10376 var found bool
10377 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10378 if dep == wantDep {
10379 found = true
10380 }
10381 })
10382 return found
10383 }
10384
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010385 // Library defines stubs and cc_api_library should be used with cc_api_library
10386 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10387 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10388 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010389
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010390 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10391 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010392
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010393 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10394 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10395 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10396 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10397
10398 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10399 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10400 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10401 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10402 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10403
10404 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10405 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10406 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10407
10408 // cc_api_library defined without original library should be linked with cc_api_library
10409 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10410 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10411 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10412}
10413
10414func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10415 bp := `
10416 apex {
10417 name: "myapex",
10418 key: "myapex.key",
10419 native_shared_libs: ["libbar"],
10420 min_sdk_version: "29",
10421 }
10422 apex_key {
10423 name: "myapex.key",
10424 }
10425 cc_binary {
10426 name: "binfoo",
10427 shared_libs: ["libbar"],
10428 recovery_available: false,
10429 }
10430 cc_library {
10431 name: "libbar",
10432 srcs: ["libbar.cc"],
10433 apex_available: ["myapex"],
10434 min_sdk_version: "29",
10435 stubs: {
10436 symbol_file: "libbar.map.txt",
10437 versions: [
10438 "29",
10439 ],
10440 },
10441 }
10442 cc_api_library {
10443 name: "libbar",
10444 src: "libbar_stub.so",
10445 variants: ["apex.29"],
10446 }
10447 cc_api_variant {
10448 name: "libbar",
10449 variant: "apex",
10450 version: "29",
10451 src: "libbar_apex_29.so",
10452 }
10453 api_imports {
10454 name: "api_imports",
10455 apex_shared_libs: [
10456 "libbar",
10457 ],
10458 }
10459 `
10460
10461 result := testApex(t, bp)
10462
10463 hasDep := func(m android.Module, wantDep android.Module) bool {
10464 t.Helper()
10465 var found bool
10466 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10467 if dep == wantDep {
10468 found = true
10469 }
10470 })
10471 return found
10472 }
10473
10474 // Library defines stubs and cc_api_library should be used with cc_api_library
10475 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10476 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10477 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10478
10479 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10480 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10481
10482 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10483 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10484 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10485 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010486}
Dennis Shend4f5d932023-01-31 20:27:21 +000010487
10488func TestTrimmedApex(t *testing.T) {
10489 bp := `
10490 apex {
10491 name: "myapex",
10492 key: "myapex.key",
10493 native_shared_libs: ["libfoo","libbaz"],
10494 min_sdk_version: "29",
10495 trim_against: "mydcla",
10496 }
10497 apex {
10498 name: "mydcla",
10499 key: "myapex.key",
10500 native_shared_libs: ["libfoo","libbar"],
10501 min_sdk_version: "29",
10502 file_contexts: ":myapex-file_contexts",
10503 dynamic_common_lib_apex: true,
10504 }
10505 apex_key {
10506 name: "myapex.key",
10507 }
10508 cc_library {
10509 name: "libfoo",
10510 shared_libs: ["libc"],
10511 apex_available: ["myapex","mydcla"],
10512 min_sdk_version: "29",
10513 }
10514 cc_library {
10515 name: "libbar",
10516 shared_libs: ["libc"],
10517 apex_available: ["myapex","mydcla"],
10518 min_sdk_version: "29",
10519 }
10520 cc_library {
10521 name: "libbaz",
10522 shared_libs: ["libc"],
10523 apex_available: ["myapex","mydcla"],
10524 min_sdk_version: "29",
10525 }
10526 cc_api_library {
10527 name: "libc",
10528 src: "libc.so",
10529 min_sdk_version: "29",
10530 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010531 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010532 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010533 }
10534 api_imports {
10535 name: "api_imports",
10536 shared_libs: [
10537 "libc",
10538 ],
10539 header_libs: [],
10540 }
10541 `
10542 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010543 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010544 apexRule := module.MaybeRule("apexRule")
10545 if apexRule.Rule == nil {
10546 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10547 }
10548
10549 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010550 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010551 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10552 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10553 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10554 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10555}
Jingwen Chendea7a642023-03-28 11:30:50 +000010556
10557func TestCannedFsConfig(t *testing.T) {
10558 ctx := testApex(t, `
10559 apex {
10560 name: "myapex",
10561 key: "myapex.key",
10562 updatable: false,
10563 }
10564
10565 apex_key {
10566 name: "myapex.key",
10567 public_key: "testkey.avbpubkey",
10568 private_key: "testkey.pem",
10569 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010570 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010571 generateFsRule := mod.Rule("generateFsConfig")
10572 cmd := generateFsRule.RuleParams.Command
10573
10574 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10575}
10576
10577func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10578 ctx := testApex(t, `
10579 apex {
10580 name: "myapex",
10581 key: "myapex.key",
10582 canned_fs_config: "my_config",
10583 updatable: false,
10584 }
10585
10586 apex_key {
10587 name: "myapex.key",
10588 public_key: "testkey.avbpubkey",
10589 private_key: "testkey.pem",
10590 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010591 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010592 generateFsRule := mod.Rule("generateFsConfig")
10593 cmd := generateFsRule.RuleParams.Command
10594
10595 // Ensure that canned_fs_config has "cat my_config" at the end
10596 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10597}
Spandan Das20fce2d2023-04-12 17:21:39 +000010598
10599func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10600 testCases := []struct {
10601 desc string
10602 hasStubs bool
10603 apexAvailable string
10604 expectedError string
10605 }{
10606 {
10607 desc: "non-stub library can have multiple apex_available",
10608 hasStubs: false,
10609 apexAvailable: `["myapex", "otherapex"]`,
10610 },
10611 {
10612 desc: "stub library should not be available to anyapex",
10613 hasStubs: true,
10614 apexAvailable: `["//apex_available:anyapex"]`,
10615 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10616 },
10617 {
10618 desc: "stub library should not be available to multiple apexes",
10619 hasStubs: true,
10620 apexAvailable: `["myapex", "otherapex"]`,
10621 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10622 },
10623 {
10624 desc: "stub library can be available to a core apex and a test apex",
10625 hasStubs: true,
10626 apexAvailable: `["myapex", "test_myapex"]`,
10627 },
10628 }
10629 bpTemplate := `
10630 cc_library {
10631 name: "libfoo",
10632 %v
10633 apex_available: %v,
10634 }
10635 apex {
10636 name: "myapex",
10637 key: "apex.key",
10638 updatable: false,
10639 native_shared_libs: ["libfoo"],
10640 }
10641 apex {
10642 name: "otherapex",
10643 key: "apex.key",
10644 updatable: false,
10645 }
10646 apex_test {
10647 name: "test_myapex",
10648 key: "apex.key",
10649 updatable: false,
10650 native_shared_libs: ["libfoo"],
10651 }
10652 apex_key {
10653 name: "apex.key",
10654 }
10655 `
10656 for _, tc := range testCases {
10657 stubs := ""
10658 if tc.hasStubs {
10659 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10660 }
10661 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10662 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10663 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10664 })
10665 if tc.expectedError == "" {
10666 testApex(t, bp, mockFsFixturePreparer)
10667 } else {
10668 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10669 }
10670 }
10671}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010672
10673func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10674 context := android.GroupFixturePreparers(
10675 android.PrepareForIntegrationTestWithAndroid,
10676 cc.PrepareForIntegrationTestWithCc,
10677 PrepareForTestWithApexBuildComponents,
10678 prepareForTestWithMyapex,
10679 filesystem.PrepareForTestWithFilesystemBuildComponents,
10680 )
10681 result := context.RunTestWithBp(t, `
10682 android_system_image {
10683 name: "myfilesystem",
10684 deps: [
10685 "libfoo",
10686 ],
10687 linker_config_src: "linker.config.json",
10688 }
10689
10690 cc_library {
10691 name: "libfoo",
10692 shared_libs: [
10693 "libbar",
10694 ],
10695 stl: "none",
10696 }
10697
10698 cc_library {
10699 name: "libbar",
10700 stl: "none",
10701 apex_available: ["myapex"],
10702 }
10703
10704 apex {
10705 name: "myapex",
10706 native_shared_libs: ["libbar"],
10707 key: "myapex.key",
10708 updatable: false,
10709 }
10710
10711 apex_key {
10712 name: "myapex.key",
10713 public_key: "testkey.avbpubkey",
10714 private_key: "testkey.pem",
10715 }
10716 `)
10717
10718 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10719 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10720 inputs.Strings(),
10721 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10722}