blob: e70d3af7e78af1da1b2f9522cacae89cb47ec1e3 [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 Yun8a2600c2020-12-07 12:44:03 +09003885 for _, txt := range []string{"llndk", "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",
3889 }
3890 `
3891 }
3892 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003893 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003894 result += `
3895 prebuilt_etc {
3896 name: "` + txt + `.libraries.` + v + `.txt",
3897 src: "dummy.txt",
3898 }
3899 `
3900 }
3901 }
3902 }
3903 return
3904}
3905
Jooyung Han344d5432019-08-23 11:17:39 +09003906func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003907 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003908 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003909 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003910 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003911 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003912 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003913 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003914 }
3915
3916 apex_key {
3917 name: "myapex.key",
3918 public_key: "testkey.avbpubkey",
3919 private_key: "testkey.pem",
3920 }
3921
Jooyung Han31c470b2019-10-18 16:26:59 +09003922 vndk_prebuilt_shared {
3923 name: "libvndk27",
3924 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003925 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003926 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003927 vndk: {
3928 enabled: true,
3929 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003930 target_arch: "arm64",
3931 arch: {
3932 arm: {
3933 srcs: ["libvndk27_arm.so"],
3934 },
3935 arm64: {
3936 srcs: ["libvndk27_arm64.so"],
3937 },
3938 },
Colin Cross2807f002021-03-02 10:15:29 -08003939 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003940 }
3941
3942 vndk_prebuilt_shared {
3943 name: "libvndk27",
3944 version: "27",
3945 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003946 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003947 vndk: {
3948 enabled: true,
3949 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003950 target_arch: "x86_64",
3951 arch: {
3952 x86: {
3953 srcs: ["libvndk27_x86.so"],
3954 },
3955 x86_64: {
3956 srcs: ["libvndk27_x86_64.so"],
3957 },
3958 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003959 }
3960 `+vndkLibrariesTxtFiles("27"),
3961 withFiles(map[string][]byte{
3962 "libvndk27_arm.so": nil,
3963 "libvndk27_arm64.so": nil,
3964 "libvndk27_x86.so": nil,
3965 "libvndk27_x86_64.so": nil,
3966 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003967
Jooyung Hana0503a52023-08-23 13:12:50 +09003968 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003969 "lib/libvndk27_arm.so",
3970 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003971 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003972 })
Jooyung Han344d5432019-08-23 11:17:39 +09003973}
3974
Jooyung Han90eee022019-10-01 20:02:42 +09003975func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003976 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003977 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003978 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003979 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003980 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003981 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003982 }
3983 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003984 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003985 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003986 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003987 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003988 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003989 }
3990 apex_key {
3991 name: "myapex.key",
3992 public_key: "testkey.avbpubkey",
3993 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003994 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003995
3996 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09003997 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003998 apexManifestRule := module.Rule("apexManifestRule")
3999 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004000 }
4001
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004002 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004003 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004004}
4005
Jooyung Han344d5432019-08-23 11:17:39 +09004006func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004007 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004008 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004009 name: "com.android.vndk.current",
4010 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004011 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004012 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004013 }
4014
4015 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004016 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004017 public_key: "testkey.avbpubkey",
4018 private_key: "testkey.pem",
4019 }
4020
4021 cc_library {
4022 name: "libvndk",
4023 srcs: ["mylib.cpp"],
4024 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004025 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004026 native_bridge_supported: true,
4027 host_supported: true,
4028 vndk: {
4029 enabled: true,
4030 },
4031 system_shared_libs: [],
4032 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004033 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004034 }
Colin Cross2807f002021-03-02 10:15:29 -08004035 `+vndkLibrariesTxtFiles("current"),
4036 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004037
Jooyung Hana0503a52023-08-23 13:12:50 +09004038 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004039 "lib/libvndk.so",
4040 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004041 "lib/libc++.so",
4042 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004043 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004044 })
Jooyung Han344d5432019-08-23 11:17:39 +09004045}
4046
4047func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004048 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004049 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004050 name: "com.android.vndk.current",
4051 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004052 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004053 native_bridge_supported: true,
4054 }
4055
4056 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004057 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004058 public_key: "testkey.avbpubkey",
4059 private_key: "testkey.pem",
4060 }
4061
4062 cc_library {
4063 name: "libvndk",
4064 srcs: ["mylib.cpp"],
4065 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004066 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004067 native_bridge_supported: true,
4068 host_supported: true,
4069 vndk: {
4070 enabled: true,
4071 },
4072 system_shared_libs: [],
4073 stl: "none",
4074 }
4075 `)
4076}
4077
Jooyung Han31c470b2019-10-18 16:26:59 +09004078func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004079 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004080 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004081 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004082 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004083 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004084 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004085 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004086 }
4087
4088 apex_key {
4089 name: "myapex.key",
4090 public_key: "testkey.avbpubkey",
4091 private_key: "testkey.pem",
4092 }
4093
4094 vndk_prebuilt_shared {
4095 name: "libvndk27",
4096 version: "27",
4097 target_arch: "arm",
4098 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004099 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004100 vndk: {
4101 enabled: true,
4102 },
4103 arch: {
4104 arm: {
4105 srcs: ["libvndk27.so"],
4106 }
4107 },
4108 }
4109
4110 vndk_prebuilt_shared {
4111 name: "libvndk27",
4112 version: "27",
4113 target_arch: "arm",
4114 binder32bit: true,
4115 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004116 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004117 vndk: {
4118 enabled: true,
4119 },
4120 arch: {
4121 arm: {
4122 srcs: ["libvndk27binder32.so"],
4123 }
4124 },
Colin Cross2807f002021-03-02 10:15:29 -08004125 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004126 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004127 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 withFiles(map[string][]byte{
4129 "libvndk27.so": nil,
4130 "libvndk27binder32.so": nil,
4131 }),
4132 withBinder32bit,
4133 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004134 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004135 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4136 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004137 },
4138 }),
4139 )
4140
Jooyung Hana0503a52023-08-23 13:12:50 +09004141 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004142 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004143 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004144 })
4145}
4146
Jooyung Han45a96772020-06-15 14:59:42 +09004147func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004148 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004149 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004150 name: "com.android.vndk.current",
4151 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004152 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004153 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004154 }
4155
4156 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004157 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004158 public_key: "testkey.avbpubkey",
4159 private_key: "testkey.pem",
4160 }
4161
4162 cc_library {
4163 name: "libz",
4164 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004165 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004166 vndk: {
4167 enabled: true,
4168 },
4169 stubs: {
4170 symbol_file: "libz.map.txt",
4171 versions: ["30"],
4172 }
4173 }
4174 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4175 "libz.map.txt": nil,
4176 }))
4177
Jooyung Hana0503a52023-08-23 13:12:50 +09004178 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004179 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4180 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004181 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004182 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4183 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4184 "*/*",
4185 })
Jooyung Han45a96772020-06-15 14:59:42 +09004186}
4187
Jooyung Hane3f02812023-05-08 13:54:50 +09004188func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4189 ctx := testApex(t, "",
4190 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4191 variables.DeviceVndkVersion = proptools.StringPtr("27")
4192 }),
4193 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4194 cc.RegisterVendorSnapshotModules(ctx)
4195 }),
4196 withFiles(map[string][]byte{
4197 "vendor/foo/Android.bp": []byte(`
4198 apex {
4199 name: "myapex",
4200 binaries: ["foo"],
4201 key: "myapex.key",
4202 min_sdk_version: "27",
4203 vendor: true,
4204 }
4205
4206 cc_binary {
4207 name: "foo",
4208 vendor: true,
4209 srcs: ["abc.cpp"],
4210 shared_libs: [
4211 "libllndk",
4212 "libvndk",
4213 ],
4214 nocrt: true,
4215 system_shared_libs: [],
4216 min_sdk_version: "27",
4217 }
4218
4219 apex_key {
4220 name: "myapex.key",
4221 public_key: "testkey.avbpubkey",
4222 private_key: "testkey.pem",
4223 }
4224 `),
4225 // Simulate VNDK prebuilts with vendor_snapshot
4226 "prebuilts/vndk/Android.bp": []byte(`
4227 vndk_prebuilt_shared {
4228 name: "libllndk",
4229 version: "27",
4230 vendor_available: true,
4231 product_available: true,
4232 target_arch: "arm64",
4233 arch: {
4234 arm64: {
4235 srcs: ["libllndk.so"],
4236 },
4237 },
4238 }
4239
4240 vndk_prebuilt_shared {
4241 name: "libvndk",
4242 version: "27",
4243 vendor_available: true,
4244 product_available: true,
4245 target_arch: "arm64",
4246 arch: {
4247 arm64: {
4248 srcs: ["libvndk.so"],
4249 },
4250 },
4251 vndk: {
4252 enabled: true,
4253 },
4254 min_sdk_version: "27",
4255 }
4256
4257 vndk_prebuilt_shared {
4258 name: "libc++",
4259 version: "27",
4260 target_arch: "arm64",
4261 vendor_available: true,
4262 product_available: true,
4263 vndk: {
4264 enabled: true,
4265 support_system_process: true,
4266 },
4267 arch: {
4268 arm64: {
4269 srcs: ["libc++.so"],
4270 },
4271 },
4272 min_sdk_version: "apex_inherit",
4273 }
4274
4275 vendor_snapshot {
4276 name: "vendor_snapshot",
4277 version: "27",
4278 arch: {
4279 arm64: {
4280 vndk_libs: [
4281 "libc++",
4282 "libllndk",
4283 "libvndk",
4284 ],
4285 static_libs: [
4286 "libc++demangle",
4287 "libclang_rt.builtins",
4288 "libunwind",
4289 ],
4290 },
4291 }
4292 }
4293
4294 vendor_snapshot_static {
4295 name: "libclang_rt.builtins",
4296 version: "27",
4297 target_arch: "arm64",
4298 vendor: true,
4299 arch: {
4300 arm64: {
4301 src: "libclang_rt.builtins-aarch64-android.a",
4302 },
4303 },
4304 }
4305
4306 vendor_snapshot_static {
4307 name: "libc++demangle",
4308 version: "27",
4309 target_arch: "arm64",
4310 compile_multilib: "64",
4311 vendor: true,
4312 arch: {
4313 arm64: {
4314 src: "libc++demangle.a",
4315 },
4316 },
4317 min_sdk_version: "apex_inherit",
4318 }
4319
4320 vendor_snapshot_static {
4321 name: "libunwind",
4322 version: "27",
4323 target_arch: "arm64",
4324 compile_multilib: "64",
4325 vendor: true,
4326 arch: {
4327 arm64: {
4328 src: "libunwind.a",
4329 },
4330 },
4331 min_sdk_version: "apex_inherit",
4332 }
4333 `),
4334 }))
4335
4336 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004337 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004338 "bin/foo",
4339 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4340 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4341 })
4342
4343 // Should link foo with prebuilt libraries (shared/static)
4344 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4345 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4346 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4347 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4348 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4349
4350 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004351 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004352 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4353 ensureListContains(t, requireNativeLibs, "libllndk.so")
4354}
4355
Jooyung Hane1633032019-08-01 17:41:43 +09004356func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004357 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004358 apex {
4359 name: "myapex_nodep",
4360 key: "myapex.key",
4361 native_shared_libs: ["lib_nodep"],
4362 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004363 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004364 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004365 }
4366
4367 apex {
4368 name: "myapex_dep",
4369 key: "myapex.key",
4370 native_shared_libs: ["lib_dep"],
4371 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004372 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004373 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004374 }
4375
4376 apex {
4377 name: "myapex_provider",
4378 key: "myapex.key",
4379 native_shared_libs: ["libfoo"],
4380 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004381 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004382 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004383 }
4384
4385 apex {
4386 name: "myapex_selfcontained",
4387 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004388 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004389 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004390 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004391 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004392 }
4393
4394 apex_key {
4395 name: "myapex.key",
4396 public_key: "testkey.avbpubkey",
4397 private_key: "testkey.pem",
4398 }
4399
4400 cc_library {
4401 name: "lib_nodep",
4402 srcs: ["mylib.cpp"],
4403 system_shared_libs: [],
4404 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004405 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004406 }
4407
4408 cc_library {
4409 name: "lib_dep",
4410 srcs: ["mylib.cpp"],
4411 shared_libs: ["libfoo"],
4412 system_shared_libs: [],
4413 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004414 apex_available: [
4415 "myapex_dep",
4416 "myapex_provider",
4417 "myapex_selfcontained",
4418 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004419 }
4420
4421 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004422 name: "lib_dep_on_bar",
4423 srcs: ["mylib.cpp"],
4424 shared_libs: ["libbar"],
4425 system_shared_libs: [],
4426 stl: "none",
4427 apex_available: [
4428 "myapex_selfcontained",
4429 ],
4430 }
4431
4432
4433 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004434 name: "libfoo",
4435 srcs: ["mytest.cpp"],
4436 stubs: {
4437 versions: ["1"],
4438 },
4439 system_shared_libs: [],
4440 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004441 apex_available: [
4442 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004443 ],
4444 }
4445
4446 cc_library {
4447 name: "libbar",
4448 srcs: ["mytest.cpp"],
4449 stubs: {
4450 versions: ["1"],
4451 },
4452 system_shared_libs: [],
4453 stl: "none",
4454 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004455 "myapex_selfcontained",
4456 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004457 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004458
Jooyung Hane1633032019-08-01 17:41:43 +09004459 `)
4460
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004461 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004462 var provideNativeLibs, requireNativeLibs []string
4463
Jooyung Hana0503a52023-08-23 13:12:50 +09004464 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004465 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4466 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004467 ensureListEmpty(t, provideNativeLibs)
4468 ensureListEmpty(t, requireNativeLibs)
4469
Jooyung Hana0503a52023-08-23 13:12:50 +09004470 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004471 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4472 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004473 ensureListEmpty(t, provideNativeLibs)
4474 ensureListContains(t, requireNativeLibs, "libfoo.so")
4475
Jooyung Hana0503a52023-08-23 13:12:50 +09004476 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004477 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4478 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004479 ensureListContains(t, provideNativeLibs, "libfoo.so")
4480 ensureListEmpty(t, requireNativeLibs)
4481
Jooyung Hana0503a52023-08-23 13:12:50 +09004482 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004483 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4484 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004485 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004486 ensureListEmpty(t, requireNativeLibs)
4487}
4488
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004489func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4490 ctx := testApex(t, `
4491 apex {
4492 name: "myapex",
4493 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004494 native_shared_libs: ["mylib"],
4495 updatable: false,
4496 }
4497
4498 apex_key {
4499 name: "myapex.key",
4500 public_key: "testkey.avbpubkey",
4501 private_key: "testkey.pem",
4502 }
4503
4504 cc_library {
4505 name: "mylib",
4506 srcs: ["mylib.cpp"],
4507 system_shared_libs: [],
4508 stl: "none",
4509 apex_available: [
4510 "//apex_available:platform",
4511 "myapex",
4512 ],
4513 }
4514 `, android.FixtureMergeEnv(map[string]string{
4515 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4516 }))
4517
Jooyung Hana0503a52023-08-23 13:12:50 +09004518 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004519 apexManifestRule := module.Rule("apexManifestRule")
4520 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4521}
4522
Vinh Tran8f5310f2022-10-07 18:16:47 -04004523func TestCompileMultilibProp(t *testing.T) {
4524 testCases := []struct {
4525 compileMultiLibProp string
4526 containedLibs []string
4527 notContainedLibs []string
4528 }{
4529 {
4530 containedLibs: []string{
4531 "image.apex/lib64/mylib.so",
4532 "image.apex/lib/mylib.so",
4533 },
4534 compileMultiLibProp: `compile_multilib: "both",`,
4535 },
4536 {
4537 containedLibs: []string{"image.apex/lib64/mylib.so"},
4538 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4539 compileMultiLibProp: `compile_multilib: "first",`,
4540 },
4541 {
4542 containedLibs: []string{"image.apex/lib64/mylib.so"},
4543 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4544 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4545 },
4546 {
4547 containedLibs: []string{"image.apex/lib64/mylib.so"},
4548 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4549 compileMultiLibProp: `compile_multilib: "64",`,
4550 },
4551 {
4552 containedLibs: []string{"image.apex/lib/mylib.so"},
4553 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4554 compileMultiLibProp: `compile_multilib: "32",`,
4555 },
4556 }
4557 for _, testCase := range testCases {
4558 ctx := testApex(t, fmt.Sprintf(`
4559 apex {
4560 name: "myapex",
4561 key: "myapex.key",
4562 %s
4563 native_shared_libs: ["mylib"],
4564 updatable: false,
4565 }
4566 apex_key {
4567 name: "myapex.key",
4568 public_key: "testkey.avbpubkey",
4569 private_key: "testkey.pem",
4570 }
4571 cc_library {
4572 name: "mylib",
4573 srcs: ["mylib.cpp"],
4574 apex_available: [
4575 "//apex_available:platform",
4576 "myapex",
4577 ],
4578 }
4579 `, testCase.compileMultiLibProp),
4580 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004581 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004582 apexRule := module.Rule("apexRule")
4583 copyCmds := apexRule.Args["copy_commands"]
4584 for _, containedLib := range testCase.containedLibs {
4585 ensureContains(t, copyCmds, containedLib)
4586 }
4587 for _, notContainedLib := range testCase.notContainedLibs {
4588 ensureNotContains(t, copyCmds, notContainedLib)
4589 }
4590 }
4591}
4592
Alex Light0851b882019-02-07 13:20:53 -08004593func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004594 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004595 apex {
4596 name: "myapex",
4597 key: "myapex.key",
4598 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004599 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004600 }
4601
4602 apex_key {
4603 name: "myapex.key",
4604 public_key: "testkey.avbpubkey",
4605 private_key: "testkey.pem",
4606 }
4607
4608 cc_library {
4609 name: "mylib_common",
4610 srcs: ["mylib.cpp"],
4611 system_shared_libs: [],
4612 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004613 apex_available: [
4614 "//apex_available:platform",
4615 "myapex",
4616 ],
Alex Light0851b882019-02-07 13:20:53 -08004617 }
4618 `)
4619
Jooyung Hana0503a52023-08-23 13:12:50 +09004620 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004621 apexRule := module.Rule("apexRule")
4622 copyCmds := apexRule.Args["copy_commands"]
4623
4624 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4625 t.Log("Apex was a test apex!")
4626 t.Fail()
4627 }
4628 // Ensure that main rule creates an output
4629 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4630
4631 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004632 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004633
4634 // Ensure that both direct and indirect deps are copied into apex
4635 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4636
Colin Cross7113d202019-11-20 16:39:12 -08004637 // Ensure that the platform variant ends with _shared
4638 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004639
Colin Cross56a83212020-09-15 18:30:11 -07004640 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004641 t.Log("Found mylib_common not in any apex!")
4642 t.Fail()
4643 }
4644}
4645
4646func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004647 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004648 apex_test {
4649 name: "myapex",
4650 key: "myapex.key",
4651 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004652 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004653 }
4654
4655 apex_key {
4656 name: "myapex.key",
4657 public_key: "testkey.avbpubkey",
4658 private_key: "testkey.pem",
4659 }
4660
4661 cc_library {
4662 name: "mylib_common_test",
4663 srcs: ["mylib.cpp"],
4664 system_shared_libs: [],
4665 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004666 // TODO: remove //apex_available:platform
4667 apex_available: [
4668 "//apex_available:platform",
4669 "myapex",
4670 ],
Alex Light0851b882019-02-07 13:20:53 -08004671 }
4672 `)
4673
Jooyung Hana0503a52023-08-23 13:12:50 +09004674 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004675 apexRule := module.Rule("apexRule")
4676 copyCmds := apexRule.Args["copy_commands"]
4677
4678 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4679 t.Log("Apex was not a test apex!")
4680 t.Fail()
4681 }
4682 // Ensure that main rule creates an output
4683 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4684
4685 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004686 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004687
4688 // Ensure that both direct and indirect deps are copied into apex
4689 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4690
Colin Cross7113d202019-11-20 16:39:12 -08004691 // Ensure that the platform variant ends with _shared
4692 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004693}
4694
Alex Light9670d332019-01-29 18:07:33 -08004695func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004696 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004697 apex {
4698 name: "myapex",
4699 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004700 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004701 multilib: {
4702 first: {
4703 native_shared_libs: ["mylib_common"],
4704 }
4705 },
4706 target: {
4707 android: {
4708 multilib: {
4709 first: {
4710 native_shared_libs: ["mylib"],
4711 }
4712 }
4713 },
4714 host: {
4715 multilib: {
4716 first: {
4717 native_shared_libs: ["mylib2"],
4718 }
4719 }
4720 }
4721 }
4722 }
4723
4724 apex_key {
4725 name: "myapex.key",
4726 public_key: "testkey.avbpubkey",
4727 private_key: "testkey.pem",
4728 }
4729
4730 cc_library {
4731 name: "mylib",
4732 srcs: ["mylib.cpp"],
4733 system_shared_libs: [],
4734 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004735 // TODO: remove //apex_available:platform
4736 apex_available: [
4737 "//apex_available:platform",
4738 "myapex",
4739 ],
Alex Light9670d332019-01-29 18:07:33 -08004740 }
4741
4742 cc_library {
4743 name: "mylib_common",
4744 srcs: ["mylib.cpp"],
4745 system_shared_libs: [],
4746 stl: "none",
4747 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004748 // TODO: remove //apex_available:platform
4749 apex_available: [
4750 "//apex_available:platform",
4751 "myapex",
4752 ],
Alex Light9670d332019-01-29 18:07:33 -08004753 }
4754
4755 cc_library {
4756 name: "mylib2",
4757 srcs: ["mylib.cpp"],
4758 system_shared_libs: [],
4759 stl: "none",
4760 compile_multilib: "first",
4761 }
4762 `)
4763
Jooyung Hana0503a52023-08-23 13:12:50 +09004764 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004765 copyCmds := apexRule.Args["copy_commands"]
4766
4767 // Ensure that main rule creates an output
4768 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4769
4770 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004771 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4772 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4773 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004774
4775 // Ensure that both direct and indirect deps are copied into apex
4776 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4777 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4778 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4779
Colin Cross7113d202019-11-20 16:39:12 -08004780 // Ensure that the platform variant ends with _shared
4781 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4782 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4783 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004784}
Jiyong Park04480cf2019-02-06 00:16:29 +09004785
Jiyong Park59140302020-12-14 18:44:04 +09004786func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004787 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004788 apex {
4789 name: "myapex",
4790 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004791 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004792 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004793 arch: {
4794 arm64: {
4795 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004796 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004797 },
4798 x86_64: {
4799 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004800 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004801 },
4802 }
4803 }
4804
4805 apex_key {
4806 name: "myapex.key",
4807 public_key: "testkey.avbpubkey",
4808 private_key: "testkey.pem",
4809 }
4810
4811 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004812 name: "mylib.generic",
4813 srcs: ["mylib.cpp"],
4814 system_shared_libs: [],
4815 stl: "none",
4816 // TODO: remove //apex_available:platform
4817 apex_available: [
4818 "//apex_available:platform",
4819 "myapex",
4820 ],
4821 }
4822
4823 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004824 name: "mylib.arm64",
4825 srcs: ["mylib.cpp"],
4826 system_shared_libs: [],
4827 stl: "none",
4828 // TODO: remove //apex_available:platform
4829 apex_available: [
4830 "//apex_available:platform",
4831 "myapex",
4832 ],
4833 }
4834
4835 cc_library {
4836 name: "mylib.x64",
4837 srcs: ["mylib.cpp"],
4838 system_shared_libs: [],
4839 stl: "none",
4840 // TODO: remove //apex_available:platform
4841 apex_available: [
4842 "//apex_available:platform",
4843 "myapex",
4844 ],
4845 }
4846 `)
4847
Jooyung Hana0503a52023-08-23 13:12:50 +09004848 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004849 copyCmds := apexRule.Args["copy_commands"]
4850
4851 // Ensure that apex variant is created for the direct dep
4852 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004853 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004854 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4855
4856 // Ensure that both direct and indirect deps are copied into apex
4857 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4858 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4859}
4860
Jiyong Park04480cf2019-02-06 00:16:29 +09004861func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004862 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004863 apex {
4864 name: "myapex",
4865 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004866 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004867 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004868 }
4869
4870 apex_key {
4871 name: "myapex.key",
4872 public_key: "testkey.avbpubkey",
4873 private_key: "testkey.pem",
4874 }
4875
4876 sh_binary {
4877 name: "myscript",
4878 src: "mylib.cpp",
4879 filename: "myscript.sh",
4880 sub_dir: "script",
4881 }
4882 `)
4883
Jooyung Hana0503a52023-08-23 13:12:50 +09004884 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004885 copyCmds := apexRule.Args["copy_commands"]
4886
4887 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4888}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004889
Jooyung Han91df2082019-11-20 01:49:42 +09004890func TestApexInVariousPartition(t *testing.T) {
4891 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004892 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004893 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004894 {"", "system"},
4895 {"product_specific: true", "product"},
4896 {"soc_specific: true", "vendor"},
4897 {"proprietary: true", "vendor"},
4898 {"vendor: true", "vendor"},
4899 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004900 }
4901 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004902 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004903 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004904 apex {
4905 name: "myapex",
4906 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004907 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004908 `+tc.propName+`
4909 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004910
Jooyung Han91df2082019-11-20 01:49:42 +09004911 apex_key {
4912 name: "myapex.key",
4913 public_key: "testkey.avbpubkey",
4914 private_key: "testkey.pem",
4915 }
4916 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004917
Jooyung Hana0503a52023-08-23 13:12:50 +09004918 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004919 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004920 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004921 if actual != expected {
4922 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4923 }
Jooyung Han91df2082019-11-20 01:49:42 +09004924 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004925 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004926}
Jiyong Park67882562019-03-21 01:11:21 +09004927
Jooyung Han580eb4f2020-06-24 19:33:06 +09004928func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004929 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004930 apex {
4931 name: "myapex",
4932 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004933 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004934 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004935
Jooyung Han580eb4f2020-06-24 19:33:06 +09004936 apex_key {
4937 name: "myapex.key",
4938 public_key: "testkey.avbpubkey",
4939 private_key: "testkey.pem",
4940 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004941 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004942 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004943 rule := module.Output("file_contexts")
4944 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4945}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004946
Jooyung Han580eb4f2020-06-24 19:33:06 +09004947func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004948 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004949 apex {
4950 name: "myapex",
4951 key: "myapex.key",
4952 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004953 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004954 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004955
Jooyung Han580eb4f2020-06-24 19:33:06 +09004956 apex_key {
4957 name: "myapex.key",
4958 public_key: "testkey.avbpubkey",
4959 private_key: "testkey.pem",
4960 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004961 `, withFiles(map[string][]byte{
4962 "my_own_file_contexts": nil,
4963 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004964}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004965
Jooyung Han580eb4f2020-06-24 19:33:06 +09004966func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004967 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004968 apex {
4969 name: "myapex",
4970 key: "myapex.key",
4971 product_specific: true,
4972 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004973 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004974 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004975
Jooyung Han580eb4f2020-06-24 19:33:06 +09004976 apex_key {
4977 name: "myapex.key",
4978 public_key: "testkey.avbpubkey",
4979 private_key: "testkey.pem",
4980 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004981 `)
4982
Colin Cross1c460562021-02-16 17:55:47 -08004983 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004984 apex {
4985 name: "myapex",
4986 key: "myapex.key",
4987 product_specific: true,
4988 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004989 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004990 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004991
Jooyung Han580eb4f2020-06-24 19:33:06 +09004992 apex_key {
4993 name: "myapex.key",
4994 public_key: "testkey.avbpubkey",
4995 private_key: "testkey.pem",
4996 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004997 `, withFiles(map[string][]byte{
4998 "product_specific_file_contexts": nil,
4999 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005000 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005001 rule := module.Output("file_contexts")
5002 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5003}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005004
Jooyung Han580eb4f2020-06-24 19:33:06 +09005005func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005006 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005007 apex {
5008 name: "myapex",
5009 key: "myapex.key",
5010 product_specific: true,
5011 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005012 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005013 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005014
Jooyung Han580eb4f2020-06-24 19:33:06 +09005015 apex_key {
5016 name: "myapex.key",
5017 public_key: "testkey.avbpubkey",
5018 private_key: "testkey.pem",
5019 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005020
Jooyung Han580eb4f2020-06-24 19:33:06 +09005021 filegroup {
5022 name: "my-file-contexts",
5023 srcs: ["product_specific_file_contexts"],
5024 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005025 `, withFiles(map[string][]byte{
5026 "product_specific_file_contexts": nil,
5027 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005028 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005029 rule := module.Output("file_contexts")
5030 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005031}
5032
Jiyong Park67882562019-03-21 01:11:21 +09005033func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005034 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005035 apex_key {
5036 name: "myapex.key",
5037 public_key: ":my.avbpubkey",
5038 private_key: ":my.pem",
5039 product_specific: true,
5040 }
5041
5042 filegroup {
5043 name: "my.avbpubkey",
5044 srcs: ["testkey2.avbpubkey"],
5045 }
5046
5047 filegroup {
5048 name: "my.pem",
5049 srcs: ["testkey2.pem"],
5050 }
5051 `)
5052
5053 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5054 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005055 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005056 if actual_pubkey != expected_pubkey {
5057 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5058 }
5059 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005060 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005061 if actual_privkey != expected_privkey {
5062 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5063 }
5064}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005065
5066func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005067 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005068 prebuilt_apex {
5069 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005070 arch: {
5071 arm64: {
5072 src: "myapex-arm64.apex",
5073 },
5074 arm: {
5075 src: "myapex-arm.apex",
5076 },
5077 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005078 }
5079 `)
5080
Wei Li340ee8e2022-03-18 17:33:24 -07005081 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5082 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005083
Jiyong Parkc95714e2019-03-29 14:23:10 +09005084 expectedInput := "myapex-arm64.apex"
5085 if prebuilt.inputApex.String() != expectedInput {
5086 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5087 }
Wei Li340ee8e2022-03-18 17:33:24 -07005088 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5089 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5090 rule := testingModule.Rule("genProvenanceMetaData")
5091 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5092 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5093 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5094 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005095
5096 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5097 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005098}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005099
Paul Duffinc0609c62021-03-01 17:27:16 +00005100func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005101 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005102 prebuilt_apex {
5103 name: "myapex",
5104 }
5105 `)
5106}
5107
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005108func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005109 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005110 prebuilt_apex {
5111 name: "myapex",
5112 src: "myapex-arm.apex",
5113 filename: "notmyapex.apex",
5114 }
5115 `)
5116
Wei Li340ee8e2022-03-18 17:33:24 -07005117 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5118 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005119
5120 expected := "notmyapex.apex"
5121 if p.installFilename != expected {
5122 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5123 }
Wei Li340ee8e2022-03-18 17:33:24 -07005124 rule := testingModule.Rule("genProvenanceMetaData")
5125 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5126 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5127 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5128 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005129}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005130
Samiul Islam7c02e262021-09-08 17:48:28 +01005131func TestApexSetFilenameOverride(t *testing.T) {
5132 testApex(t, `
5133 apex_set {
5134 name: "com.company.android.myapex",
5135 apex_name: "com.android.myapex",
5136 set: "company-myapex.apks",
5137 filename: "com.company.android.myapex.apex"
5138 }
5139 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5140
5141 testApex(t, `
5142 apex_set {
5143 name: "com.company.android.myapex",
5144 apex_name: "com.android.myapex",
5145 set: "company-myapex.apks",
5146 filename: "com.company.android.myapex.capex"
5147 }
5148 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5149
5150 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5151 apex_set {
5152 name: "com.company.android.myapex",
5153 apex_name: "com.android.myapex",
5154 set: "company-myapex.apks",
5155 filename: "some-random-suffix"
5156 }
5157 `)
5158}
5159
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005160func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005161 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005162 prebuilt_apex {
5163 name: "myapex.prebuilt",
5164 src: "myapex-arm.apex",
5165 overrides: [
5166 "myapex",
5167 ],
5168 }
5169 `)
5170
Wei Li340ee8e2022-03-18 17:33:24 -07005171 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5172 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005173
5174 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005175 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005176 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005177 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005178 }
Wei Li340ee8e2022-03-18 17:33:24 -07005179 rule := testingModule.Rule("genProvenanceMetaData")
5180 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5181 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5182 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5183 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005184}
5185
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005186func TestPrebuiltApexName(t *testing.T) {
5187 testApex(t, `
5188 prebuilt_apex {
5189 name: "com.company.android.myapex",
5190 apex_name: "com.android.myapex",
5191 src: "company-myapex-arm.apex",
5192 }
5193 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5194
5195 testApex(t, `
5196 apex_set {
5197 name: "com.company.android.myapex",
5198 apex_name: "com.android.myapex",
5199 set: "company-myapex.apks",
5200 }
5201 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5202}
5203
5204func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5205 _ = android.GroupFixturePreparers(
5206 java.PrepareForTestWithJavaDefaultModules,
5207 PrepareForTestWithApexBuildComponents,
5208 android.FixtureWithRootAndroidBp(`
5209 platform_bootclasspath {
5210 name: "platform-bootclasspath",
5211 fragments: [
5212 {
5213 apex: "com.android.art",
5214 module: "art-bootclasspath-fragment",
5215 },
5216 ],
5217 }
5218
5219 prebuilt_apex {
5220 name: "com.company.android.art",
5221 apex_name: "com.android.art",
5222 src: "com.company.android.art-arm.apex",
5223 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5224 }
5225
5226 prebuilt_bootclasspath_fragment {
5227 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005228 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005229 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005230 hidden_api: {
5231 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5232 metadata: "my-bootclasspath-fragment/metadata.csv",
5233 index: "my-bootclasspath-fragment/index.csv",
5234 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5235 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5236 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005237 }
5238
5239 java_import {
5240 name: "core-oj",
5241 jars: ["prebuilt.jar"],
5242 }
5243 `),
5244 ).RunTest(t)
5245}
5246
Paul Duffin092153d2021-01-26 11:42:39 +00005247// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5248// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005249func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005250 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005251
Paul Duffin89886cb2021-02-05 16:44:03 +00005252 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005253 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005254 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005255 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005256 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005257 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005258 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5259 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5260 android.NormalizePathForTesting(dexJarBuildPath))
5261 }
5262
5263 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005264 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005265 // Make sure the import has been given the correct path to the dex jar.
5266 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5267 dexJarBuildPath := p.DexJarInstallPath()
5268 stem := android.RemoveOptionalPrebuiltPrefix(name)
5269 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5270 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5271 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005272 }
5273
Paul Duffin39853512021-02-26 11:09:39 +00005274 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005275 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005276 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005277 android.AssertArrayString(t, "Check if there is no source variant",
5278 []string{"android_common"},
5279 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005280 }
5281
5282 t.Run("prebuilt only", func(t *testing.T) {
5283 bp := `
5284 prebuilt_apex {
5285 name: "myapex",
5286 arch: {
5287 arm64: {
5288 src: "myapex-arm64.apex",
5289 },
5290 arm: {
5291 src: "myapex-arm.apex",
5292 },
5293 },
Paul Duffin39853512021-02-26 11:09:39 +00005294 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005295 }
5296
5297 java_import {
5298 name: "libfoo",
5299 jars: ["libfoo.jar"],
5300 }
Paul Duffin39853512021-02-26 11:09:39 +00005301
5302 java_sdk_library_import {
5303 name: "libbar",
5304 public: {
5305 jars: ["libbar.jar"],
5306 },
5307 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005308 `
5309
5310 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5311 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5312
Martin Stjernholm44825602021-09-17 01:44:12 +01005313 deapexerName := deapexerModuleName("myapex")
5314 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5315
Paul Duffinf6932af2021-02-26 18:21:56 +00005316 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005317 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005318 rule := deapexer.Rule("deapexer")
5319 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5320 t.Errorf("expected: %q, found: %q", expected, actual)
5321 }
5322
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005323 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005324 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005325 rule = prebuiltApex.Rule("android/soong/android.Cp")
5326 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5327 t.Errorf("expected: %q, found: %q", expected, actual)
5328 }
5329
Paul Duffin89886cb2021-02-05 16:44:03 +00005330 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005331 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005332
5333 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005334 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005335 })
5336
5337 t.Run("prebuilt with source preferred", func(t *testing.T) {
5338
5339 bp := `
5340 prebuilt_apex {
5341 name: "myapex",
5342 arch: {
5343 arm64: {
5344 src: "myapex-arm64.apex",
5345 },
5346 arm: {
5347 src: "myapex-arm.apex",
5348 },
5349 },
Paul Duffin39853512021-02-26 11:09:39 +00005350 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005351 }
5352
5353 java_import {
5354 name: "libfoo",
5355 jars: ["libfoo.jar"],
5356 }
5357
5358 java_library {
5359 name: "libfoo",
5360 }
Paul Duffin39853512021-02-26 11:09:39 +00005361
5362 java_sdk_library_import {
5363 name: "libbar",
5364 public: {
5365 jars: ["libbar.jar"],
5366 },
5367 }
5368
5369 java_sdk_library {
5370 name: "libbar",
5371 srcs: ["foo/bar/MyClass.java"],
5372 unsafe_ignore_missing_latest_api: true,
5373 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005374 `
5375
5376 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5377 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5378
Paul Duffin89886cb2021-02-05 16:44:03 +00005379 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005380 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005381 ensureNoSourceVariant(t, ctx, "libfoo")
5382
5383 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005384 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005385 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005386 })
5387
5388 t.Run("prebuilt preferred with source", func(t *testing.T) {
5389 bp := `
5390 prebuilt_apex {
5391 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005392 arch: {
5393 arm64: {
5394 src: "myapex-arm64.apex",
5395 },
5396 arm: {
5397 src: "myapex-arm.apex",
5398 },
5399 },
Paul Duffin39853512021-02-26 11:09:39 +00005400 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005401 }
5402
5403 java_import {
5404 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005405 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005406 jars: ["libfoo.jar"],
5407 }
5408
5409 java_library {
5410 name: "libfoo",
5411 }
Paul Duffin39853512021-02-26 11:09:39 +00005412
5413 java_sdk_library_import {
5414 name: "libbar",
5415 prefer: true,
5416 public: {
5417 jars: ["libbar.jar"],
5418 },
5419 }
5420
5421 java_sdk_library {
5422 name: "libbar",
5423 srcs: ["foo/bar/MyClass.java"],
5424 unsafe_ignore_missing_latest_api: true,
5425 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005426 `
5427
5428 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5429 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5430
Paul Duffin89886cb2021-02-05 16:44:03 +00005431 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005432 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005433 ensureNoSourceVariant(t, ctx, "libfoo")
5434
5435 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005436 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005437 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005438 })
5439}
5440
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005441func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005442 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005443 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005444 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5445 // is disabled.
5446 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5447 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005448
Paul Duffin37856732021-02-26 14:24:15 +00005449 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5450 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005451 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005452 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005453 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005454 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005455 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005456 foundLibfooJar = true
5457 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005458 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005459 }
5460 }
5461 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005462 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 +00005463 }
5464 }
5465
Paul Duffin40a3f652021-07-19 13:11:24 +01005466 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005467 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005468 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005469 var rule android.TestingBuildParams
5470
5471 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5472 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005473 }
5474
Paul Duffin40a3f652021-07-19 13:11:24 +01005475 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5476 t.Helper()
5477 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5478 var rule android.TestingBuildParams
5479
5480 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5481 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5482 }
5483
Paul Duffin89f570a2021-06-16 01:42:33 +01005484 fragment := java.ApexVariantReference{
5485 Apex: proptools.StringPtr("myapex"),
5486 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5487 }
5488
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005489 t.Run("prebuilt only", func(t *testing.T) {
5490 bp := `
5491 prebuilt_apex {
5492 name: "myapex",
5493 arch: {
5494 arm64: {
5495 src: "myapex-arm64.apex",
5496 },
5497 arm: {
5498 src: "myapex-arm.apex",
5499 },
5500 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005501 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5502 }
5503
5504 prebuilt_bootclasspath_fragment {
5505 name: "my-bootclasspath-fragment",
5506 contents: ["libfoo", "libbar"],
5507 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005508 hidden_api: {
5509 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5510 metadata: "my-bootclasspath-fragment/metadata.csv",
5511 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005512 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5513 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5514 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005515 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005516 }
5517
5518 java_import {
5519 name: "libfoo",
5520 jars: ["libfoo.jar"],
5521 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005522 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005523 }
Paul Duffin37856732021-02-26 14:24:15 +00005524
5525 java_sdk_library_import {
5526 name: "libbar",
5527 public: {
5528 jars: ["libbar.jar"],
5529 },
5530 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005531 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005532 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005533 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005534 `
5535
Paul Duffin89f570a2021-06-16 01:42:33 +01005536 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005537 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5538 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005539
Paul Duffin537ea3d2021-05-14 10:38:00 +01005540 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005541 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005542 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005543 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005544 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005545 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 +01005546 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005547 })
5548
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005549 t.Run("apex_set only", func(t *testing.T) {
5550 bp := `
5551 apex_set {
5552 name: "myapex",
5553 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005554 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005555 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005556 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5557 }
5558
5559 java_import {
5560 name: "myjavalib",
5561 jars: ["myjavalib.jar"],
5562 apex_available: ["myapex"],
5563 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005564 }
5565
5566 prebuilt_bootclasspath_fragment {
5567 name: "my-bootclasspath-fragment",
5568 contents: ["libfoo", "libbar"],
5569 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005570 hidden_api: {
5571 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5572 metadata: "my-bootclasspath-fragment/metadata.csv",
5573 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005574 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5575 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5576 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005577 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005578 }
5579
Liz Kammer2dc72442023-04-20 10:10:48 -04005580 prebuilt_systemserverclasspath_fragment {
5581 name: "my-systemserverclasspath-fragment",
5582 contents: ["libbaz"],
5583 apex_available: ["myapex"],
5584 }
5585
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005586 java_import {
5587 name: "libfoo",
5588 jars: ["libfoo.jar"],
5589 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005590 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005591 }
5592
5593 java_sdk_library_import {
5594 name: "libbar",
5595 public: {
5596 jars: ["libbar.jar"],
5597 },
5598 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005599 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005600 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005601 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005602
5603 java_sdk_library_import {
5604 name: "libbaz",
5605 public: {
5606 jars: ["libbaz.jar"],
5607 },
5608 apex_available: ["myapex"],
5609 shared_library: false,
5610 permitted_packages: ["baz"],
5611 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005612 `
5613
Paul Duffin89f570a2021-06-16 01:42:33 +01005614 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005615 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5616 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5617
Paul Duffin537ea3d2021-05-14 10:38:00 +01005618 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005619 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005620 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005621 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005622 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005623 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 +01005624 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005625
5626 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5627
5628 overrideNames := []string{
5629 "",
5630 "myjavalib.myapex",
5631 "libfoo.myapex",
5632 "libbar.myapex",
5633 "libbaz.myapex",
5634 }
5635 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5636 for i, e := range mkEntries {
5637 g := e.OverrideName
5638 if w := overrideNames[i]; w != g {
5639 t.Errorf("Expected override name %q, got %q", w, g)
5640 }
5641 }
5642
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005643 })
5644
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005645 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5646 bp := `
5647 prebuilt_apex {
5648 name: "myapex",
5649 arch: {
5650 arm64: {
5651 src: "myapex-arm64.apex",
5652 },
5653 arm: {
5654 src: "myapex-arm.apex",
5655 },
5656 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005657 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5658 }
5659
5660 prebuilt_bootclasspath_fragment {
5661 name: "my-bootclasspath-fragment",
5662 contents: ["libfoo", "libbar"],
5663 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005664 hidden_api: {
5665 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5666 metadata: "my-bootclasspath-fragment/metadata.csv",
5667 index: "my-bootclasspath-fragment/index.csv",
5668 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5669 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5670 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005671 }
5672
5673 java_import {
5674 name: "libfoo",
5675 jars: ["libfoo.jar"],
5676 apex_available: ["myapex"],
5677 }
5678
5679 java_library {
5680 name: "libfoo",
5681 srcs: ["foo/bar/MyClass.java"],
5682 apex_available: ["myapex"],
5683 }
Paul Duffin37856732021-02-26 14:24:15 +00005684
5685 java_sdk_library_import {
5686 name: "libbar",
5687 public: {
5688 jars: ["libbar.jar"],
5689 },
5690 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005691 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005692 }
5693
5694 java_sdk_library {
5695 name: "libbar",
5696 srcs: ["foo/bar/MyClass.java"],
5697 unsafe_ignore_missing_latest_api: true,
5698 apex_available: ["myapex"],
5699 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005700 `
5701
5702 // In this test the source (java_library) libfoo is active since the
5703 // prebuilt (java_import) defaults to prefer:false. However the
5704 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5705 // find the dex boot jar in it. We either need to disable the source libfoo
5706 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005707 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005708 // dexbootjar check is skipped if AllowMissingDependencies is true
5709 preparerAllowMissingDeps := android.GroupFixturePreparers(
5710 preparer,
5711 android.PrepareForTestWithAllowMissingDependencies,
5712 )
5713 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005714 })
5715
5716 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5717 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005718 apex {
5719 name: "myapex",
5720 key: "myapex.key",
5721 updatable: false,
5722 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5723 }
5724
5725 apex_key {
5726 name: "myapex.key",
5727 public_key: "testkey.avbpubkey",
5728 private_key: "testkey.pem",
5729 }
5730
5731 bootclasspath_fragment {
5732 name: "my-bootclasspath-fragment",
5733 contents: ["libfoo", "libbar"],
5734 apex_available: ["myapex"],
5735 hidden_api: {
5736 split_packages: ["*"],
5737 },
5738 }
5739
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005740 prebuilt_apex {
5741 name: "myapex",
5742 arch: {
5743 arm64: {
5744 src: "myapex-arm64.apex",
5745 },
5746 arm: {
5747 src: "myapex-arm.apex",
5748 },
5749 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005750 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5751 }
5752
5753 prebuilt_bootclasspath_fragment {
5754 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005755 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005756 contents: ["libfoo", "libbar"],
5757 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005758 hidden_api: {
5759 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5760 metadata: "my-bootclasspath-fragment/metadata.csv",
5761 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005762 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5763 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5764 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005765 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005766 }
5767
5768 java_import {
5769 name: "libfoo",
5770 prefer: true,
5771 jars: ["libfoo.jar"],
5772 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005773 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005774 }
5775
5776 java_library {
5777 name: "libfoo",
5778 srcs: ["foo/bar/MyClass.java"],
5779 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005780 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005781 }
Paul Duffin37856732021-02-26 14:24:15 +00005782
5783 java_sdk_library_import {
5784 name: "libbar",
5785 prefer: true,
5786 public: {
5787 jars: ["libbar.jar"],
5788 },
5789 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005790 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005791 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005792 }
5793
5794 java_sdk_library {
5795 name: "libbar",
5796 srcs: ["foo/bar/MyClass.java"],
5797 unsafe_ignore_missing_latest_api: true,
5798 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005799 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005800 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005801 `
5802
Paul Duffin89f570a2021-06-16 01:42:33 +01005803 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005804 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5805 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005806
Paul Duffin537ea3d2021-05-14 10:38:00 +01005807 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005808 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005809 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005810 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005811 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005812 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 +01005813 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005814 })
5815
5816 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5817 bp := `
5818 apex {
5819 name: "myapex",
5820 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005821 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005822 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005823 }
5824
5825 apex_key {
5826 name: "myapex.key",
5827 public_key: "testkey.avbpubkey",
5828 private_key: "testkey.pem",
5829 }
5830
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005831 bootclasspath_fragment {
5832 name: "my-bootclasspath-fragment",
5833 contents: ["libfoo", "libbar"],
5834 apex_available: ["myapex"],
5835 hidden_api: {
5836 split_packages: ["*"],
5837 },
5838 }
5839
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005840 prebuilt_apex {
5841 name: "myapex",
5842 arch: {
5843 arm64: {
5844 src: "myapex-arm64.apex",
5845 },
5846 arm: {
5847 src: "myapex-arm.apex",
5848 },
5849 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005850 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5851 }
5852
5853 prebuilt_bootclasspath_fragment {
5854 name: "my-bootclasspath-fragment",
5855 contents: ["libfoo", "libbar"],
5856 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005857 hidden_api: {
5858 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5859 metadata: "my-bootclasspath-fragment/metadata.csv",
5860 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005861 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5862 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5863 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005864 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005865 }
5866
5867 java_import {
5868 name: "libfoo",
5869 jars: ["libfoo.jar"],
5870 apex_available: ["myapex"],
5871 }
5872
5873 java_library {
5874 name: "libfoo",
5875 srcs: ["foo/bar/MyClass.java"],
5876 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005877 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005878 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005879 }
Paul Duffin37856732021-02-26 14:24:15 +00005880
5881 java_sdk_library_import {
5882 name: "libbar",
5883 public: {
5884 jars: ["libbar.jar"],
5885 },
5886 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005887 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005888 }
5889
5890 java_sdk_library {
5891 name: "libbar",
5892 srcs: ["foo/bar/MyClass.java"],
5893 unsafe_ignore_missing_latest_api: true,
5894 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005895 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005896 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005897 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005898 `
5899
Paul Duffin89f570a2021-06-16 01:42:33 +01005900 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005901 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5902 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005903
Paul Duffin537ea3d2021-05-14 10:38:00 +01005904 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005905 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005906 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5907 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005908 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5909 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 +01005910 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005911 })
5912
5913 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5914 bp := `
5915 apex {
5916 name: "myapex",
5917 enabled: false,
5918 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005919 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005920 }
5921
5922 apex_key {
5923 name: "myapex.key",
5924 public_key: "testkey.avbpubkey",
5925 private_key: "testkey.pem",
5926 }
5927
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005928 bootclasspath_fragment {
5929 name: "my-bootclasspath-fragment",
5930 enabled: false,
5931 contents: ["libfoo", "libbar"],
5932 apex_available: ["myapex"],
5933 hidden_api: {
5934 split_packages: ["*"],
5935 },
5936 }
5937
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005938 prebuilt_apex {
5939 name: "myapex",
5940 arch: {
5941 arm64: {
5942 src: "myapex-arm64.apex",
5943 },
5944 arm: {
5945 src: "myapex-arm.apex",
5946 },
5947 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005948 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5949 }
5950
5951 prebuilt_bootclasspath_fragment {
5952 name: "my-bootclasspath-fragment",
5953 contents: ["libfoo", "libbar"],
5954 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005955 hidden_api: {
5956 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5957 metadata: "my-bootclasspath-fragment/metadata.csv",
5958 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005959 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5960 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5961 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005962 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005963 }
5964
5965 java_import {
5966 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005967 jars: ["libfoo.jar"],
5968 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005969 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005970 }
5971
5972 java_library {
5973 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005974 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005975 srcs: ["foo/bar/MyClass.java"],
5976 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005977 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005978 }
Paul Duffin37856732021-02-26 14:24:15 +00005979
5980 java_sdk_library_import {
5981 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005982 public: {
5983 jars: ["libbar.jar"],
5984 },
5985 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005986 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005987 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005988 }
5989
5990 java_sdk_library {
5991 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005992 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005993 srcs: ["foo/bar/MyClass.java"],
5994 unsafe_ignore_missing_latest_api: true,
5995 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005996 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005997 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005998 `
5999
Paul Duffin89f570a2021-06-16 01:42:33 +01006000 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006001 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6002 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006003
Paul Duffin537ea3d2021-05-14 10:38:00 +01006004 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006005 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006006 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006007 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006008 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006009 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 +01006010 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006011 })
6012}
6013
Roland Levillain630846d2019-06-26 12:48:34 +01006014func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006015 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006016 apex_test {
6017 name: "myapex",
6018 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006019 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006020 tests: [
6021 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006022 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006023 ],
6024 }
6025
6026 apex_key {
6027 name: "myapex.key",
6028 public_key: "testkey.avbpubkey",
6029 private_key: "testkey.pem",
6030 }
6031
Liz Kammer1c14a212020-05-12 15:26:55 -07006032 filegroup {
6033 name: "fg",
6034 srcs: [
6035 "baz",
6036 "bar/baz"
6037 ],
6038 }
6039
Roland Levillain630846d2019-06-26 12:48:34 +01006040 cc_test {
6041 name: "mytest",
6042 gtest: false,
6043 srcs: ["mytest.cpp"],
6044 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006045 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006046 system_shared_libs: [],
6047 static_executable: true,
6048 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006049 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006050 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006051
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006052 cc_library {
6053 name: "mylib",
6054 srcs: ["mylib.cpp"],
6055 system_shared_libs: [],
6056 stl: "none",
6057 }
6058
Liz Kammer5bd365f2020-05-27 15:15:11 -07006059 filegroup {
6060 name: "fg2",
6061 srcs: [
6062 "testdata/baz"
6063 ],
6064 }
6065
Roland Levillain9b5fde92019-06-28 15:41:19 +01006066 cc_test {
6067 name: "mytests",
6068 gtest: false,
6069 srcs: [
6070 "mytest1.cpp",
6071 "mytest2.cpp",
6072 "mytest3.cpp",
6073 ],
6074 test_per_src: true,
6075 relative_install_path: "test",
6076 system_shared_libs: [],
6077 static_executable: true,
6078 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006079 data: [
6080 ":fg",
6081 ":fg2",
6082 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006083 }
Roland Levillain630846d2019-06-26 12:48:34 +01006084 `)
6085
Jooyung Hana0503a52023-08-23 13:12:50 +09006086 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006087 copyCmds := apexRule.Args["copy_commands"]
6088
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006089 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006090 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006091 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006092
Liz Kammer1c14a212020-05-12 15:26:55 -07006093 //Ensure that test data are copied into apex.
6094 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6095 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6096
Roland Levillain9b5fde92019-06-28 15:41:19 +01006097 // Ensure that test deps built with `test_per_src` are copied into apex.
6098 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6099 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6100 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006101
6102 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006103 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006104 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006105 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006106 prefix := "TARGET_"
6107 var builder strings.Builder
6108 data.Custom(&builder, name, prefix, "", data)
6109 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006110 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6111 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6112 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6113 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006114 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006115}
6116
Jooyung Hand48f3c32019-08-23 11:18:57 +09006117func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6118 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6119 apex {
6120 name: "myapex",
6121 key: "myapex.key",
6122 native_shared_libs: ["libfoo"],
6123 }
6124
6125 apex_key {
6126 name: "myapex.key",
6127 public_key: "testkey.avbpubkey",
6128 private_key: "testkey.pem",
6129 }
6130
6131 cc_library {
6132 name: "libfoo",
6133 stl: "none",
6134 system_shared_libs: [],
6135 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006136 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006137 }
6138 `)
6139 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6140 apex {
6141 name: "myapex",
6142 key: "myapex.key",
6143 java_libs: ["myjar"],
6144 }
6145
6146 apex_key {
6147 name: "myapex.key",
6148 public_key: "testkey.avbpubkey",
6149 private_key: "testkey.pem",
6150 }
6151
6152 java_library {
6153 name: "myjar",
6154 srcs: ["foo/bar/MyClass.java"],
6155 sdk_version: "none",
6156 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006157 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006158 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006159 }
6160 `)
6161}
6162
Bill Peckhama41a6962021-01-11 10:58:54 -08006163func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006164 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006165 apex {
6166 name: "myapex",
6167 key: "myapex.key",
6168 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006169 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006170 }
6171
6172 apex_key {
6173 name: "myapex.key",
6174 public_key: "testkey.avbpubkey",
6175 private_key: "testkey.pem",
6176 }
6177
6178 java_import {
6179 name: "myjavaimport",
6180 apex_available: ["myapex"],
6181 jars: ["my.jar"],
6182 compile_dex: true,
6183 }
6184 `)
6185
Jooyung Hana0503a52023-08-23 13:12:50 +09006186 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006187 apexRule := module.Rule("apexRule")
6188 copyCmds := apexRule.Args["copy_commands"]
6189 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6190}
6191
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006192func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006193 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006194 apex {
6195 name: "myapex",
6196 key: "myapex.key",
6197 apps: [
6198 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006199 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006200 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006201 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006202 }
6203
6204 apex_key {
6205 name: "myapex.key",
6206 public_key: "testkey.avbpubkey",
6207 private_key: "testkey.pem",
6208 }
6209
6210 android_app {
6211 name: "AppFoo",
6212 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006213 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006214 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006215 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006216 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006217 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006218 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006219
6220 android_app {
6221 name: "AppFooPriv",
6222 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006223 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006224 system_modules: "none",
6225 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006226 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006227 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006228 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006229 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006230
6231 cc_library_shared {
6232 name: "libjni",
6233 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006234 shared_libs: ["libfoo"],
6235 stl: "none",
6236 system_shared_libs: [],
6237 apex_available: [ "myapex" ],
6238 sdk_version: "current",
6239 }
6240
6241 cc_library_shared {
6242 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006243 stl: "none",
6244 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006245 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006246 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006247 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006248 `)
6249
Jooyung Hana0503a52023-08-23 13:12:50 +09006250 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006251 apexRule := module.Rule("apexRule")
6252 copyCmds := apexRule.Args["copy_commands"]
6253
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006254 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6255 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006256 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006257
Colin Crossaede88c2020-08-11 12:17:01 -07006258 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006259 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006260 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006261 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006262 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006263 // JNI libraries including transitive deps are
6264 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006265 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006266 // ... embedded inside APK (jnilibs.zip)
6267 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6268 // ... and not directly inside the APEX
6269 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6270 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006271
6272 apexBundle := module.Module().(*apexBundle)
6273 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6274 var builder strings.Builder
6275 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6276 androidMk := builder.String()
6277 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6278 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6279 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6280 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6281 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6282 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 +01006283}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006284
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006285func TestApexWithAppImportBuildId(t *testing.T) {
6286 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6287 for _, id := range invalidBuildIds {
6288 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6289 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6290 variables.BuildId = proptools.StringPtr(id)
6291 })
6292 testApexError(t, message, `apex {
6293 name: "myapex",
6294 key: "myapex.key",
6295 apps: ["AppFooPrebuilt"],
6296 updatable: false,
6297 }
6298
6299 apex_key {
6300 name: "myapex.key",
6301 public_key: "testkey.avbpubkey",
6302 private_key: "testkey.pem",
6303 }
6304
6305 android_app_import {
6306 name: "AppFooPrebuilt",
6307 apk: "PrebuiltAppFoo.apk",
6308 presigned: true,
6309 apex_available: ["myapex"],
6310 }
6311 `, fixture)
6312 }
6313}
6314
Dario Frenicde2a032019-10-27 00:29:22 +01006315func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006316 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006317 apex {
6318 name: "myapex",
6319 key: "myapex.key",
6320 apps: [
6321 "AppFooPrebuilt",
6322 "AppFooPrivPrebuilt",
6323 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006324 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006325 }
6326
6327 apex_key {
6328 name: "myapex.key",
6329 public_key: "testkey.avbpubkey",
6330 private_key: "testkey.pem",
6331 }
6332
6333 android_app_import {
6334 name: "AppFooPrebuilt",
6335 apk: "PrebuiltAppFoo.apk",
6336 presigned: true,
6337 dex_preopt: {
6338 enabled: false,
6339 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006340 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006341 }
6342
6343 android_app_import {
6344 name: "AppFooPrivPrebuilt",
6345 apk: "PrebuiltAppFooPriv.apk",
6346 privileged: true,
6347 presigned: true,
6348 dex_preopt: {
6349 enabled: false,
6350 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006351 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006352 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006353 }
6354 `)
6355
Jooyung Hana0503a52023-08-23 13:12:50 +09006356 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006357 apexRule := module.Rule("apexRule")
6358 copyCmds := apexRule.Args["copy_commands"]
6359
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006360 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6361 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006362}
6363
6364func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006365 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006366 apex {
6367 name: "myapex",
6368 key: "myapex.key",
6369 apps: [
6370 "AppFoo",
6371 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006372 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006373 }
6374
6375 apex_key {
6376 name: "myapex.key",
6377 public_key: "testkey.avbpubkey",
6378 private_key: "testkey.pem",
6379 }
6380
6381 android_app {
6382 name: "AppFoo",
6383 srcs: ["foo/bar/MyClass.java"],
6384 sdk_version: "none",
6385 system_modules: "none",
6386 apex_available: [ "myapex" ],
6387 }
6388
6389 android_app_import {
6390 name: "AppFoo",
6391 apk: "AppFooPrebuilt.apk",
6392 filename: "AppFooPrebuilt.apk",
6393 presigned: true,
6394 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006395 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006396 }
6397 `, withFiles(map[string][]byte{
6398 "AppFooPrebuilt.apk": nil,
6399 }))
6400
Jooyung Hana0503a52023-08-23 13:12:50 +09006401 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006402 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006403 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006404}
6405
Dario Freni6f3937c2019-12-20 22:58:03 +00006406func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006407 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006408 apex {
6409 name: "myapex",
6410 key: "myapex.key",
6411 apps: [
6412 "TesterHelpAppFoo",
6413 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006414 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006415 }
6416
6417 apex_key {
6418 name: "myapex.key",
6419 public_key: "testkey.avbpubkey",
6420 private_key: "testkey.pem",
6421 }
6422
6423 android_test_helper_app {
6424 name: "TesterHelpAppFoo",
6425 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006426 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006427 }
6428
6429 `)
6430
Jooyung Hana0503a52023-08-23 13:12:50 +09006431 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006432 apexRule := module.Rule("apexRule")
6433 copyCmds := apexRule.Args["copy_commands"]
6434
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006435 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006436}
6437
Jooyung Han18020ea2019-11-13 10:50:48 +09006438func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6439 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006440 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006441 apex {
6442 name: "myapex",
6443 key: "myapex.key",
6444 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006445 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006446 }
6447
6448 apex_key {
6449 name: "myapex.key",
6450 public_key: "testkey.avbpubkey",
6451 private_key: "testkey.pem",
6452 }
6453
6454 apex {
6455 name: "otherapex",
6456 key: "myapex.key",
6457 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006458 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006459 }
6460
6461 cc_defaults {
6462 name: "libfoo-defaults",
6463 apex_available: ["otherapex"],
6464 }
6465
6466 cc_library {
6467 name: "libfoo",
6468 defaults: ["libfoo-defaults"],
6469 stl: "none",
6470 system_shared_libs: [],
6471 }`)
6472}
6473
Paul Duffine52e66f2020-03-30 17:54:29 +01006474func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006475 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006476 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006477 apex {
6478 name: "myapex",
6479 key: "myapex.key",
6480 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006481 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006482 }
6483
6484 apex_key {
6485 name: "myapex.key",
6486 public_key: "testkey.avbpubkey",
6487 private_key: "testkey.pem",
6488 }
6489
6490 apex {
6491 name: "otherapex",
6492 key: "otherapex.key",
6493 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006494 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006495 }
6496
6497 apex_key {
6498 name: "otherapex.key",
6499 public_key: "testkey.avbpubkey",
6500 private_key: "testkey.pem",
6501 }
6502
6503 cc_library {
6504 name: "libfoo",
6505 stl: "none",
6506 system_shared_libs: [],
6507 apex_available: ["otherapex"],
6508 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006509}
Jiyong Park127b40b2019-09-30 16:04:35 +09006510
Paul Duffine52e66f2020-03-30 17:54:29 +01006511func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006512 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006513 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006514.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006515.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006516.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006517.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006518.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006519.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006520 apex {
6521 name: "myapex",
6522 key: "myapex.key",
6523 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006524 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006525 }
6526
6527 apex_key {
6528 name: "myapex.key",
6529 public_key: "testkey.avbpubkey",
6530 private_key: "testkey.pem",
6531 }
6532
Jiyong Park127b40b2019-09-30 16:04:35 +09006533 cc_library {
6534 name: "libfoo",
6535 stl: "none",
6536 shared_libs: ["libbar"],
6537 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006538 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006539 }
6540
6541 cc_library {
6542 name: "libbar",
6543 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006544 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006545 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006546 apex_available: ["myapex"],
6547 }
6548
6549 cc_library {
6550 name: "libbaz",
6551 stl: "none",
6552 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006553 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006554}
Jiyong Park127b40b2019-09-30 16:04:35 +09006555
Liz Kammer5f108fa2023-05-11 14:33:17 -04006556func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6557 testApex(t, `
6558 apex {
6559 name: "myapex",
6560 key: "myapex.key",
6561 native_shared_libs: ["libfoo"],
6562 updatable: false,
6563 }
6564
6565 apex_key {
6566 name: "myapex.key",
6567 public_key: "testkey.avbpubkey",
6568 private_key: "testkey.pem",
6569 }
6570
6571 cc_library {
6572 name: "libfoo",
6573 stl: "none",
6574 static_libs: ["libbar"],
6575 system_shared_libs: [],
6576 apex_available: ["myapex"],
6577 }
6578
6579 cc_library {
6580 name: "libbar",
6581 stl: "none",
6582 shared_libs: ["libbaz"],
6583 system_shared_libs: [],
6584 apex_available: ["myapex"],
6585 }
6586
6587 cc_library {
6588 name: "libbaz",
6589 stl: "none",
6590 system_shared_libs: [],
6591 }`)
6592
6593 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6594 apex {
6595 name: "myapex",
6596 key: "myapex.key",
6597 native_shared_libs: ["libfoo"],
6598 updatable: false,
6599 }
6600
6601 apex_key {
6602 name: "myapex.key",
6603 public_key: "testkey.avbpubkey",
6604 private_key: "testkey.pem",
6605 }
6606
6607 cc_library {
6608 name: "libfoo",
6609 stl: "none",
6610 static_libs: ["libbar"],
6611 system_shared_libs: [],
6612 apex_available: ["myapex"],
6613 }
6614
6615 cc_library {
6616 name: "libbar",
6617 stl: "none",
6618 system_shared_libs: [],
6619 }`)
6620}
6621
Paul Duffine52e66f2020-03-30 17:54:29 +01006622func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006623 testApexError(t, "\"otherapex\" is not a valid module name", `
6624 apex {
6625 name: "myapex",
6626 key: "myapex.key",
6627 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006628 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006629 }
6630
6631 apex_key {
6632 name: "myapex.key",
6633 public_key: "testkey.avbpubkey",
6634 private_key: "testkey.pem",
6635 }
6636
6637 cc_library {
6638 name: "libfoo",
6639 stl: "none",
6640 system_shared_libs: [],
6641 apex_available: ["otherapex"],
6642 }`)
6643
Paul Duffine52e66f2020-03-30 17:54:29 +01006644 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006645 apex {
6646 name: "myapex",
6647 key: "myapex.key",
6648 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006649 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006650 }
6651
6652 apex_key {
6653 name: "myapex.key",
6654 public_key: "testkey.avbpubkey",
6655 private_key: "testkey.pem",
6656 }
6657
6658 cc_library {
6659 name: "libfoo",
6660 stl: "none",
6661 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006662 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006663 apex_available: ["myapex"],
6664 }
6665
6666 cc_library {
6667 name: "libbar",
6668 stl: "none",
6669 system_shared_libs: [],
6670 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006671 }
6672
6673 cc_library {
6674 name: "libbaz",
6675 stl: "none",
6676 system_shared_libs: [],
6677 stubs: {
6678 versions: ["10", "20", "30"],
6679 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006680 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006681}
Jiyong Park127b40b2019-09-30 16:04:35 +09006682
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006683func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6684 t.Run("negative variant_version produces error", func(t *testing.T) {
6685 testApexError(t, "expected an integer between 0-9; got -1", `
6686 apex {
6687 name: "myapex",
6688 key: "myapex.key",
6689 apex_available_name: "com.android.foo",
6690 variant_version: "-1",
6691 updatable: false,
6692 }
6693 apex_key {
6694 name: "myapex.key",
6695 public_key: "testkey.avbpubkey",
6696 private_key: "testkey.pem",
6697 }
6698 `)
6699 })
6700
6701 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6702 testApexError(t, "expected an integer between 0-9; got 10", `
6703 apex {
6704 name: "myapex",
6705 key: "myapex.key",
6706 apex_available_name: "com.android.foo",
6707 variant_version: "10",
6708 updatable: false,
6709 }
6710 apex_key {
6711 name: "myapex.key",
6712 public_key: "testkey.avbpubkey",
6713 private_key: "testkey.pem",
6714 }
6715 `)
6716 })
6717}
6718
6719func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6720 context := android.GroupFixturePreparers(
6721 android.PrepareForIntegrationTestWithAndroid,
6722 PrepareForTestWithApexBuildComponents,
6723 android.FixtureMergeMockFs(android.MockFS{
6724 "system/sepolicy/apex/foo-file_contexts": nil,
6725 "system/sepolicy/apex/bar-file_contexts": nil,
6726 }),
6727 )
6728 result := context.RunTestWithBp(t, `
6729 apex {
6730 name: "foo",
6731 key: "myapex.key",
6732 apex_available_name: "com.android.foo",
6733 variant_version: "0",
6734 updatable: false,
6735 }
6736 apex {
6737 name: "bar",
6738 key: "myapex.key",
6739 apex_available_name: "com.android.foo",
6740 variant_version: "3",
6741 updatable: false,
6742 }
6743 apex_key {
6744 name: "myapex.key",
6745 public_key: "testkey.avbpubkey",
6746 private_key: "testkey.pem",
6747 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006748 override_apex {
6749 name: "myoverrideapex",
6750 base: "bar",
6751 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006752 `)
6753
Jooyung Hana0503a52023-08-23 13:12:50 +09006754 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006755 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6756 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6757 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6758 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6759 }
6760
Jooyung Hana0503a52023-08-23 13:12:50 +09006761 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006762 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6763 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6764 barActualDefaultVersion := barManifestRule.Args["default_version"]
6765 if barActualDefaultVersion != barExpectedDefaultVersion {
6766 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6767 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006768
Jooyung Hana0503a52023-08-23 13:12:50 +09006769 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006770 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6771 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6772 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6773 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006774}
6775
Sam Delmericoca816532023-06-02 14:09:50 -04006776func TestApexAvailable_ApexAvailableName(t *testing.T) {
6777 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6778 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6779 apex {
6780 name: "myapex_sminus",
6781 key: "myapex.key",
6782 apps: ["AppFoo"],
6783 apex_available_name: "myapex",
6784 updatable: false,
6785 }
6786 apex {
6787 name: "myapex",
6788 key: "myapex.key",
6789 apps: ["AppFoo"],
6790 updatable: false,
6791 }
6792 apex_key {
6793 name: "myapex.key",
6794 public_key: "testkey.avbpubkey",
6795 private_key: "testkey.pem",
6796 }
6797 android_app {
6798 name: "AppFoo",
6799 srcs: ["foo/bar/MyClass.java"],
6800 sdk_version: "none",
6801 system_modules: "none",
6802 apex_available: [ "myapex_sminus" ],
6803 }`,
6804 android.FixtureMergeMockFs(android.MockFS{
6805 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6806 }),
6807 )
6808 })
6809
6810 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6811 testApex(t, `
6812 apex {
6813 name: "myapex_sminus",
6814 key: "myapex.key",
6815 apps: ["AppFoo"],
6816 apex_available_name: "myapex",
6817 updatable: false,
6818 }
6819 apex {
6820 name: "myapex",
6821 key: "myapex.key",
6822 apps: ["AppFoo"],
6823 updatable: false,
6824 }
6825 apex_key {
6826 name: "myapex.key",
6827 public_key: "testkey.avbpubkey",
6828 private_key: "testkey.pem",
6829 }
6830 android_app {
6831 name: "AppFoo",
6832 srcs: ["foo/bar/MyClass.java"],
6833 sdk_version: "none",
6834 system_modules: "none",
6835 apex_available: [ "myapex" ],
6836 }`,
6837 android.FixtureMergeMockFs(android.MockFS{
6838 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6839 }),
6840 )
6841 })
6842
6843 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6844 testApex(t, `
6845 override_apex {
6846 name: "myoverrideapex_sminus",
6847 base: "myapex_sminus",
6848 key: "myapex.key",
6849 apps: ["AppFooOverride"],
6850 }
6851 override_apex {
6852 name: "myoverrideapex",
6853 base: "myapex",
6854 key: "myapex.key",
6855 apps: ["AppFooOverride"],
6856 }
6857 apex {
6858 name: "myapex_sminus",
6859 key: "myapex.key",
6860 apps: ["AppFoo"],
6861 apex_available_name: "myapex",
6862 updatable: false,
6863 }
6864 apex {
6865 name: "myapex",
6866 key: "myapex.key",
6867 apps: ["AppFoo"],
6868 updatable: false,
6869 }
6870 apex_key {
6871 name: "myapex.key",
6872 public_key: "testkey.avbpubkey",
6873 private_key: "testkey.pem",
6874 }
6875 android_app {
6876 name: "AppFooOverride",
6877 srcs: ["foo/bar/MyClass.java"],
6878 sdk_version: "none",
6879 system_modules: "none",
6880 apex_available: [ "myapex" ],
6881 }
6882 android_app {
6883 name: "AppFoo",
6884 srcs: ["foo/bar/MyClass.java"],
6885 sdk_version: "none",
6886 system_modules: "none",
6887 apex_available: [ "myapex" ],
6888 }`,
6889 android.FixtureMergeMockFs(android.MockFS{
6890 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6891 }),
6892 )
6893 })
6894}
6895
6896func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6897 context := android.GroupFixturePreparers(
6898 android.PrepareForIntegrationTestWithAndroid,
6899 PrepareForTestWithApexBuildComponents,
6900 java.PrepareForTestWithDexpreopt,
6901 android.FixtureMergeMockFs(android.MockFS{
6902 "system/sepolicy/apex/myapex-file_contexts": nil,
6903 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6904 }),
6905 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6906 variables.BuildId = proptools.StringPtr("buildid")
6907 }),
6908 )
6909 context.RunTestWithBp(t, `
6910 override_apex {
6911 name: "myoverrideapex_sminus",
6912 base: "myapex_sminus",
6913 }
6914 override_apex {
6915 name: "myoverrideapex",
6916 base: "myapex",
6917 }
6918 apex {
6919 name: "myapex",
6920 key: "myapex.key",
6921 apps: ["AppFoo"],
6922 updatable: false,
6923 }
6924 apex {
6925 name: "myapex_sminus",
6926 apex_available_name: "myapex",
6927 key: "myapex.key",
6928 apps: ["AppFoo_sminus"],
6929 updatable: false,
6930 }
6931 apex_key {
6932 name: "myapex.key",
6933 public_key: "testkey.avbpubkey",
6934 private_key: "testkey.pem",
6935 }
6936 android_app {
6937 name: "AppFoo",
6938 srcs: ["foo/bar/MyClass.java"],
6939 sdk_version: "none",
6940 system_modules: "none",
6941 apex_available: [ "myapex" ],
6942 }
6943 android_app {
6944 name: "AppFoo_sminus",
6945 srcs: ["foo/bar/MyClass.java"],
6946 sdk_version: "none",
6947 min_sdk_version: "29",
6948 system_modules: "none",
6949 apex_available: [ "myapex" ],
6950 }`)
6951}
6952
Jiyong Park89e850a2020-04-07 16:37:39 +09006953func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006954 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006955 apex {
6956 name: "myapex",
6957 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006958 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006959 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006960 }
6961
6962 apex_key {
6963 name: "myapex.key",
6964 public_key: "testkey.avbpubkey",
6965 private_key: "testkey.pem",
6966 }
6967
6968 cc_library {
6969 name: "libfoo",
6970 stl: "none",
6971 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006972 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006973 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006974 }
6975
6976 cc_library {
6977 name: "libfoo2",
6978 stl: "none",
6979 system_shared_libs: [],
6980 shared_libs: ["libbaz"],
6981 apex_available: ["//apex_available:platform"],
6982 }
6983
6984 cc_library {
6985 name: "libbar",
6986 stl: "none",
6987 system_shared_libs: [],
6988 apex_available: ["myapex"],
6989 }
6990
6991 cc_library {
6992 name: "libbaz",
6993 stl: "none",
6994 system_shared_libs: [],
6995 apex_available: ["myapex"],
6996 stubs: {
6997 versions: ["1"],
6998 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006999 }`)
7000
Jiyong Park89e850a2020-04-07 16:37:39 +09007001 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7002 // because it depends on libbar which isn't available to platform
7003 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7004 if libfoo.NotAvailableForPlatform() != true {
7005 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7006 }
7007
7008 // libfoo2 however can be available to platform because it depends on libbaz which provides
7009 // stubs
7010 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7011 if libfoo2.NotAvailableForPlatform() == true {
7012 t.Errorf("%q should be available to platform", libfoo2.String())
7013 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007014}
Jiyong Parka90ca002019-10-07 15:47:24 +09007015
Paul Duffine52e66f2020-03-30 17:54:29 +01007016func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007017 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007018 apex {
7019 name: "myapex",
7020 key: "myapex.key",
7021 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007022 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007023 }
7024
7025 apex_key {
7026 name: "myapex.key",
7027 public_key: "testkey.avbpubkey",
7028 private_key: "testkey.pem",
7029 }
7030
7031 cc_library {
7032 name: "libfoo",
7033 stl: "none",
7034 system_shared_libs: [],
7035 apex_available: ["myapex"],
7036 static: {
7037 apex_available: ["//apex_available:platform"],
7038 },
7039 }`)
7040
Jiyong Park89e850a2020-04-07 16:37:39 +09007041 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7042 if libfooShared.NotAvailableForPlatform() != true {
7043 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7044 }
7045 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7046 if libfooStatic.NotAvailableForPlatform() != false {
7047 t.Errorf("%q should be available to platform", libfooStatic.String())
7048 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007049}
7050
Jiyong Park5d790c32019-11-15 18:40:32 +09007051func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007052 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007053 apex {
7054 name: "myapex",
7055 key: "myapex.key",
7056 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007057 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007058 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007059 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007060 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007061 }
7062
7063 override_apex {
7064 name: "override_myapex",
7065 base: "myapex",
7066 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007067 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007068 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007069 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007070 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007071 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007072 key: "mynewapex.key",
7073 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007074 }
7075
7076 apex_key {
7077 name: "myapex.key",
7078 public_key: "testkey.avbpubkey",
7079 private_key: "testkey.pem",
7080 }
7081
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007082 apex_key {
7083 name: "mynewapex.key",
7084 public_key: "testkey2.avbpubkey",
7085 private_key: "testkey2.pem",
7086 }
7087
7088 android_app_certificate {
7089 name: "myapex.certificate",
7090 certificate: "testkey",
7091 }
7092
Jiyong Park5d790c32019-11-15 18:40:32 +09007093 android_app {
7094 name: "app",
7095 srcs: ["foo/bar/MyClass.java"],
7096 package_name: "foo",
7097 sdk_version: "none",
7098 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007099 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007100 }
7101
7102 override_android_app {
7103 name: "override_app",
7104 base: "app",
7105 package_name: "bar",
7106 }
markchien7c803b82021-08-26 22:10:06 +08007107
7108 bpf {
7109 name: "bpf",
7110 srcs: ["bpf.c"],
7111 }
7112
7113 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007114 name: "overrideBpf",
7115 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007116 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007117
7118 prebuilt_etc {
7119 name: "myetc",
7120 src: "myprebuilt",
7121 }
7122
7123 prebuilt_etc {
7124 name: "override_myetc",
7125 src: "override_myprebuilt",
7126 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007127 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007128
Jooyung Hana0503a52023-08-23 13:12:50 +09007129 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7130 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007131 if originalVariant.GetOverriddenBy() != "" {
7132 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7133 }
7134 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7135 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7136 }
7137
Jooyung Hana0503a52023-08-23 13:12:50 +09007138 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007139 apexRule := module.Rule("apexRule")
7140 copyCmds := apexRule.Args["copy_commands"]
7141
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007142 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7143 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007144
markchien7c803b82021-08-26 22:10:06 +08007145 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007146 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007147
Daniel Norman5a3ce132021-08-26 15:44:43 -07007148 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7149 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7150
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007151 apexBundle := module.Module().(*apexBundle)
7152 name := apexBundle.Name()
7153 if name != "override_myapex" {
7154 t.Errorf("name should be \"override_myapex\", but was %q", name)
7155 }
7156
Baligh Uddin004d7172020-02-19 21:29:28 -08007157 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7158 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7159 }
7160
Jiyong Park20bacab2020-03-03 11:45:41 +09007161 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007162 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007163 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7164
7165 signApkRule := module.Rule("signapk")
7166 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007167
Colin Crossaa255532020-07-03 13:18:24 -07007168 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007169 var builder strings.Builder
7170 data.Custom(&builder, name, "TARGET_", "", data)
7171 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007172 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7173 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007174 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007175 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007176 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007177 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007178 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007179 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007180}
7181
Albert Martineefabcf2022-03-21 20:11:16 +00007182func TestMinSdkVersionOverride(t *testing.T) {
7183 // Override from 29 to 31
7184 minSdkOverride31 := "31"
7185 ctx := testApex(t, `
7186 apex {
7187 name: "myapex",
7188 key: "myapex.key",
7189 native_shared_libs: ["mylib"],
7190 updatable: true,
7191 min_sdk_version: "29"
7192 }
7193
7194 override_apex {
7195 name: "override_myapex",
7196 base: "myapex",
7197 logging_parent: "com.foo.bar",
7198 package_name: "test.overridden.package"
7199 }
7200
7201 apex_key {
7202 name: "myapex.key",
7203 public_key: "testkey.avbpubkey",
7204 private_key: "testkey.pem",
7205 }
7206
7207 cc_library {
7208 name: "mylib",
7209 srcs: ["mylib.cpp"],
7210 runtime_libs: ["libbar"],
7211 system_shared_libs: [],
7212 stl: "none",
7213 apex_available: [ "myapex" ],
7214 min_sdk_version: "apex_inherit"
7215 }
7216
7217 cc_library {
7218 name: "libbar",
7219 srcs: ["mylib.cpp"],
7220 system_shared_libs: [],
7221 stl: "none",
7222 apex_available: [ "myapex" ],
7223 min_sdk_version: "apex_inherit"
7224 }
7225
7226 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7227
Jooyung Hana0503a52023-08-23 13:12:50 +09007228 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007229 copyCmds := apexRule.Args["copy_commands"]
7230
7231 // Ensure that direct non-stubs dep is always included
7232 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7233
7234 // Ensure that runtime_libs dep in included
7235 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7236
7237 // Ensure libraries target overridden min_sdk_version value
7238 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7239}
7240
7241func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7242 // Attempt to override from 31 to 29, should be a NOOP
7243 minSdkOverride29 := "29"
7244 ctx := testApex(t, `
7245 apex {
7246 name: "myapex",
7247 key: "myapex.key",
7248 native_shared_libs: ["mylib"],
7249 updatable: true,
7250 min_sdk_version: "31"
7251 }
7252
7253 override_apex {
7254 name: "override_myapex",
7255 base: "myapex",
7256 logging_parent: "com.foo.bar",
7257 package_name: "test.overridden.package"
7258 }
7259
7260 apex_key {
7261 name: "myapex.key",
7262 public_key: "testkey.avbpubkey",
7263 private_key: "testkey.pem",
7264 }
7265
7266 cc_library {
7267 name: "mylib",
7268 srcs: ["mylib.cpp"],
7269 runtime_libs: ["libbar"],
7270 system_shared_libs: [],
7271 stl: "none",
7272 apex_available: [ "myapex" ],
7273 min_sdk_version: "apex_inherit"
7274 }
7275
7276 cc_library {
7277 name: "libbar",
7278 srcs: ["mylib.cpp"],
7279 system_shared_libs: [],
7280 stl: "none",
7281 apex_available: [ "myapex" ],
7282 min_sdk_version: "apex_inherit"
7283 }
7284
7285 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7286
Jooyung Hana0503a52023-08-23 13:12:50 +09007287 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007288 copyCmds := apexRule.Args["copy_commands"]
7289
7290 // Ensure that direct non-stubs dep is always included
7291 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7292
7293 // Ensure that runtime_libs dep in included
7294 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7295
7296 // Ensure libraries target the original min_sdk_version value rather than the overridden
7297 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7298}
7299
Jooyung Han214bf372019-11-12 13:03:50 +09007300func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007301 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007302 apex {
7303 name: "myapex",
7304 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007305 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007306 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007307 }
7308
7309 apex_key {
7310 name: "myapex.key",
7311 public_key: "testkey.avbpubkey",
7312 private_key: "testkey.pem",
7313 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007314
7315 cc_library {
7316 name: "mylib",
7317 srcs: ["mylib.cpp"],
7318 stl: "libc++",
7319 system_shared_libs: [],
7320 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007321 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007322 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007323 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007324
Jooyung Hana0503a52023-08-23 13:12:50 +09007325 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007326 args := module.Rule("apexRule").Args
7327 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007328 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007329
7330 // The copies of the libraries in the apex should have one more dependency than
7331 // the ones outside the apex, namely the unwinder. Ideally we should check
7332 // the dependency names directly here but for some reason the names are blank in
7333 // this test.
7334 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007335 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007336 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7337 if len(apexImplicits) != len(nonApexImplicits)+1 {
7338 t.Errorf("%q missing unwinder dep", lib)
7339 }
7340 }
Jooyung Han214bf372019-11-12 13:03:50 +09007341}
7342
Paul Duffine05480a2021-03-08 15:07:14 +00007343var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007344 "api/current.txt": nil,
7345 "api/removed.txt": nil,
7346 "api/system-current.txt": nil,
7347 "api/system-removed.txt": nil,
7348 "api/test-current.txt": nil,
7349 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007350
Anton Hanssondff2c782020-12-21 17:10:01 +00007351 "100/public/api/foo.txt": nil,
7352 "100/public/api/foo-removed.txt": nil,
7353 "100/system/api/foo.txt": nil,
7354 "100/system/api/foo-removed.txt": nil,
7355
Paul Duffineedc5d52020-06-12 17:46:39 +01007356 // For java_sdk_library_import
7357 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007358}
7359
Jooyung Han58f26ab2019-12-18 15:34:32 +09007360func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007361 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007362 apex {
7363 name: "myapex",
7364 key: "myapex.key",
7365 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007366 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007367 }
7368
7369 apex_key {
7370 name: "myapex.key",
7371 public_key: "testkey.avbpubkey",
7372 private_key: "testkey.pem",
7373 }
7374
7375 java_sdk_library {
7376 name: "foo",
7377 srcs: ["a.java"],
7378 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007379 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007380 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007381
7382 prebuilt_apis {
7383 name: "sdk",
7384 api_dirs: ["100"],
7385 }
Paul Duffin9b879592020-05-26 13:21:35 +01007386 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007387
7388 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007389 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007390 "javalib/foo.jar",
7391 "etc/permissions/foo.xml",
7392 })
7393 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007394 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007395 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 +09007396}
7397
Paul Duffin9b879592020-05-26 13:21:35 +01007398func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007399 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007400 apex {
7401 name: "myapex",
7402 key: "myapex.key",
7403 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007404 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007405 }
7406
7407 apex_key {
7408 name: "myapex.key",
7409 public_key: "testkey.avbpubkey",
7410 private_key: "testkey.pem",
7411 }
7412
7413 java_sdk_library {
7414 name: "foo",
7415 srcs: ["a.java"],
7416 api_packages: ["foo"],
7417 apex_available: ["myapex"],
7418 sdk_version: "none",
7419 system_modules: "none",
7420 }
7421
7422 java_library {
7423 name: "bar",
7424 srcs: ["a.java"],
7425 libs: ["foo"],
7426 apex_available: ["myapex"],
7427 sdk_version: "none",
7428 system_modules: "none",
7429 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007430
7431 prebuilt_apis {
7432 name: "sdk",
7433 api_dirs: ["100"],
7434 }
Paul Duffin9b879592020-05-26 13:21:35 +01007435 `, withFiles(filesForSdkLibrary))
7436
7437 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007438 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007439 "javalib/bar.jar",
7440 "javalib/foo.jar",
7441 "etc/permissions/foo.xml",
7442 })
7443
7444 // The bar library should depend on the implementation jar.
7445 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007446 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007447 t.Errorf("expected %q, found %#q", expected, actual)
7448 }
7449}
7450
7451func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007452 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007453 apex {
7454 name: "myapex",
7455 key: "myapex.key",
7456 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007457 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007458 }
7459
7460 apex_key {
7461 name: "myapex.key",
7462 public_key: "testkey.avbpubkey",
7463 private_key: "testkey.pem",
7464 }
7465
7466 java_sdk_library {
7467 name: "foo",
7468 srcs: ["a.java"],
7469 api_packages: ["foo"],
7470 apex_available: ["myapex"],
7471 sdk_version: "none",
7472 system_modules: "none",
7473 }
7474
7475 java_library {
7476 name: "bar",
7477 srcs: ["a.java"],
7478 libs: ["foo"],
7479 sdk_version: "none",
7480 system_modules: "none",
7481 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007482
7483 prebuilt_apis {
7484 name: "sdk",
7485 api_dirs: ["100"],
7486 }
Paul Duffin9b879592020-05-26 13:21:35 +01007487 `, withFiles(filesForSdkLibrary))
7488
7489 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007490 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007491 "javalib/foo.jar",
7492 "etc/permissions/foo.xml",
7493 })
7494
7495 // The bar library should depend on the stubs jar.
7496 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007497 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007498 t.Errorf("expected %q, found %#q", expected, actual)
7499 }
7500}
7501
Paul Duffineedc5d52020-06-12 17:46:39 +01007502func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007503 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007504 prebuilt_apis {
7505 name: "sdk",
7506 api_dirs: ["100"],
7507 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007508 withFiles(map[string][]byte{
7509 "apex/a.java": nil,
7510 "apex/apex_manifest.json": nil,
7511 "apex/Android.bp": []byte(`
7512 package {
7513 default_visibility: ["//visibility:private"],
7514 }
7515
7516 apex {
7517 name: "myapex",
7518 key: "myapex.key",
7519 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007520 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007521 }
7522
7523 apex_key {
7524 name: "myapex.key",
7525 public_key: "testkey.avbpubkey",
7526 private_key: "testkey.pem",
7527 }
7528
7529 java_library {
7530 name: "bar",
7531 srcs: ["a.java"],
7532 libs: ["foo"],
7533 apex_available: ["myapex"],
7534 sdk_version: "none",
7535 system_modules: "none",
7536 }
7537`),
7538 "source/a.java": nil,
7539 "source/api/current.txt": nil,
7540 "source/api/removed.txt": nil,
7541 "source/Android.bp": []byte(`
7542 package {
7543 default_visibility: ["//visibility:private"],
7544 }
7545
7546 java_sdk_library {
7547 name: "foo",
7548 visibility: ["//apex"],
7549 srcs: ["a.java"],
7550 api_packages: ["foo"],
7551 apex_available: ["myapex"],
7552 sdk_version: "none",
7553 system_modules: "none",
7554 public: {
7555 enabled: true,
7556 },
7557 }
7558`),
7559 "prebuilt/a.jar": nil,
7560 "prebuilt/Android.bp": []byte(`
7561 package {
7562 default_visibility: ["//visibility:private"],
7563 }
7564
7565 java_sdk_library_import {
7566 name: "foo",
7567 visibility: ["//apex", "//source"],
7568 apex_available: ["myapex"],
7569 prefer: true,
7570 public: {
7571 jars: ["a.jar"],
7572 },
7573 }
7574`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007575 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007576 )
7577
7578 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007579 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007580 "javalib/bar.jar",
7581 "javalib/foo.jar",
7582 "etc/permissions/foo.xml",
7583 })
7584
7585 // The bar library should depend on the implementation jar.
7586 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007587 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007588 t.Errorf("expected %q, found %#q", expected, actual)
7589 }
7590}
7591
7592func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7593 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7594 apex {
7595 name: "myapex",
7596 key: "myapex.key",
7597 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007598 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007599 }
7600
7601 apex_key {
7602 name: "myapex.key",
7603 public_key: "testkey.avbpubkey",
7604 private_key: "testkey.pem",
7605 }
7606
7607 java_sdk_library_import {
7608 name: "foo",
7609 apex_available: ["myapex"],
7610 prefer: true,
7611 public: {
7612 jars: ["a.jar"],
7613 },
7614 }
7615
7616 `, withFiles(filesForSdkLibrary))
7617}
7618
atrost6e126252020-01-27 17:01:16 +00007619func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007620 result := android.GroupFixturePreparers(
7621 prepareForApexTest,
7622 java.PrepareForTestWithPlatformCompatConfig,
7623 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007624 apex {
7625 name: "myapex",
7626 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007627 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007628 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007629 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007630 }
7631
7632 apex_key {
7633 name: "myapex.key",
7634 public_key: "testkey.avbpubkey",
7635 private_key: "testkey.pem",
7636 }
7637
7638 platform_compat_config {
7639 name: "myjar-platform-compat-config",
7640 src: ":myjar",
7641 }
7642
7643 java_library {
7644 name: "myjar",
7645 srcs: ["foo/bar/MyClass.java"],
7646 sdk_version: "none",
7647 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007648 apex_available: [ "myapex" ],
7649 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007650
7651 // Make sure that a preferred prebuilt does not affect the apex contents.
7652 prebuilt_platform_compat_config {
7653 name: "myjar-platform-compat-config",
7654 metadata: "compat-config/metadata.xml",
7655 prefer: true,
7656 }
atrost6e126252020-01-27 17:01:16 +00007657 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007658 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007659 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007660 "etc/compatconfig/myjar-platform-compat-config.xml",
7661 "javalib/myjar.jar",
7662 })
7663}
7664
Jooyung Han862c0d62022-12-21 10:15:37 +09007665func TestNoDupeApexFiles(t *testing.T) {
7666 android.GroupFixturePreparers(
7667 android.PrepareForTestWithAndroidBuildComponents,
7668 PrepareForTestWithApexBuildComponents,
7669 prepareForTestWithMyapex,
7670 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7671 ).
7672 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7673 RunTestWithBp(t, `
7674 apex {
7675 name: "myapex",
7676 key: "myapex.key",
7677 prebuilts: ["foo", "bar"],
7678 updatable: false,
7679 }
7680
7681 apex_key {
7682 name: "myapex.key",
7683 public_key: "testkey.avbpubkey",
7684 private_key: "testkey.pem",
7685 }
7686
7687 prebuilt_etc {
7688 name: "foo",
7689 src: "myprebuilt",
7690 filename_from_src: true,
7691 }
7692
7693 prebuilt_etc {
7694 name: "bar",
7695 src: "myprebuilt",
7696 filename_from_src: true,
7697 }
7698 `)
7699}
7700
Jiyong Park479321d2019-12-16 11:47:12 +09007701func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7702 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7703 apex {
7704 name: "myapex",
7705 key: "myapex.key",
7706 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007707 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007708 }
7709
7710 apex_key {
7711 name: "myapex.key",
7712 public_key: "testkey.avbpubkey",
7713 private_key: "testkey.pem",
7714 }
7715
7716 java_library {
7717 name: "myjar",
7718 srcs: ["foo/bar/MyClass.java"],
7719 sdk_version: "none",
7720 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007721 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007722 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007723 }
7724 `)
7725}
7726
Jiyong Park7afd1072019-12-30 16:56:33 +09007727func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007728 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007729 apex {
7730 name: "myapex",
7731 key: "myapex.key",
7732 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007733 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007734 }
7735
7736 apex_key {
7737 name: "myapex.key",
7738 public_key: "testkey.avbpubkey",
7739 private_key: "testkey.pem",
7740 }
7741
7742 cc_library {
7743 name: "mylib",
7744 srcs: ["mylib.cpp"],
7745 system_shared_libs: [],
7746 stl: "none",
7747 required: ["a", "b"],
7748 host_required: ["c", "d"],
7749 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007750 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007751 }
7752 `)
7753
Jooyung Hana0503a52023-08-23 13:12:50 +09007754 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007755 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007756 name := apexBundle.BaseModuleName()
7757 prefix := "TARGET_"
7758 var builder strings.Builder
7759 data.Custom(&builder, name, prefix, "", data)
7760 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007761 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007762 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7763 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007764}
7765
Jiyong Park7cd10e32020-01-14 09:22:18 +09007766func TestSymlinksFromApexToSystem(t *testing.T) {
7767 bp := `
7768 apex {
7769 name: "myapex",
7770 key: "myapex.key",
7771 native_shared_libs: ["mylib"],
7772 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007773 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007774 }
7775
Jiyong Park9d677202020-02-19 16:29:35 +09007776 apex {
7777 name: "myapex.updatable",
7778 key: "myapex.key",
7779 native_shared_libs: ["mylib"],
7780 java_libs: ["myjar"],
7781 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007782 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007783 }
7784
Jiyong Park7cd10e32020-01-14 09:22:18 +09007785 apex_key {
7786 name: "myapex.key",
7787 public_key: "testkey.avbpubkey",
7788 private_key: "testkey.pem",
7789 }
7790
7791 cc_library {
7792 name: "mylib",
7793 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007794 shared_libs: [
7795 "myotherlib",
7796 "myotherlib_ext",
7797 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007798 system_shared_libs: [],
7799 stl: "none",
7800 apex_available: [
7801 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007802 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007803 "//apex_available:platform",
7804 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007805 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007806 }
7807
7808 cc_library {
7809 name: "myotherlib",
7810 srcs: ["mylib.cpp"],
7811 system_shared_libs: [],
7812 stl: "none",
7813 apex_available: [
7814 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007815 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007816 "//apex_available:platform",
7817 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007818 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007819 }
7820
Jiyong Parkce243632023-02-17 18:22:25 +09007821 cc_library {
7822 name: "myotherlib_ext",
7823 srcs: ["mylib.cpp"],
7824 system_shared_libs: [],
7825 system_ext_specific: true,
7826 stl: "none",
7827 apex_available: [
7828 "myapex",
7829 "myapex.updatable",
7830 "//apex_available:platform",
7831 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007832 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007833 }
7834
Jiyong Park7cd10e32020-01-14 09:22:18 +09007835 java_library {
7836 name: "myjar",
7837 srcs: ["foo/bar/MyClass.java"],
7838 sdk_version: "none",
7839 system_modules: "none",
7840 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007841 apex_available: [
7842 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007843 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007844 "//apex_available:platform",
7845 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007846 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007847 }
7848
7849 java_library {
7850 name: "myotherjar",
7851 srcs: ["foo/bar/MyClass.java"],
7852 sdk_version: "none",
7853 system_modules: "none",
7854 apex_available: [
7855 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007856 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007857 "//apex_available:platform",
7858 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007859 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007860 }
7861 `
7862
7863 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7864 for _, f := range files {
7865 if f.path == file {
7866 if f.isLink {
7867 t.Errorf("%q is not a real file", file)
7868 }
7869 return
7870 }
7871 }
7872 t.Errorf("%q is not found", file)
7873 }
7874
Jiyong Parkce243632023-02-17 18:22:25 +09007875 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007876 for _, f := range files {
7877 if f.path == file {
7878 if !f.isLink {
7879 t.Errorf("%q is not a symlink", file)
7880 }
Jiyong Parkce243632023-02-17 18:22:25 +09007881 if f.src != target {
7882 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7883 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007884 return
7885 }
7886 }
7887 t.Errorf("%q is not found", file)
7888 }
7889
Jiyong Park9d677202020-02-19 16:29:35 +09007890 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7891 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007892 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007893 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007894 ensureRealfileExists(t, files, "javalib/myjar.jar")
7895 ensureRealfileExists(t, files, "lib64/mylib.so")
7896 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007897 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007898
Jooyung Hana0503a52023-08-23 13:12:50 +09007899 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007900 ensureRealfileExists(t, files, "javalib/myjar.jar")
7901 ensureRealfileExists(t, files, "lib64/mylib.so")
7902 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007903 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007904
7905 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007906 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007907 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007908 ensureRealfileExists(t, files, "javalib/myjar.jar")
7909 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007910 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7911 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007912
Jooyung Hana0503a52023-08-23 13:12:50 +09007913 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007914 ensureRealfileExists(t, files, "javalib/myjar.jar")
7915 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007916 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7917 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007918}
7919
Yo Chiange8128052020-07-23 20:09:18 +08007920func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007921 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007922 apex {
7923 name: "myapex",
7924 key: "myapex.key",
7925 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007926 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007927 }
7928
7929 apex_key {
7930 name: "myapex.key",
7931 public_key: "testkey.avbpubkey",
7932 private_key: "testkey.pem",
7933 }
7934
7935 cc_library_shared {
7936 name: "mylib",
7937 srcs: ["mylib.cpp"],
7938 shared_libs: ["myotherlib"],
7939 system_shared_libs: [],
7940 stl: "none",
7941 apex_available: [
7942 "myapex",
7943 "//apex_available:platform",
7944 ],
7945 }
7946
7947 cc_prebuilt_library_shared {
7948 name: "myotherlib",
7949 srcs: ["prebuilt.so"],
7950 system_shared_libs: [],
7951 stl: "none",
7952 apex_available: [
7953 "myapex",
7954 "//apex_available:platform",
7955 ],
7956 }
7957 `)
7958
Jooyung Hana0503a52023-08-23 13:12:50 +09007959 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007960 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007961 var builder strings.Builder
7962 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7963 androidMk := builder.String()
7964 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007965 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007966 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7967 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7968 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007969 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007970}
7971
Jooyung Han643adc42020-02-27 13:50:06 +09007972func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007973 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007974 apex {
7975 name: "myapex",
7976 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007977 binaries: ["mybin"],
7978 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007979 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007980 }
7981
7982 apex_key {
7983 name: "myapex.key",
7984 public_key: "testkey.avbpubkey",
7985 private_key: "testkey.pem",
7986 }
7987
7988 cc_library {
7989 name: "mylib",
7990 srcs: ["mylib.cpp"],
7991 shared_libs: ["mylib2"],
7992 system_shared_libs: [],
7993 stl: "none",
7994 apex_available: [ "myapex" ],
7995 }
7996
7997 cc_library {
7998 name: "mylib2",
7999 srcs: ["mylib.cpp"],
8000 system_shared_libs: [],
8001 stl: "none",
8002 apex_available: [ "myapex" ],
8003 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008004
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008005 // Used as both a JNI library and a regular shared library.
8006 cc_library {
8007 name: "mylib3",
8008 srcs: ["mylib.cpp"],
8009 system_shared_libs: [],
8010 stl: "none",
8011 apex_available: [ "myapex" ],
8012 }
8013
8014 cc_binary {
8015 name: "mybin",
8016 srcs: ["mybin.cpp"],
8017 shared_libs: ["mylib3"],
8018 system_shared_libs: [],
8019 stl: "none",
8020 apex_available: [ "myapex" ],
8021 }
8022
Jiyong Park34d5c332022-02-24 18:02:44 +09008023 rust_ffi_shared {
8024 name: "libfoo.rust",
8025 crate_name: "foo",
8026 srcs: ["foo.rs"],
8027 shared_libs: ["libfoo.shared_from_rust"],
8028 prefer_rlib: true,
8029 apex_available: ["myapex"],
8030 }
8031
8032 cc_library_shared {
8033 name: "libfoo.shared_from_rust",
8034 srcs: ["mylib.cpp"],
8035 system_shared_libs: [],
8036 stl: "none",
8037 stubs: {
8038 versions: ["10", "11", "12"],
8039 },
8040 }
8041
Jooyung Han643adc42020-02-27 13:50:06 +09008042 `)
8043
Jooyung Hana0503a52023-08-23 13:12:50 +09008044 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008045 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008046 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008047 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008048 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008049 "lib64/mylib.so",
8050 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008051 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008052 "lib64/libfoo.rust.so",
8053 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8054 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008055 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008056
8057 // b/220397949
8058 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008059}
8060
Jooyung Han49f67012020-04-17 13:43:10 +09008061func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008062 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008063 apex {
8064 name: "myapex",
8065 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008066 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008067 }
8068 apex_key {
8069 name: "myapex.key",
8070 public_key: "testkey.avbpubkey",
8071 private_key: "testkey.pem",
8072 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008073 `,
8074 android.FixtureModifyConfig(func(config android.Config) {
8075 delete(config.Targets, android.Android)
8076 config.AndroidCommonTarget = android.Target{}
8077 }),
8078 )
Jooyung Han49f67012020-04-17 13:43:10 +09008079
8080 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8081 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8082 }
8083}
8084
Jiyong Parkbd159612020-02-28 15:22:21 +09008085func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008086 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008087 apex {
8088 name: "myapex",
8089 key: "myapex.key",
8090 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008091 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008092 }
8093
8094 apex_key {
8095 name: "myapex.key",
8096 public_key: "testkey.avbpubkey",
8097 private_key: "testkey.pem",
8098 }
8099
8100 android_app {
8101 name: "AppFoo",
8102 srcs: ["foo/bar/MyClass.java"],
8103 sdk_version: "none",
8104 system_modules: "none",
8105 apex_available: [ "myapex" ],
8106 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008107 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008108
Jooyung Hana0503a52023-08-23 13:12:50 +09008109 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008110 content := bundleConfigRule.Args["content"]
8111
8112 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008113 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 +09008114}
8115
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008116func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008117 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008118 apex {
8119 name: "myapex",
8120 key: "myapex.key",
8121 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008122 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008123 }
8124
8125 apex_key {
8126 name: "myapex.key",
8127 public_key: "testkey.avbpubkey",
8128 private_key: "testkey.pem",
8129 }
8130
8131 android_app_set {
8132 name: "AppSet",
8133 set: "AppSet.apks",
8134 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008135 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008136 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008137 content := bundleConfigRule.Args["content"]
8138 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8139 s := mod.Rule("apexRule").Args["copy_commands"]
8140 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008141 if len(copyCmds) != 4 {
8142 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008143 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008144 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8145 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008146 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8147 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008148
8149 // Ensure that canned_fs_config has an entry for the app set zip file
8150 generateFsRule := mod.Rule("generateFsConfig")
8151 cmd := generateFsRule.RuleParams.Command
8152 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008153}
8154
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008155func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008156 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008157 apex_set {
8158 name: "myapex",
8159 filename: "foo_v2.apex",
8160 sanitized: {
8161 none: { set: "myapex.apks", },
8162 hwaddress: { set: "myapex.hwasan.apks", },
8163 },
Paul Duffin24704672021-04-06 16:09:30 +01008164 }
8165 `
8166 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008167
Paul Duffin24704672021-04-06 16:09:30 +01008168 // Check that the extractor produces the correct output file from the correct input file.
8169 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008170
Paul Duffin24704672021-04-06 16:09:30 +01008171 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8172 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008173
Paul Duffin24704672021-04-06 16:09:30 +01008174 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8175
8176 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008177 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8178 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008179
8180 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008181}
8182
Pranav Guptaeba03b02022-09-27 00:27:08 +00008183func TestApexSetApksModuleAssignment(t *testing.T) {
8184 ctx := testApex(t, `
8185 apex_set {
8186 name: "myapex",
8187 set: ":myapex_apks_file",
8188 }
8189
8190 filegroup {
8191 name: "myapex_apks_file",
8192 srcs: ["myapex.apks"],
8193 }
8194 `)
8195
8196 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8197
8198 // Check that the extractor produces the correct apks file from the input module
8199 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8200 extractedApex := m.Output(extractorOutput)
8201
8202 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8203}
8204
Paul Duffin89f570a2021-06-16 01:42:33 +01008205func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008206 t.Helper()
8207
Paul Duffin55607122021-03-30 23:32:51 +01008208 fs := android.MockFS{
8209 "a.java": nil,
8210 "a.jar": nil,
8211 "apex_manifest.json": nil,
8212 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008213 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008214 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8215 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8216 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008217 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008218 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008219
Paul Duffin55607122021-03-30 23:32:51 +01008220 errorHandler := android.FixtureExpectsNoErrors
8221 if errmsg != "" {
8222 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008223 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008224
Paul Duffin55607122021-03-30 23:32:51 +01008225 result := android.GroupFixturePreparers(
8226 cc.PrepareForTestWithCcDefaultModules,
8227 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008228 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008229 java.PrepareForTestWithJavaSdkLibraryFiles,
8230 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008231 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008232 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008233 android.FixtureModifyMockFS(func(fs android.MockFS) {
8234 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8235 insert := ""
8236 for _, fragment := range fragments {
8237 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8238 }
8239 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8240 platform_bootclasspath {
8241 name: "platform-bootclasspath",
8242 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008243 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008244 %s
8245 ],
8246 }
8247 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008248 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008249 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008250 // Dexpreopt for boot jars requires the ART boot image profile.
8251 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8252 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008253 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008254 ).
8255 ExtendWithErrorHandler(errorHandler).
8256 RunTestWithBp(t, bp)
8257
8258 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008259}
8260
Paul Duffin5556c5f2022-06-09 17:32:21 +00008261func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008262 preparers := android.GroupFixturePreparers(
8263 java.PrepareForTestWithJavaDefaultModules,
8264 PrepareForTestWithApexBuildComponents,
8265 ).
8266 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8267 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8268
8269 bpBase := `
8270 apex_set {
8271 name: "com.android.myapex",
8272 installable: true,
8273 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8274 set: "myapex.apks",
8275 }
8276
8277 apex_set {
8278 name: "com.mycompany.android.myapex",
8279 apex_name: "com.android.myapex",
8280 installable: true,
8281 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8282 set: "company-myapex.apks",
8283 }
8284
8285 prebuilt_bootclasspath_fragment {
8286 name: "my-bootclasspath-fragment",
8287 apex_available: ["com.android.myapex"],
8288 %s
8289 }
8290 `
8291
8292 t.Run("java_import", func(t *testing.T) {
8293 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8294 java_import {
8295 name: "libfoo",
8296 jars: ["libfoo.jar"],
8297 apex_available: ["com.android.myapex"],
8298 }
8299 `)
8300 })
8301
8302 t.Run("java_sdk_library_import", func(t *testing.T) {
8303 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8304 java_sdk_library_import {
8305 name: "libfoo",
8306 public: {
8307 jars: ["libbar.jar"],
8308 },
8309 apex_available: ["com.android.myapex"],
8310 }
8311 `)
8312 })
8313
8314 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8315 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8316 image_name: "art",
8317 contents: ["libfoo"],
8318 `)+`
8319 java_sdk_library_import {
8320 name: "libfoo",
8321 public: {
8322 jars: ["libbar.jar"],
8323 },
8324 apex_available: ["com.android.myapex"],
8325 }
8326 `)
8327 })
8328}
8329
Paul Duffin5556c5f2022-06-09 17:32:21 +00008330func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8331 preparers := android.GroupFixturePreparers(
8332 java.PrepareForTestWithJavaDefaultModules,
8333 PrepareForTestWithApexBuildComponents,
8334 )
8335
8336 bpBase := `
8337 apex_set {
8338 name: "com.android.myapex",
8339 installable: true,
8340 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8341 set: "myapex.apks",
8342 }
8343
8344 apex_set {
8345 name: "com.android.myapex_compressed",
8346 apex_name: "com.android.myapex",
8347 installable: true,
8348 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8349 set: "myapex_compressed.apks",
8350 }
8351
8352 prebuilt_bootclasspath_fragment {
8353 name: "my-bootclasspath-fragment",
8354 apex_available: [
8355 "com.android.myapex",
8356 "com.android.myapex_compressed",
8357 ],
8358 hidden_api: {
8359 annotation_flags: "annotation-flags.csv",
8360 metadata: "metadata.csv",
8361 index: "index.csv",
8362 signature_patterns: "signature_patterns.csv",
8363 },
8364 %s
8365 }
8366 `
8367
8368 t.Run("java_import", func(t *testing.T) {
8369 result := preparers.RunTestWithBp(t,
8370 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8371 java_import {
8372 name: "libfoo",
8373 jars: ["libfoo.jar"],
8374 apex_available: [
8375 "com.android.myapex",
8376 "com.android.myapex_compressed",
8377 ],
8378 }
8379 `)
8380
8381 module := result.Module("libfoo", "android_common_com.android.myapex")
8382 usesLibraryDep := module.(java.UsesLibraryDependency)
8383 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8384 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8385 usesLibraryDep.DexJarBuildPath().Path())
8386 })
8387
8388 t.Run("java_sdk_library_import", func(t *testing.T) {
8389 result := preparers.RunTestWithBp(t,
8390 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8391 java_sdk_library_import {
8392 name: "libfoo",
8393 public: {
8394 jars: ["libbar.jar"],
8395 },
8396 apex_available: [
8397 "com.android.myapex",
8398 "com.android.myapex_compressed",
8399 ],
8400 compile_dex: true,
8401 }
8402 `)
8403
8404 module := result.Module("libfoo", "android_common_com.android.myapex")
8405 usesLibraryDep := module.(java.UsesLibraryDependency)
8406 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8407 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8408 usesLibraryDep.DexJarBuildPath().Path())
8409 })
8410
8411 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8412 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8413 image_name: "art",
8414 contents: ["libfoo"],
8415 `)+`
8416 java_sdk_library_import {
8417 name: "libfoo",
8418 public: {
8419 jars: ["libbar.jar"],
8420 },
8421 apex_available: [
8422 "com.android.myapex",
8423 "com.android.myapex_compressed",
8424 ],
8425 compile_dex: true,
8426 }
8427 `)
8428 })
8429}
8430
Jooyung Han548640b2020-04-27 12:10:30 +09008431func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8432 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8433 apex {
8434 name: "myapex",
8435 key: "myapex.key",
8436 updatable: true,
8437 }
8438
8439 apex_key {
8440 name: "myapex.key",
8441 public_key: "testkey.avbpubkey",
8442 private_key: "testkey.pem",
8443 }
8444 `)
8445}
8446
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008447func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8448 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8449 apex {
8450 name: "myapex",
8451 key: "myapex.key",
8452 }
8453
8454 apex_key {
8455 name: "myapex.key",
8456 public_key: "testkey.avbpubkey",
8457 private_key: "testkey.pem",
8458 }
8459 `)
8460}
8461
Jooyung Handfc864c2023-03-20 18:19:07 +09008462func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8463 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008464 apex {
8465 name: "myapex",
8466 key: "myapex.key",
8467 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008468 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008469 soc_specific: true,
8470 }
8471
8472 apex_key {
8473 name: "myapex.key",
8474 public_key: "testkey.avbpubkey",
8475 private_key: "testkey.pem",
8476 }
8477 `)
8478}
8479
Jooyung Han02873da2023-03-22 17:41:03 +09008480func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8481 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8482 apex {
8483 name: "myapex",
8484 key: "myapex.key",
8485 updatable: false,
8486 min_sdk_version: "29",
8487 use_vndk_as_stable: true,
8488 vendor: true,
8489 }
8490
8491 apex_key {
8492 name: "myapex.key",
8493 public_key: "testkey.avbpubkey",
8494 private_key: "testkey.pem",
8495 }
8496 `)
8497}
8498
Jooyung Handfc864c2023-03-20 18:19:07 +09008499func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8500 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8501 apex {
8502 name: "myapex",
8503 key: "myapex.key",
8504 updatable: false,
8505 use_vndk_as_stable: true,
8506 }
8507
8508 apex_key {
8509 name: "myapex.key",
8510 public_key: "testkey.avbpubkey",
8511 private_key: "testkey.pem",
8512 }
8513 `)
8514}
8515
satayevb98371c2021-06-15 16:49:50 +01008516func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8517 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8518 apex {
8519 name: "myapex",
8520 key: "myapex.key",
8521 systemserverclasspath_fragments: [
8522 "mysystemserverclasspathfragment",
8523 ],
8524 min_sdk_version: "29",
8525 updatable: true,
8526 }
8527
8528 apex_key {
8529 name: "myapex.key",
8530 public_key: "testkey.avbpubkey",
8531 private_key: "testkey.pem",
8532 }
8533
8534 java_library {
8535 name: "foo",
8536 srcs: ["b.java"],
8537 min_sdk_version: "29",
8538 installable: true,
8539 apex_available: [
8540 "myapex",
8541 ],
8542 }
8543
8544 systemserverclasspath_fragment {
8545 name: "mysystemserverclasspathfragment",
8546 generate_classpaths_proto: false,
8547 contents: [
8548 "foo",
8549 ],
8550 apex_available: [
8551 "myapex",
8552 ],
8553 }
satayevabcd5972021-08-06 17:49:46 +01008554 `,
8555 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8556 )
satayevb98371c2021-06-15 16:49:50 +01008557}
8558
Paul Duffin064b70c2020-11-02 17:32:38 +00008559func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008560 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008561 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008562 fragment := java.ApexVariantReference{
8563 Apex: proptools.StringPtr("myapex"),
8564 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8565 }
8566
Paul Duffin064b70c2020-11-02 17:32:38 +00008567 testDexpreoptWithApexes(t, `
8568 prebuilt_apex {
8569 name: "myapex" ,
8570 arch: {
8571 arm64: {
8572 src: "myapex-arm64.apex",
8573 },
8574 arm: {
8575 src: "myapex-arm.apex",
8576 },
8577 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008578 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8579 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008580
Paul Duffin89f570a2021-06-16 01:42:33 +01008581 prebuilt_bootclasspath_fragment {
8582 name: "my-bootclasspath-fragment",
8583 contents: ["libfoo"],
8584 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008585 hidden_api: {
8586 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8587 metadata: "my-bootclasspath-fragment/metadata.csv",
8588 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008589 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8590 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8591 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008592 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008593 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008594
Paul Duffin89f570a2021-06-16 01:42:33 +01008595 java_import {
8596 name: "libfoo",
8597 jars: ["libfoo.jar"],
8598 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008599 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008600 }
8601 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008602 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008603}
8604
Spandan Dasf14e2542021-11-12 00:01:37 +00008605func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008606 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008607 bp += `
8608 apex_key {
8609 name: "myapex.key",
8610 public_key: "testkey.avbpubkey",
8611 private_key: "testkey.pem",
8612 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008613 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008614 "lib1/src/A.java": nil,
8615 "lib2/src/B.java": nil,
8616 "system/sepolicy/apex/myapex-file_contexts": nil,
8617 }
8618
Paul Duffin45338f02021-03-30 23:07:52 +01008619 errorHandler := android.FixtureExpectsNoErrors
8620 if errmsg != "" {
8621 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008622 }
Colin Crossae8600b2020-10-29 17:09:13 -07008623
Paul Duffin45338f02021-03-30 23:07:52 +01008624 android.GroupFixturePreparers(
8625 android.PrepareForTestWithAndroidBuildComponents,
8626 java.PrepareForTestWithJavaBuildComponents,
8627 PrepareForTestWithApexBuildComponents,
8628 android.PrepareForTestWithNeverallowRules(rules),
8629 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008630 apexBootJars := make([]string, 0, len(bootJars))
8631 for _, apexBootJar := range bootJars {
8632 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008633 }
satayevd604b212021-07-21 14:23:52 +01008634 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008635 }),
8636 fs.AddToFixture(),
8637 ).
8638 ExtendWithErrorHandler(errorHandler).
8639 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008640}
8641
8642func TestApexPermittedPackagesRules(t *testing.T) {
8643 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008644 name string
8645 expectedError string
8646 bp string
8647 bootJars []string
8648 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008649 }{
8650
8651 {
8652 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8653 expectedError: "",
8654 bp: `
8655 java_library {
8656 name: "bcp_lib1",
8657 srcs: ["lib1/src/*.java"],
8658 permitted_packages: ["foo.bar"],
8659 apex_available: ["myapex"],
8660 sdk_version: "none",
8661 system_modules: "none",
8662 }
8663 java_library {
8664 name: "nonbcp_lib2",
8665 srcs: ["lib2/src/*.java"],
8666 apex_available: ["myapex"],
8667 permitted_packages: ["a.b"],
8668 sdk_version: "none",
8669 system_modules: "none",
8670 }
8671 apex {
8672 name: "myapex",
8673 key: "myapex.key",
8674 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008675 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008676 }`,
8677 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008678 bcpPermittedPackages: map[string][]string{
8679 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008680 "foo.bar",
8681 },
8682 },
8683 },
8684 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008685 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008686 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 +01008687 bp: `
8688 java_library {
8689 name: "bcp_lib1",
8690 srcs: ["lib1/src/*.java"],
8691 apex_available: ["myapex"],
8692 permitted_packages: ["foo.bar"],
8693 sdk_version: "none",
8694 system_modules: "none",
8695 }
8696 java_library {
8697 name: "bcp_lib2",
8698 srcs: ["lib2/src/*.java"],
8699 apex_available: ["myapex"],
8700 permitted_packages: ["foo.bar", "bar.baz"],
8701 sdk_version: "none",
8702 system_modules: "none",
8703 }
8704 apex {
8705 name: "myapex",
8706 key: "myapex.key",
8707 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008708 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008709 }
8710 `,
8711 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008712 bcpPermittedPackages: map[string][]string{
8713 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008714 "foo.bar",
8715 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008716 "bcp_lib2": []string{
8717 "foo.bar",
8718 },
8719 },
8720 },
8721 {
8722 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8723 expectedError: "",
8724 bp: `
8725 java_library {
8726 name: "bcp_lib_restricted",
8727 srcs: ["lib1/src/*.java"],
8728 apex_available: ["myapex"],
8729 permitted_packages: ["foo.bar"],
8730 sdk_version: "none",
8731 min_sdk_version: "29",
8732 system_modules: "none",
8733 }
8734 java_library {
8735 name: "bcp_lib_unrestricted",
8736 srcs: ["lib2/src/*.java"],
8737 apex_available: ["myapex"],
8738 permitted_packages: ["foo.bar", "bar.baz"],
8739 sdk_version: "none",
8740 min_sdk_version: "29",
8741 system_modules: "none",
8742 }
8743 apex {
8744 name: "myapex",
8745 key: "myapex.key",
8746 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8747 updatable: true,
8748 min_sdk_version: "29",
8749 }
8750 `,
8751 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8752 bcpPermittedPackages: map[string][]string{
8753 "bcp_lib1_non_updateable": []string{
8754 "foo.bar",
8755 },
8756 // 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 +01008757 },
8758 },
8759 }
8760 for _, tc := range testcases {
8761 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008762 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8763 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008764 })
8765 }
8766}
8767
Jiyong Park62304bb2020-04-13 16:19:48 +09008768func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008769 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008770 apex {
8771 name: "myapex",
8772 key: "myapex.key",
8773 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008774 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008775 }
8776
8777 apex_key {
8778 name: "myapex.key",
8779 public_key: "testkey.avbpubkey",
8780 private_key: "testkey.pem",
8781 }
8782
8783 cc_library {
8784 name: "mylib",
8785 srcs: ["mylib.cpp"],
8786 system_shared_libs: [],
8787 stl: "none",
8788 stubs: {
8789 versions: ["1"],
8790 },
8791 apex_available: ["myapex"],
8792 }
8793
8794 cc_library {
8795 name: "myprivlib",
8796 srcs: ["mylib.cpp"],
8797 system_shared_libs: [],
8798 stl: "none",
8799 apex_available: ["myapex"],
8800 }
8801
8802
8803 cc_test {
8804 name: "mytest",
8805 gtest: false,
8806 srcs: ["mylib.cpp"],
8807 system_shared_libs: [],
8808 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008809 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008810 test_for: ["myapex"]
8811 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008812
8813 cc_library {
8814 name: "mytestlib",
8815 srcs: ["mylib.cpp"],
8816 system_shared_libs: [],
8817 shared_libs: ["mylib", "myprivlib"],
8818 stl: "none",
8819 test_for: ["myapex"],
8820 }
8821
8822 cc_benchmark {
8823 name: "mybench",
8824 srcs: ["mylib.cpp"],
8825 system_shared_libs: [],
8826 shared_libs: ["mylib", "myprivlib"],
8827 stl: "none",
8828 test_for: ["myapex"],
8829 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008830 `)
8831
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008832 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008833 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008834 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8835 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8836 }
8837
8838 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008839 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008840 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8841 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8842 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8843}
Jiyong Park46a512f2020-12-04 18:02:13 +09008844
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008845func TestIndirectTestFor(t *testing.T) {
8846 ctx := testApex(t, `
8847 apex {
8848 name: "myapex",
8849 key: "myapex.key",
8850 native_shared_libs: ["mylib", "myprivlib"],
8851 updatable: false,
8852 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008853
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008854 apex_key {
8855 name: "myapex.key",
8856 public_key: "testkey.avbpubkey",
8857 private_key: "testkey.pem",
8858 }
8859
8860 cc_library {
8861 name: "mylib",
8862 srcs: ["mylib.cpp"],
8863 system_shared_libs: [],
8864 stl: "none",
8865 stubs: {
8866 versions: ["1"],
8867 },
8868 apex_available: ["myapex"],
8869 }
8870
8871 cc_library {
8872 name: "myprivlib",
8873 srcs: ["mylib.cpp"],
8874 system_shared_libs: [],
8875 stl: "none",
8876 shared_libs: ["mylib"],
8877 apex_available: ["myapex"],
8878 }
8879
8880 cc_library {
8881 name: "mytestlib",
8882 srcs: ["mylib.cpp"],
8883 system_shared_libs: [],
8884 shared_libs: ["myprivlib"],
8885 stl: "none",
8886 test_for: ["myapex"],
8887 }
8888 `)
8889
8890 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008891 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008892 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8893 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8894 }
8895
8896 // The platform variant of mytestlib links to the platform variant of the
8897 // internal myprivlib.
8898 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8899
8900 // The platform variant of myprivlib links to the platform variant of mylib
8901 // and bypasses its stubs.
8902 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 +09008903}
8904
Martin Stjernholmec009002021-03-27 15:18:31 +00008905func TestTestForForLibInOtherApex(t *testing.T) {
8906 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8907 _ = testApex(t, `
8908 apex {
8909 name: "com.android.art",
8910 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008911 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008912 updatable: false,
8913 }
8914
8915 apex {
8916 name: "com.android.art.debug",
8917 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008918 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008919 updatable: false,
8920 }
8921
8922 apex_key {
8923 name: "myapex.key",
8924 public_key: "testkey.avbpubkey",
8925 private_key: "testkey.pem",
8926 }
8927
8928 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008929 name: "libnativebridge",
8930 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008931 system_shared_libs: [],
8932 stl: "none",
8933 stubs: {
8934 versions: ["1"],
8935 },
8936 apex_available: ["com.android.art", "com.android.art.debug"],
8937 }
8938
8939 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008940 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008941 srcs: ["mylib.cpp"],
8942 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008943 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008944 stl: "none",
8945 apex_available: ["com.android.art.debug"],
8946 test_for: ["com.android.art"],
8947 }
8948 `,
8949 android.MockFS{
8950 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8951 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8952 }.AddToFixture())
8953}
8954
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008955// TODO(jungjw): Move this to proptools
8956func intPtr(i int) *int {
8957 return &i
8958}
8959
8960func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008961 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008962 apex_set {
8963 name: "myapex",
8964 set: "myapex.apks",
8965 filename: "foo_v2.apex",
8966 overrides: ["foo"],
8967 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008968 `,
8969 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8970 variables.Platform_sdk_version = intPtr(30)
8971 }),
8972 android.FixtureModifyConfig(func(config android.Config) {
8973 config.Targets[android.Android] = []android.Target{
8974 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8975 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8976 }
8977 }),
8978 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008979
Paul Duffin24704672021-04-06 16:09:30 +01008980 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008981
8982 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008983 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008984 actual := extractedApex.Args["abis"]
8985 expected := "ARMEABI_V7A,ARM64_V8A"
8986 if actual != expected {
8987 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8988 }
8989 actual = extractedApex.Args["sdk-version"]
8990 expected = "30"
8991 if actual != expected {
8992 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8993 }
8994
Paul Duffin6717d882021-06-15 19:09:41 +01008995 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008996 a := m.Module().(*ApexSet)
8997 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008998 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008999 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9000 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9001 }
9002}
9003
Anton Hansson805e0a52022-11-25 14:06:46 +00009004func TestApexSet_NativeBridge(t *testing.T) {
9005 ctx := testApex(t, `
9006 apex_set {
9007 name: "myapex",
9008 set: "myapex.apks",
9009 filename: "foo_v2.apex",
9010 overrides: ["foo"],
9011 }
9012 `,
9013 android.FixtureModifyConfig(func(config android.Config) {
9014 config.Targets[android.Android] = []android.Target{
9015 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9016 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9017 }
9018 }),
9019 )
9020
9021 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9022
9023 // Check extract_apks tool parameters. No native bridge arch expected
9024 extractedApex := m.Output("extracted/myapex.apks")
9025 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9026}
9027
Jiyong Park7d95a512020-05-10 15:16:24 +09009028func TestNoStaticLinkingToStubsLib(t *testing.T) {
9029 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9030 apex {
9031 name: "myapex",
9032 key: "myapex.key",
9033 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009034 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009035 }
9036
9037 apex_key {
9038 name: "myapex.key",
9039 public_key: "testkey.avbpubkey",
9040 private_key: "testkey.pem",
9041 }
9042
9043 cc_library {
9044 name: "mylib",
9045 srcs: ["mylib.cpp"],
9046 static_libs: ["otherlib"],
9047 system_shared_libs: [],
9048 stl: "none",
9049 apex_available: [ "myapex" ],
9050 }
9051
9052 cc_library {
9053 name: "otherlib",
9054 srcs: ["mylib.cpp"],
9055 system_shared_libs: [],
9056 stl: "none",
9057 stubs: {
9058 versions: ["1", "2", "3"],
9059 },
9060 apex_available: [ "myapex" ],
9061 }
9062 `)
9063}
9064
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009065func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009066 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009067 apex {
9068 name: "myapex",
9069 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009070 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009071 custom_sign_tool: "sign_myapex",
9072 }
9073
9074 apex_key {
9075 name: "myapex.key",
9076 public_key: "testkey.avbpubkey",
9077 private_key: "testkey.pem",
9078 }
9079 `)
9080
9081 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9082 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009083 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 +09009084}
9085
9086func TestApexKeysTxtOverrides(t *testing.T) {
9087 ctx := testApex(t, `
9088 apex {
9089 name: "myapex",
9090 key: "myapex.key",
9091 updatable: false,
9092 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009093 }
9094
9095 apex_key {
9096 name: "myapex.key",
9097 public_key: "testkey.avbpubkey",
9098 private_key: "testkey.pem",
9099 }
9100
9101 prebuilt_apex {
9102 name: "myapex",
9103 prefer: true,
9104 arch: {
9105 arm64: {
9106 src: "myapex-arm64.apex",
9107 },
9108 arm: {
9109 src: "myapex-arm.apex",
9110 },
9111 },
9112 }
9113
9114 apex_set {
9115 name: "myapex_set",
9116 set: "myapex.apks",
9117 filename: "myapex_set.apex",
9118 overrides: ["myapex"],
9119 }
9120 `)
9121
9122 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9123 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9124 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 +09009125 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 +09009126}
9127
Jooyung Han938b5932020-06-20 12:47:47 +09009128func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009129 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009130 apex {
9131 name: "myapex",
9132 key: "myapex.key",
9133 apps: ["app"],
9134 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009135 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009136 }
9137
9138 apex_key {
9139 name: "myapex.key",
9140 public_key: "testkey.avbpubkey",
9141 private_key: "testkey.pem",
9142 }
9143
9144 android_app {
9145 name: "app",
9146 srcs: ["foo/bar/MyClass.java"],
9147 package_name: "foo",
9148 sdk_version: "none",
9149 system_modules: "none",
9150 apex_available: [ "myapex" ],
9151 }
9152 `, withFiles(map[string][]byte{
9153 "sub/Android.bp": []byte(`
9154 override_apex {
9155 name: "override_myapex",
9156 base: "myapex",
9157 apps: ["override_app"],
9158 allowed_files: ":allowed",
9159 }
9160 // Overridable "path" property should be referenced indirectly
9161 filegroup {
9162 name: "allowed",
9163 srcs: ["allowed.txt"],
9164 }
9165 override_android_app {
9166 name: "override_app",
9167 base: "app",
9168 package_name: "bar",
9169 }
9170 `),
9171 }))
9172
Jooyung Hana0503a52023-08-23 13:12:50 +09009173 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009174 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9175 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9176 }
9177
Jooyung Hana0503a52023-08-23 13:12:50 +09009178 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009179 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9180 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9181 }
9182}
9183
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009184func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009185 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009186 apex {
9187 name: "myapex",
9188 key: "myapex.key",
9189 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009190 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009191 }
9192
9193 apex_key {
9194 name: "myapex.key",
9195 public_key: "testkey.avbpubkey",
9196 private_key: "testkey.pem",
9197 }
9198
9199 cc_library {
9200 name: "mylib",
9201 srcs: ["mylib.cpp"],
9202 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009203 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009204 },
9205 apex_available: ["myapex"],
9206 }
9207
9208 cc_prebuilt_library_shared {
9209 name: "mylib",
9210 prefer: false,
9211 srcs: ["prebuilt.so"],
9212 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009213 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009214 },
9215 apex_available: ["myapex"],
9216 }
9217 `)
9218}
9219
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009220func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009221 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009222 apex {
9223 name: "myapex",
9224 key: "myapex.key",
9225 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009226 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009227 }
9228 apex_key {
9229 name: "myapex.key",
9230 public_key: "testkey.avbpubkey",
9231 private_key: "testkey.pem",
9232 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009233 `,
9234 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9235 variables.CompressedApex = proptools.BoolPtr(true)
9236 }),
9237 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009238
Jooyung Hana0503a52023-08-23 13:12:50 +09009239 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009240 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9241
Jooyung Hana0503a52023-08-23 13:12:50 +09009242 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009243 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9244
9245 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009246 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009247 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9248
9249 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009250 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009251 var builder strings.Builder
9252 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9253 androidMk := builder.String()
9254 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9255}
9256
Martin Stjernholm2856c662020-12-02 15:03:42 +00009257func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009258 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009259 apex {
9260 name: "myapex",
9261 key: "myapex.key",
9262 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009263 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009264 }
9265
9266 apex_key {
9267 name: "myapex.key",
9268 public_key: "testkey.avbpubkey",
9269 private_key: "testkey.pem",
9270 }
9271
9272 cc_library {
9273 name: "mylib",
9274 srcs: ["mylib.cpp"],
9275 apex_available: ["myapex"],
9276 shared_libs: ["otherlib"],
9277 system_shared_libs: [],
9278 }
9279
9280 cc_library {
9281 name: "otherlib",
9282 srcs: ["mylib.cpp"],
9283 stubs: {
9284 versions: ["current"],
9285 },
9286 }
9287
9288 cc_prebuilt_library_shared {
9289 name: "otherlib",
9290 prefer: true,
9291 srcs: ["prebuilt.so"],
9292 stubs: {
9293 versions: ["current"],
9294 },
9295 }
9296 `)
9297
Jooyung Hana0503a52023-08-23 13:12:50 +09009298 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009299 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009300 var builder strings.Builder
9301 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9302 androidMk := builder.String()
9303
9304 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9305 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009306 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009307}
9308
Jiyong Parke3867542020-12-03 17:28:25 +09009309func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009310 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009311 apex {
9312 name: "myapex",
9313 key: "myapex.key",
9314 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009315 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009316 }
9317
9318 apex_key {
9319 name: "myapex.key",
9320 public_key: "testkey.avbpubkey",
9321 private_key: "testkey.pem",
9322 }
9323
9324 cc_library {
9325 name: "mylib",
9326 srcs: ["mylib.cpp"],
9327 system_shared_libs: [],
9328 stl: "none",
9329 apex_available: ["myapex"],
9330 shared_libs: ["mylib2"],
9331 target: {
9332 apex: {
9333 exclude_shared_libs: ["mylib2"],
9334 },
9335 },
9336 }
9337
9338 cc_library {
9339 name: "mylib2",
9340 srcs: ["mylib.cpp"],
9341 system_shared_libs: [],
9342 stl: "none",
9343 }
9344 `)
9345
9346 // Check if mylib is linked to mylib2 for the non-apex target
9347 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9348 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9349
9350 // Make sure that the link doesn't occur for the apex target
9351 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9352 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9353
9354 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009355 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009356 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9357}
9358
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009359func TestPrebuiltStubLibDep(t *testing.T) {
9360 bpBase := `
9361 apex {
9362 name: "myapex",
9363 key: "myapex.key",
9364 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009365 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009366 }
9367 apex_key {
9368 name: "myapex.key",
9369 public_key: "testkey.avbpubkey",
9370 private_key: "testkey.pem",
9371 }
9372 cc_library {
9373 name: "mylib",
9374 srcs: ["mylib.cpp"],
9375 apex_available: ["myapex"],
9376 shared_libs: ["stublib"],
9377 system_shared_libs: [],
9378 }
9379 apex {
9380 name: "otherapex",
9381 enabled: %s,
9382 key: "myapex.key",
9383 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009384 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009385 }
9386 `
9387
9388 stublibSourceBp := `
9389 cc_library {
9390 name: "stublib",
9391 srcs: ["mylib.cpp"],
9392 apex_available: ["otherapex"],
9393 system_shared_libs: [],
9394 stl: "none",
9395 stubs: {
9396 versions: ["1"],
9397 },
9398 }
9399 `
9400
9401 stublibPrebuiltBp := `
9402 cc_prebuilt_library_shared {
9403 name: "stublib",
9404 srcs: ["prebuilt.so"],
9405 apex_available: ["otherapex"],
9406 stubs: {
9407 versions: ["1"],
9408 },
9409 %s
9410 }
9411 `
9412
9413 tests := []struct {
9414 name string
9415 stublibBp string
9416 usePrebuilt bool
9417 modNames []string // Modules to collect AndroidMkEntries for
9418 otherApexEnabled []string
9419 }{
9420 {
9421 name: "only_source",
9422 stublibBp: stublibSourceBp,
9423 usePrebuilt: false,
9424 modNames: []string{"stublib"},
9425 otherApexEnabled: []string{"true", "false"},
9426 },
9427 {
9428 name: "source_preferred",
9429 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9430 usePrebuilt: false,
9431 modNames: []string{"stublib", "prebuilt_stublib"},
9432 otherApexEnabled: []string{"true", "false"},
9433 },
9434 {
9435 name: "prebuilt_preferred",
9436 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9437 usePrebuilt: true,
9438 modNames: []string{"stublib", "prebuilt_stublib"},
9439 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9440 },
9441 {
9442 name: "only_prebuilt",
9443 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9444 usePrebuilt: true,
9445 modNames: []string{"stublib"},
9446 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9447 },
9448 }
9449
9450 for _, test := range tests {
9451 t.Run(test.name, func(t *testing.T) {
9452 for _, otherApexEnabled := range test.otherApexEnabled {
9453 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009454 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009455
9456 type modAndMkEntries struct {
9457 mod *cc.Module
9458 mkEntries android.AndroidMkEntries
9459 }
9460 entries := []*modAndMkEntries{}
9461
9462 // Gather shared lib modules that are installable
9463 for _, modName := range test.modNames {
9464 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9465 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9466 continue
9467 }
9468 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009469 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009470 continue
9471 }
Colin Crossaa255532020-07-03 13:18:24 -07009472 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009473 if ent.Disabled {
9474 continue
9475 }
9476 entries = append(entries, &modAndMkEntries{
9477 mod: mod,
9478 mkEntries: ent,
9479 })
9480 }
9481 }
9482 }
9483
9484 var entry *modAndMkEntries = nil
9485 for _, ent := range entries {
9486 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9487 if entry != nil {
9488 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9489 } else {
9490 entry = ent
9491 }
9492 }
9493 }
9494
9495 if entry == nil {
9496 t.Errorf("AndroidMk entry for \"stublib\" missing")
9497 } else {
9498 isPrebuilt := entry.mod.Prebuilt() != nil
9499 if isPrebuilt != test.usePrebuilt {
9500 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9501 }
9502 if !entry.mod.IsStubs() {
9503 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9504 }
9505 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9506 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9507 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009508 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009509 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009510 if !android.InList(expected, cflags) {
9511 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9512 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009513 }
9514 })
9515 }
9516 })
9517 }
9518}
9519
Colin Crossc33e5212021-05-25 18:16:02 -07009520func TestApexJavaCoverage(t *testing.T) {
9521 bp := `
9522 apex {
9523 name: "myapex",
9524 key: "myapex.key",
9525 java_libs: ["mylib"],
9526 bootclasspath_fragments: ["mybootclasspathfragment"],
9527 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9528 updatable: false,
9529 }
9530
9531 apex_key {
9532 name: "myapex.key",
9533 public_key: "testkey.avbpubkey",
9534 private_key: "testkey.pem",
9535 }
9536
9537 java_library {
9538 name: "mylib",
9539 srcs: ["mylib.java"],
9540 apex_available: ["myapex"],
9541 compile_dex: true,
9542 }
9543
9544 bootclasspath_fragment {
9545 name: "mybootclasspathfragment",
9546 contents: ["mybootclasspathlib"],
9547 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009548 hidden_api: {
9549 split_packages: ["*"],
9550 },
Colin Crossc33e5212021-05-25 18:16:02 -07009551 }
9552
9553 java_library {
9554 name: "mybootclasspathlib",
9555 srcs: ["mybootclasspathlib.java"],
9556 apex_available: ["myapex"],
9557 compile_dex: true,
9558 }
9559
9560 systemserverclasspath_fragment {
9561 name: "mysystemserverclasspathfragment",
9562 contents: ["mysystemserverclasspathlib"],
9563 apex_available: ["myapex"],
9564 }
9565
9566 java_library {
9567 name: "mysystemserverclasspathlib",
9568 srcs: ["mysystemserverclasspathlib.java"],
9569 apex_available: ["myapex"],
9570 compile_dex: true,
9571 }
9572 `
9573
9574 result := android.GroupFixturePreparers(
9575 PrepareForTestWithApexBuildComponents,
9576 prepareForTestWithMyapex,
9577 java.PrepareForTestWithJavaDefaultModules,
9578 android.PrepareForTestWithAndroidBuildComponents,
9579 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009580 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9581 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009582 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009583 ).RunTest(t)
9584
9585 // Make sure jacoco ran on both mylib and mybootclasspathlib
9586 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9587 t.Errorf("Failed to find jacoco rule for mylib")
9588 }
9589 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9590 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9591 }
9592 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9593 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9594 }
9595}
9596
Jiyong Park192600a2021-08-03 07:52:17 +00009597func TestProhibitStaticExecutable(t *testing.T) {
9598 testApexError(t, `executable mybin is static`, `
9599 apex {
9600 name: "myapex",
9601 key: "myapex.key",
9602 binaries: ["mybin"],
9603 min_sdk_version: "29",
9604 }
9605
9606 apex_key {
9607 name: "myapex.key",
9608 public_key: "testkey.avbpubkey",
9609 private_key: "testkey.pem",
9610 }
9611
9612 cc_binary {
9613 name: "mybin",
9614 srcs: ["mylib.cpp"],
9615 relative_install_path: "foo/bar",
9616 static_executable: true,
9617 system_shared_libs: [],
9618 stl: "none",
9619 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009620 min_sdk_version: "29",
9621 }
9622 `)
9623
9624 testApexError(t, `executable mybin.rust is static`, `
9625 apex {
9626 name: "myapex",
9627 key: "myapex.key",
9628 binaries: ["mybin.rust"],
9629 min_sdk_version: "29",
9630 }
9631
9632 apex_key {
9633 name: "myapex.key",
9634 public_key: "testkey.avbpubkey",
9635 private_key: "testkey.pem",
9636 }
9637
9638 rust_binary {
9639 name: "mybin.rust",
9640 srcs: ["foo.rs"],
9641 static_executable: true,
9642 apex_available: ["myapex"],
9643 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009644 }
9645 `)
9646}
9647
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009648func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9649 ctx := testApex(t, `
9650 apex {
9651 name: "myapex",
9652 key: "myapex.key",
9653 updatable: false,
9654 java_libs: ["foo"],
9655 }
9656
9657 apex_key {
9658 name: "myapex.key",
9659 public_key: "testkey.avbpubkey",
9660 private_key: "testkey.pem",
9661 }
9662
9663 java_library {
9664 name: "foo",
9665 srcs: ["foo.java"],
9666 apex_available: ["myapex"],
9667 installable: true,
9668 }
9669 `,
9670 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9671 )
9672
Jooyung Hana0503a52023-08-23 13:12:50 +09009673 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009674 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9675 var builder strings.Builder
9676 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9677 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009678 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 +00009679}
9680
9681func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9682 ctx := testApex(t, `
9683 prebuilt_apex {
9684 name: "myapex",
9685 arch: {
9686 arm64: {
9687 src: "myapex-arm64.apex",
9688 },
9689 arm: {
9690 src: "myapex-arm.apex",
9691 },
9692 },
9693 exported_java_libs: ["foo"],
9694 }
9695
9696 java_import {
9697 name: "foo",
9698 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009699 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009700 }
9701 `,
9702 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9703 )
9704
9705 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9706 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9707 mainModuleEntries := entriesList[0]
9708 android.AssertArrayString(t,
9709 "LOCAL_REQUIRED_MODULES",
9710 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9711 []string{
9712 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9713 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9714 })
9715}
9716
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009717func TestAndroidMk_RequiredModules(t *testing.T) {
9718 ctx := testApex(t, `
9719 apex {
9720 name: "myapex",
9721 key: "myapex.key",
9722 updatable: false,
9723 java_libs: ["foo"],
9724 required: ["otherapex"],
9725 }
9726
9727 apex {
9728 name: "otherapex",
9729 key: "myapex.key",
9730 updatable: false,
9731 java_libs: ["foo"],
9732 required: ["otherapex"],
9733 }
9734
9735 apex_key {
9736 name: "myapex.key",
9737 public_key: "testkey.avbpubkey",
9738 private_key: "testkey.pem",
9739 }
9740
9741 java_library {
9742 name: "foo",
9743 srcs: ["foo.java"],
9744 apex_available: ["myapex", "otherapex"],
9745 installable: true,
9746 }
9747 `)
9748
Jooyung Hana0503a52023-08-23 13:12:50 +09009749 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009750 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9751 var builder strings.Builder
9752 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9753 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009754 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009755}
9756
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009757func TestAndroidMk_RequiredDeps(t *testing.T) {
9758 ctx := testApex(t, `
9759 apex {
9760 name: "myapex",
9761 key: "myapex.key",
9762 updatable: false,
9763 }
9764
9765 apex_key {
9766 name: "myapex.key",
9767 public_key: "testkey.avbpubkey",
9768 private_key: "testkey.pem",
9769 }
9770 `)
9771
Jooyung Hana0503a52023-08-23 13:12:50 +09009772 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009773 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009774 data := android.AndroidMkDataForTest(t, ctx, bundle)
9775 var builder strings.Builder
9776 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9777 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009778 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009779}
9780
Jooyung Hana6d36672022-02-24 13:58:07 +09009781func TestApexOutputFileProducer(t *testing.T) {
9782 for _, tc := range []struct {
9783 name string
9784 ref string
9785 expected_data []string
9786 }{
9787 {
9788 name: "test_using_output",
9789 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009790 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009791 },
9792 {
9793 name: "test_using_apex",
9794 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009795 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009796 },
9797 } {
9798 t.Run(tc.name, func(t *testing.T) {
9799 ctx := testApex(t, `
9800 apex {
9801 name: "myapex",
9802 key: "myapex.key",
9803 compressible: true,
9804 updatable: false,
9805 }
9806
9807 apex_key {
9808 name: "myapex.key",
9809 public_key: "testkey.avbpubkey",
9810 private_key: "testkey.pem",
9811 }
9812
9813 java_test {
9814 name: "`+tc.name+`",
9815 srcs: ["a.java"],
9816 data: ["`+tc.ref+`"],
9817 }
9818 `,
9819 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9820 variables.CompressedApex = proptools.BoolPtr(true)
9821 }))
9822 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9823 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9824 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9825 })
9826 }
9827}
9828
satayev758968a2021-12-06 11:42:40 +00009829func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9830 preparer := android.GroupFixturePreparers(
9831 PrepareForTestWithApexBuildComponents,
9832 prepareForTestWithMyapex,
9833 java.PrepareForTestWithJavaSdkLibraryFiles,
9834 java.PrepareForTestWithJavaDefaultModules,
9835 android.PrepareForTestWithAndroidBuildComponents,
9836 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9837 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9838 )
9839
9840 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9841 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9842 preparer.RunTestWithBp(t, `
9843 apex {
9844 name: "myapex",
9845 key: "myapex.key",
9846 bootclasspath_fragments: ["mybootclasspathfragment"],
9847 min_sdk_version: "30",
9848 updatable: false,
9849 }
9850
9851 apex_key {
9852 name: "myapex.key",
9853 public_key: "testkey.avbpubkey",
9854 private_key: "testkey.pem",
9855 }
9856
9857 bootclasspath_fragment {
9858 name: "mybootclasspathfragment",
9859 contents: ["mybootclasspathlib"],
9860 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009861 hidden_api: {
9862 split_packages: ["*"],
9863 },
satayev758968a2021-12-06 11:42:40 +00009864 }
9865
9866 java_sdk_library {
9867 name: "mybootclasspathlib",
9868 srcs: ["mybootclasspathlib.java"],
9869 apex_available: ["myapex"],
9870 compile_dex: true,
9871 unsafe_ignore_missing_latest_api: true,
9872 min_sdk_version: "31",
9873 static_libs: ["util"],
9874 }
9875
9876 java_library {
9877 name: "util",
9878 srcs: ["a.java"],
9879 apex_available: ["myapex"],
9880 min_sdk_version: "31",
9881 static_libs: ["another_util"],
9882 }
9883
9884 java_library {
9885 name: "another_util",
9886 srcs: ["a.java"],
9887 min_sdk_version: "31",
9888 apex_available: ["myapex"],
9889 }
9890 `)
9891 })
9892
9893 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9894 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9895 preparer.RunTestWithBp(t, `
9896 apex {
9897 name: "myapex",
9898 key: "myapex.key",
9899 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9900 min_sdk_version: "30",
9901 updatable: false,
9902 }
9903
9904 apex_key {
9905 name: "myapex.key",
9906 public_key: "testkey.avbpubkey",
9907 private_key: "testkey.pem",
9908 }
9909
9910 systemserverclasspath_fragment {
9911 name: "mysystemserverclasspathfragment",
9912 contents: ["mysystemserverclasspathlib"],
9913 apex_available: ["myapex"],
9914 }
9915
9916 java_sdk_library {
9917 name: "mysystemserverclasspathlib",
9918 srcs: ["mysystemserverclasspathlib.java"],
9919 apex_available: ["myapex"],
9920 compile_dex: true,
9921 min_sdk_version: "32",
9922 unsafe_ignore_missing_latest_api: true,
9923 static_libs: ["util"],
9924 }
9925
9926 java_library {
9927 name: "util",
9928 srcs: ["a.java"],
9929 apex_available: ["myapex"],
9930 min_sdk_version: "31",
9931 static_libs: ["another_util"],
9932 }
9933
9934 java_library {
9935 name: "another_util",
9936 srcs: ["a.java"],
9937 min_sdk_version: "31",
9938 apex_available: ["myapex"],
9939 }
9940 `)
9941 })
9942
9943 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9944 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9945 RunTestWithBp(t, `
9946 apex {
9947 name: "myapex",
9948 key: "myapex.key",
9949 bootclasspath_fragments: ["mybootclasspathfragment"],
9950 min_sdk_version: "30",
9951 updatable: false,
9952 }
9953
9954 apex_key {
9955 name: "myapex.key",
9956 public_key: "testkey.avbpubkey",
9957 private_key: "testkey.pem",
9958 }
9959
9960 bootclasspath_fragment {
9961 name: "mybootclasspathfragment",
9962 contents: ["mybootclasspathlib"],
9963 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009964 hidden_api: {
9965 split_packages: ["*"],
9966 },
satayev758968a2021-12-06 11:42:40 +00009967 }
9968
9969 java_sdk_library {
9970 name: "mybootclasspathlib",
9971 srcs: ["mybootclasspathlib.java"],
9972 apex_available: ["myapex"],
9973 compile_dex: true,
9974 unsafe_ignore_missing_latest_api: true,
9975 }
9976 `)
9977 })
9978
9979 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9980 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9981 RunTestWithBp(t, `
9982 apex {
9983 name: "myapex",
9984 key: "myapex.key",
9985 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9986 min_sdk_version: "30",
9987 updatable: false,
9988 }
9989
9990 apex_key {
9991 name: "myapex.key",
9992 public_key: "testkey.avbpubkey",
9993 private_key: "testkey.pem",
9994 }
9995
9996 systemserverclasspath_fragment {
9997 name: "mysystemserverclasspathfragment",
9998 contents: ["mysystemserverclasspathlib"],
9999 apex_available: ["myapex"],
10000 }
10001
10002 java_sdk_library {
10003 name: "mysystemserverclasspathlib",
10004 srcs: ["mysystemserverclasspathlib.java"],
10005 apex_available: ["myapex"],
10006 compile_dex: true,
10007 unsafe_ignore_missing_latest_api: true,
10008 }
10009 `)
10010 })
10011}
10012
Jiakai Zhang6decef92022-01-12 17:56:19 +000010013// Verifies that the APEX depends on all the Make modules in the list.
10014func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10015 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10016 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010017 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010018 }
10019}
10020
10021// Verifies that the APEX does not depend on any of the Make modules in the list.
10022func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10023 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10024 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010025 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010026 }
10027}
10028
Cole Faust1021ccd2023-02-26 21:15:25 -080010029// TODO(b/193460475): Re-enable this test
10030//func TestApexStrictUpdtabilityLint(t *testing.T) {
10031// bpTemplate := `
10032// apex {
10033// name: "myapex",
10034// key: "myapex.key",
10035// java_libs: ["myjavalib"],
10036// updatable: %v,
10037// min_sdk_version: "29",
10038// }
10039// apex_key {
10040// name: "myapex.key",
10041// }
10042// java_library {
10043// name: "myjavalib",
10044// srcs: ["MyClass.java"],
10045// apex_available: [ "myapex" ],
10046// lint: {
10047// strict_updatability_linting: %v,
10048// },
10049// sdk_version: "current",
10050// min_sdk_version: "29",
10051// }
10052// `
10053// fs := android.MockFS{
10054// "lint-baseline.xml": nil,
10055// }
10056//
10057// testCases := []struct {
10058// testCaseName string
10059// apexUpdatable bool
10060// javaStrictUpdtabilityLint bool
10061// lintFileExists bool
10062// disallowedFlagExpected bool
10063// }{
10064// {
10065// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10066// apexUpdatable: true,
10067// javaStrictUpdtabilityLint: true,
10068// lintFileExists: false,
10069// disallowedFlagExpected: false,
10070// },
10071// {
10072// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10073// apexUpdatable: false,
10074// javaStrictUpdtabilityLint: false,
10075// lintFileExists: true,
10076// disallowedFlagExpected: false,
10077// },
10078// {
10079// testCaseName: "non-updatable apex respects strict updatability of javalib",
10080// apexUpdatable: false,
10081// javaStrictUpdtabilityLint: true,
10082// lintFileExists: true,
10083// disallowedFlagExpected: true,
10084// },
10085// {
10086// testCaseName: "updatable apex sets strict updatability of javalib to true",
10087// apexUpdatable: true,
10088// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10089// lintFileExists: true,
10090// disallowedFlagExpected: true,
10091// },
10092// }
10093//
10094// for _, testCase := range testCases {
10095// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10096// fixtures := []android.FixturePreparer{}
10097// if testCase.lintFileExists {
10098// fixtures = append(fixtures, fs.AddToFixture())
10099// }
10100//
10101// result := testApex(t, bp, fixtures...)
10102// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10103// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10104// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10105//
10106// if disallowedFlagActual != testCase.disallowedFlagExpected {
10107// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10108// }
10109// }
10110//}
10111//
10112//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10113// bp := `
10114// apex {
10115// name: "myapex",
10116// key: "myapex.key",
10117// java_libs: ["myjavalib"],
10118// updatable: true,
10119// min_sdk_version: "29",
10120// }
10121// apex_key {
10122// name: "myapex.key",
10123// }
10124// java_library {
10125// name: "myjavalib",
10126// srcs: ["MyClass.java"],
10127// apex_available: [ "myapex" ],
10128// sdk_version: "current",
10129// min_sdk_version: "29",
10130// }
10131// `
10132//
10133// testCases := []struct {
10134// testCaseName string
10135// moduleDirectory string
10136// disallowedFlagExpected bool
10137// }{
10138// {
10139// testCaseName: "lintable module defined outside libcore",
10140// moduleDirectory: "",
10141// disallowedFlagExpected: true,
10142// },
10143// {
10144// testCaseName: "lintable module defined in libcore root directory",
10145// moduleDirectory: "libcore/",
10146// disallowedFlagExpected: false,
10147// },
10148// {
10149// testCaseName: "lintable module defined in libcore child directory",
10150// moduleDirectory: "libcore/childdir/",
10151// disallowedFlagExpected: true,
10152// },
10153// }
10154//
10155// for _, testCase := range testCases {
10156// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10157// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10158// result := testApex(t, "", lintFileCreator, bpFileCreator)
10159// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10160// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10161// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10162// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10163//
10164// if disallowedFlagActual != testCase.disallowedFlagExpected {
10165// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10166// }
10167// }
10168//}
10169//
10170//// checks transtive deps of an apex coming from bootclasspath_fragment
10171//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10172// bp := `
10173// apex {
10174// name: "myapex",
10175// key: "myapex.key",
10176// bootclasspath_fragments: ["mybootclasspathfragment"],
10177// updatable: true,
10178// min_sdk_version: "29",
10179// }
10180// apex_key {
10181// name: "myapex.key",
10182// }
10183// bootclasspath_fragment {
10184// name: "mybootclasspathfragment",
10185// contents: ["myjavalib"],
10186// apex_available: ["myapex"],
10187// hidden_api: {
10188// split_packages: ["*"],
10189// },
10190// }
10191// java_library {
10192// name: "myjavalib",
10193// srcs: ["MyClass.java"],
10194// apex_available: [ "myapex" ],
10195// sdk_version: "current",
10196// min_sdk_version: "29",
10197// compile_dex: true,
10198// }
10199// `
10200// fs := android.MockFS{
10201// "lint-baseline.xml": nil,
10202// }
10203//
10204// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10205// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10206// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10207// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10208// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10209// }
10210//}
Spandan Das66773252022-01-15 00:23:18 +000010211
Spandan Das42e89502022-05-06 22:12:55 +000010212// updatable apexes should propagate updatable=true to its apps
10213func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10214 bp := `
10215 apex {
10216 name: "myapex",
10217 key: "myapex.key",
10218 updatable: %v,
10219 apps: [
10220 "myapp",
10221 ],
10222 min_sdk_version: "30",
10223 }
10224 apex_key {
10225 name: "myapex.key",
10226 }
10227 android_app {
10228 name: "myapp",
10229 updatable: %v,
10230 apex_available: [
10231 "myapex",
10232 ],
10233 sdk_version: "current",
10234 min_sdk_version: "30",
10235 }
10236 `
10237 testCases := []struct {
10238 name string
10239 apex_is_updatable_bp bool
10240 app_is_updatable_bp bool
10241 app_is_updatable_expected bool
10242 }{
10243 {
10244 name: "Non-updatable apex respects updatable property of non-updatable app",
10245 apex_is_updatable_bp: false,
10246 app_is_updatable_bp: false,
10247 app_is_updatable_expected: false,
10248 },
10249 {
10250 name: "Non-updatable apex respects updatable property of updatable app",
10251 apex_is_updatable_bp: false,
10252 app_is_updatable_bp: true,
10253 app_is_updatable_expected: true,
10254 },
10255 {
10256 name: "Updatable apex respects updatable property of updatable app",
10257 apex_is_updatable_bp: true,
10258 app_is_updatable_bp: true,
10259 app_is_updatable_expected: true,
10260 },
10261 {
10262 name: "Updatable apex sets updatable=true on non-updatable app",
10263 apex_is_updatable_bp: true,
10264 app_is_updatable_bp: false,
10265 app_is_updatable_expected: true,
10266 },
10267 }
10268 for _, testCase := range testCases {
10269 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10270 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10271 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10272 }
10273}
10274
Kiyoung Kim487689e2022-07-26 09:48:22 +090010275func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10276 bp := `
10277 apex {
10278 name: "myapex",
10279 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010280 native_shared_libs: ["libbaz"],
10281 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010282 min_sdk_version: "29",
10283 }
10284 apex_key {
10285 name: "myapex.key",
10286 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010287 cc_binary {
10288 name: "binfoo",
10289 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010290 apex_available: ["myapex"],
10291 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010292 recovery_available: false,
10293 }
10294 cc_library {
10295 name: "libbar",
10296 srcs: ["libbar.cc"],
10297 stubs: {
10298 symbol_file: "libbar.map.txt",
10299 versions: [
10300 "29",
10301 ],
10302 },
10303 }
10304 cc_library {
10305 name: "libbaz",
10306 srcs: ["libbaz.cc"],
10307 apex_available: ["myapex"],
10308 min_sdk_version: "29",
10309 stubs: {
10310 symbol_file: "libbaz.map.txt",
10311 versions: [
10312 "29",
10313 ],
10314 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010315 }
10316 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010317 name: "libbar",
10318 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010319 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010320 variants: ["apex.29"],
10321 }
10322 cc_api_variant {
10323 name: "libbar",
10324 variant: "apex",
10325 version: "29",
10326 src: "libbar_apex_29.so",
10327 }
10328 cc_api_library {
10329 name: "libbaz",
10330 src: "libbaz_stub.so",
10331 min_sdk_version: "29",
10332 variants: ["apex.29"],
10333 }
10334 cc_api_variant {
10335 name: "libbaz",
10336 variant: "apex",
10337 version: "29",
10338 src: "libbaz_apex_29.so",
10339 }
10340 cc_api_library {
10341 name: "libqux",
10342 src: "libqux_stub.so",
10343 min_sdk_version: "29",
10344 variants: ["apex.29"],
10345 }
10346 cc_api_variant {
10347 name: "libqux",
10348 variant: "apex",
10349 version: "29",
10350 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010351 }
10352 api_imports {
10353 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010354 apex_shared_libs: [
10355 "libbar",
10356 "libbaz",
10357 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010358 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010359 }
10360 `
10361 result := testApex(t, bp)
10362
10363 hasDep := func(m android.Module, wantDep android.Module) bool {
10364 t.Helper()
10365 var found bool
10366 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10367 if dep == wantDep {
10368 found = true
10369 }
10370 })
10371 return found
10372 }
10373
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010374 // Library defines stubs and cc_api_library should be used with cc_api_library
10375 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10376 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10377 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010378
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010379 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10380 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010381
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010382 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10383 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10384 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10385 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10386
10387 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10388 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10389 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10390 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10391 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10392
10393 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10394 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10395 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10396
10397 // cc_api_library defined without original library should be linked with cc_api_library
10398 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10399 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10400 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10401}
10402
10403func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10404 bp := `
10405 apex {
10406 name: "myapex",
10407 key: "myapex.key",
10408 native_shared_libs: ["libbar"],
10409 min_sdk_version: "29",
10410 }
10411 apex_key {
10412 name: "myapex.key",
10413 }
10414 cc_binary {
10415 name: "binfoo",
10416 shared_libs: ["libbar"],
10417 recovery_available: false,
10418 }
10419 cc_library {
10420 name: "libbar",
10421 srcs: ["libbar.cc"],
10422 apex_available: ["myapex"],
10423 min_sdk_version: "29",
10424 stubs: {
10425 symbol_file: "libbar.map.txt",
10426 versions: [
10427 "29",
10428 ],
10429 },
10430 }
10431 cc_api_library {
10432 name: "libbar",
10433 src: "libbar_stub.so",
10434 variants: ["apex.29"],
10435 }
10436 cc_api_variant {
10437 name: "libbar",
10438 variant: "apex",
10439 version: "29",
10440 src: "libbar_apex_29.so",
10441 }
10442 api_imports {
10443 name: "api_imports",
10444 apex_shared_libs: [
10445 "libbar",
10446 ],
10447 }
10448 `
10449
10450 result := testApex(t, bp)
10451
10452 hasDep := func(m android.Module, wantDep android.Module) bool {
10453 t.Helper()
10454 var found bool
10455 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10456 if dep == wantDep {
10457 found = true
10458 }
10459 })
10460 return found
10461 }
10462
10463 // Library defines stubs and cc_api_library should be used with cc_api_library
10464 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10465 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10466 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10467
10468 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10469 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10470
10471 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10472 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10473 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10474 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010475}
Dennis Shend4f5d932023-01-31 20:27:21 +000010476
10477func TestTrimmedApex(t *testing.T) {
10478 bp := `
10479 apex {
10480 name: "myapex",
10481 key: "myapex.key",
10482 native_shared_libs: ["libfoo","libbaz"],
10483 min_sdk_version: "29",
10484 trim_against: "mydcla",
10485 }
10486 apex {
10487 name: "mydcla",
10488 key: "myapex.key",
10489 native_shared_libs: ["libfoo","libbar"],
10490 min_sdk_version: "29",
10491 file_contexts: ":myapex-file_contexts",
10492 dynamic_common_lib_apex: true,
10493 }
10494 apex_key {
10495 name: "myapex.key",
10496 }
10497 cc_library {
10498 name: "libfoo",
10499 shared_libs: ["libc"],
10500 apex_available: ["myapex","mydcla"],
10501 min_sdk_version: "29",
10502 }
10503 cc_library {
10504 name: "libbar",
10505 shared_libs: ["libc"],
10506 apex_available: ["myapex","mydcla"],
10507 min_sdk_version: "29",
10508 }
10509 cc_library {
10510 name: "libbaz",
10511 shared_libs: ["libc"],
10512 apex_available: ["myapex","mydcla"],
10513 min_sdk_version: "29",
10514 }
10515 cc_api_library {
10516 name: "libc",
10517 src: "libc.so",
10518 min_sdk_version: "29",
10519 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010520 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010521 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010522 }
10523 api_imports {
10524 name: "api_imports",
10525 shared_libs: [
10526 "libc",
10527 ],
10528 header_libs: [],
10529 }
10530 `
10531 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010532 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010533 apexRule := module.MaybeRule("apexRule")
10534 if apexRule.Rule == nil {
10535 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10536 }
10537
10538 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010539 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010540 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10541 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10542 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10543 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10544}
Jingwen Chendea7a642023-03-28 11:30:50 +000010545
10546func TestCannedFsConfig(t *testing.T) {
10547 ctx := testApex(t, `
10548 apex {
10549 name: "myapex",
10550 key: "myapex.key",
10551 updatable: false,
10552 }
10553
10554 apex_key {
10555 name: "myapex.key",
10556 public_key: "testkey.avbpubkey",
10557 private_key: "testkey.pem",
10558 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010559 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010560 generateFsRule := mod.Rule("generateFsConfig")
10561 cmd := generateFsRule.RuleParams.Command
10562
10563 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10564}
10565
10566func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10567 ctx := testApex(t, `
10568 apex {
10569 name: "myapex",
10570 key: "myapex.key",
10571 canned_fs_config: "my_config",
10572 updatable: false,
10573 }
10574
10575 apex_key {
10576 name: "myapex.key",
10577 public_key: "testkey.avbpubkey",
10578 private_key: "testkey.pem",
10579 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010580 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010581 generateFsRule := mod.Rule("generateFsConfig")
10582 cmd := generateFsRule.RuleParams.Command
10583
10584 // Ensure that canned_fs_config has "cat my_config" at the end
10585 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10586}
Spandan Das20fce2d2023-04-12 17:21:39 +000010587
10588func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10589 testCases := []struct {
10590 desc string
10591 hasStubs bool
10592 apexAvailable string
10593 expectedError string
10594 }{
10595 {
10596 desc: "non-stub library can have multiple apex_available",
10597 hasStubs: false,
10598 apexAvailable: `["myapex", "otherapex"]`,
10599 },
10600 {
10601 desc: "stub library should not be available to anyapex",
10602 hasStubs: true,
10603 apexAvailable: `["//apex_available:anyapex"]`,
10604 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10605 },
10606 {
10607 desc: "stub library should not be available to multiple apexes",
10608 hasStubs: true,
10609 apexAvailable: `["myapex", "otherapex"]`,
10610 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10611 },
10612 {
10613 desc: "stub library can be available to a core apex and a test apex",
10614 hasStubs: true,
10615 apexAvailable: `["myapex", "test_myapex"]`,
10616 },
10617 }
10618 bpTemplate := `
10619 cc_library {
10620 name: "libfoo",
10621 %v
10622 apex_available: %v,
10623 }
10624 apex {
10625 name: "myapex",
10626 key: "apex.key",
10627 updatable: false,
10628 native_shared_libs: ["libfoo"],
10629 }
10630 apex {
10631 name: "otherapex",
10632 key: "apex.key",
10633 updatable: false,
10634 }
10635 apex_test {
10636 name: "test_myapex",
10637 key: "apex.key",
10638 updatable: false,
10639 native_shared_libs: ["libfoo"],
10640 }
10641 apex_key {
10642 name: "apex.key",
10643 }
10644 `
10645 for _, tc := range testCases {
10646 stubs := ""
10647 if tc.hasStubs {
10648 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10649 }
10650 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10651 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10652 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10653 })
10654 if tc.expectedError == "" {
10655 testApex(t, bp, mockFsFixturePreparer)
10656 } else {
10657 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10658 }
10659 }
10660}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010661
10662func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10663 context := android.GroupFixturePreparers(
10664 android.PrepareForIntegrationTestWithAndroid,
10665 cc.PrepareForIntegrationTestWithCc,
10666 PrepareForTestWithApexBuildComponents,
10667 prepareForTestWithMyapex,
10668 filesystem.PrepareForTestWithFilesystemBuildComponents,
10669 )
10670 result := context.RunTestWithBp(t, `
10671 android_system_image {
10672 name: "myfilesystem",
10673 deps: [
10674 "libfoo",
10675 ],
10676 linker_config_src: "linker.config.json",
10677 }
10678
10679 cc_library {
10680 name: "libfoo",
10681 shared_libs: [
10682 "libbar",
10683 ],
10684 stl: "none",
10685 }
10686
10687 cc_library {
10688 name: "libbar",
10689 stl: "none",
10690 apex_available: ["myapex"],
10691 }
10692
10693 apex {
10694 name: "myapex",
10695 native_shared_libs: ["libbar"],
10696 key: "myapex.key",
10697 updatable: false,
10698 }
10699
10700 apex_key {
10701 name: "myapex.key",
10702 public_key: "testkey.avbpubkey",
10703 private_key: "testkey.pem",
10704 }
10705 `)
10706
10707 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10708 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10709 inputs.Strings(),
10710 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10711}