blob: 9dba08e464808b3d09b47c49a96f46cf54b7eaac [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070036 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090037 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090038 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090040)
41
Jooyung Hand3639552019-08-09 12:57:43 +090042// names returns name list from white space separated string
43func names(s string) (ns []string) {
44 for _, n := range strings.Split(s, " ") {
45 if len(n) > 0 {
46 ns = append(ns, n)
47 }
48 }
49 return
50}
51
Paul Duffin40b62572021-03-20 11:39:01 +000052func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090053 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010054 android.GroupFixturePreparers(
55 prepareForApexTest,
56 android.GroupFixturePreparers(preparers...),
57 ).
Paul Duffine05480a2021-03-08 15:07:14 +000058 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000059 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090060}
61
Paul Duffin40b62572021-03-20 11:39:01 +000062func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090063 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010064
65 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000066 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010067 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000068 }
Paul Duffin284165a2021-03-29 01:50:31 +010069
70 result := android.GroupFixturePreparers(
71 prepareForApexTest,
72 android.GroupFixturePreparers(preparers...),
73 optionalBpPreparer,
74 ).RunTest(t)
75
Paul Duffine05480a2021-03-08 15:07:14 +000076 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090077}
78
Paul Duffin810f33d2021-03-09 14:12:32 +000079func withFiles(files android.MockFS) android.FixturePreparer {
80 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
84 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090085 for k, v := range targets {
86 config.Targets[k] = v
87 }
Paul Duffin810f33d2021-03-09 14:12:32 +000088 })
Jooyung Han344d5432019-08-23 11:17:39 +090089}
90
Jooyung Han35155c42020-02-06 17:33:20 +090091// withNativeBridgeTargets sets configuration with targets including:
92// - X86_64 (primary)
93// - X86 (secondary)
94// - Arm64 on X86_64 (native bridge)
95// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000096var withNativeBridgeEnabled = android.FixtureModifyConfig(
97 func(config android.Config) {
98 config.Targets[android.Android] = []android.Target{
99 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
107 }
108 },
109)
110
111func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
112 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
113 variables.ManifestPackageNameOverrides = specs
114 })
Jooyung Han35155c42020-02-06 17:33:20 +0900115}
116
Albert Martineefabcf2022-03-21 20:11:16 +0000117func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
118 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
119 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
120 })
121}
122
Paul Duffin810f33d2021-03-09 14:12:32 +0000123var withBinder32bit = android.FixtureModifyProductVariables(
124 func(variables android.FixtureProductVariables) {
125 variables.Binder32bit = proptools.BoolPtr(true)
126 },
127)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900128
Paul Duffin810f33d2021-03-09 14:12:32 +0000129var withUnbundledBuild = android.FixtureModifyProductVariables(
130 func(variables android.FixtureProductVariables) {
131 variables.Unbundled_build = proptools.BoolPtr(true)
132 },
133)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900134
Paul Duffin284165a2021-03-29 01:50:31 +0100135// Legacy preparer used for running tests within the apex package.
136//
137// This includes everything that was needed to run any test in the apex package prior to the
138// introduction of the test fixtures. Tests that are being converted to use fixtures directly
139// rather than through the testApex...() methods should avoid using this and instead use the
140// various preparers directly, using android.GroupFixturePreparers(...) to group them when
141// necessary.
142//
143// deprecated
144var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000145 // General preparers in alphabetical order as test infrastructure will enforce correct
146 // registration order.
147 android.PrepareForTestWithAndroidBuildComponents,
148 bpf.PrepareForTestWithBpf,
149 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100150 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000151 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
152 rust.PrepareForTestWithRustDefaultModules,
153 sh.PrepareForTestWithShBuildComponents,
154
155 PrepareForTestWithApexBuildComponents,
156
157 // Additional apex test specific preparers.
158 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
159 filegroup {
160 name: "myapex-file_contexts",
161 srcs: [
162 "apex/myapex-file_contexts",
163 ],
164 }
165 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000166 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000167 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 "a.java": nil,
169 "PrebuiltAppFoo.apk": nil,
170 "PrebuiltAppFooPriv.apk": nil,
171 "apex_manifest.json": nil,
172 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000173 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
174 "system/sepolicy/apex/myapex2-file_contexts": nil,
175 "system/sepolicy/apex/otherapex-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
177 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700178 "mylib.cpp": nil,
179 "mytest.cpp": nil,
180 "mytest1.cpp": nil,
181 "mytest2.cpp": nil,
182 "mytest3.cpp": nil,
183 "myprebuilt": nil,
184 "my_include": nil,
185 "foo/bar/MyClass.java": nil,
186 "prebuilt.jar": nil,
187 "prebuilt.so": nil,
188 "vendor/foo/devkeys/test.x509.pem": nil,
189 "vendor/foo/devkeys/test.pk8": nil,
190 "testkey.x509.pem": nil,
191 "testkey.pk8": nil,
192 "testkey.override.x509.pem": nil,
193 "testkey.override.pk8": nil,
194 "vendor/foo/devkeys/testkey.avbpubkey": nil,
195 "vendor/foo/devkeys/testkey.pem": nil,
196 "NOTICE": nil,
197 "custom_notice": nil,
198 "custom_notice_for_static_lib": nil,
199 "testkey2.avbpubkey": nil,
200 "testkey2.pem": nil,
201 "myapex-arm64.apex": nil,
202 "myapex-arm.apex": nil,
203 "myapex.apks": nil,
204 "frameworks/base/api/current.txt": nil,
205 "framework/aidl/a.aidl": nil,
206 "dummy.txt": nil,
207 "baz": nil,
208 "bar/baz": nil,
209 "testdata/baz": nil,
210 "AppSet.apks": nil,
211 "foo.rs": nil,
212 "libfoo.jar": nil,
213 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000214 },
215 ),
216
217 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
218 variables.DeviceVndkVersion = proptools.StringPtr("current")
219 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
220 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
221 variables.Platform_sdk_codename = proptools.StringPtr("Q")
222 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000223 // "Tiramisu" needs to be in the next line for compatibility with soong code,
224 // not because of these tests specifically (it's not used by the tests)
225 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900226 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000227 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000228 }),
229)
230
Paul Duffin52bfaa42021-03-23 23:40:12 +0000231var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
232 "system/sepolicy/apex/myapex-file_contexts": nil,
233})
234
Jooyung Han643adc42020-02-27 13:50:06 +0900235// ensure that 'result' equals 'expected'
236func ensureEquals(t *testing.T, result string, expected string) {
237 t.Helper()
238 if result != expected {
239 t.Errorf("%q != %q", expected, result)
240 }
241}
242
Jiyong Park25fc6a92018-11-18 18:02:45 +0900243// ensure that 'result' contains 'expected'
244func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900245 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246 if !strings.Contains(result, expected) {
247 t.Errorf("%q is not found in %q", expected, result)
248 }
249}
250
Liz Kammer5bd365f2020-05-27 15:15:11 -0700251// ensure that 'result' contains 'expected' exactly one time
252func ensureContainsOnce(t *testing.T, result string, expected string) {
253 t.Helper()
254 count := strings.Count(result, expected)
255 if count != 1 {
256 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
257 }
258}
259
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260// ensures that 'result' does not contain 'notExpected'
261func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900262 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263 if strings.Contains(result, notExpected) {
264 t.Errorf("%q is found in %q", notExpected, result)
265 }
266}
267
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700268func ensureMatches(t *testing.T, result string, expectedRex string) {
269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900280 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281 if !android.InList(expected, result) {
282 t.Errorf("%q is not found in %v", expected, result)
283 }
284}
285
286func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900287 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900288 if android.InList(notExpected, result) {
289 t.Errorf("%q is found in %v", notExpected, result)
290 }
291}
292
Jooyung Hane1633032019-08-01 17:41:43 +0900293func ensureListEmpty(t *testing.T, result []string) {
294 t.Helper()
295 if len(result) > 0 {
296 t.Errorf("%q is expected to be empty", result)
297 }
298}
299
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000300func ensureListNotEmpty(t *testing.T, result []string) {
301 t.Helper()
302 if len(result) == 0 {
303 t.Errorf("%q is expected to be not empty", result)
304 }
305}
306
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307// Minimal test
308func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800309 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900310 apex_defaults {
311 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900312 manifest: ":myapex.manifest",
313 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900315 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900316 native_shared_libs: [
317 "mylib",
318 "libfoo.ffi",
319 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900320 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800321 multilib: {
322 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900323 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800324 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900325 },
Jiyong Park77acec62020-06-01 21:39:15 +0900326 java_libs: [
327 "myjar",
328 "myjar_dex",
329 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000330 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 }
332
Jiyong Park30ca9372019-02-07 16:27:23 +0900333 apex {
334 name: "myapex",
335 defaults: ["myapex-defaults"],
336 }
337
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 apex_key {
339 name: "myapex.key",
340 public_key: "testkey.avbpubkey",
341 private_key: "testkey.pem",
342 }
343
Jiyong Park809bb722019-02-13 21:33:49 +0900344 filegroup {
345 name: "myapex.manifest",
346 srcs: ["apex_manifest.json"],
347 }
348
349 filegroup {
350 name: "myapex.androidmanifest",
351 srcs: ["AndroidManifest.xml"],
352 }
353
Jiyong Park25fc6a92018-11-18 18:02:45 +0900354 cc_library {
355 name: "mylib",
356 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900357 shared_libs: [
358 "mylib2",
359 "libbar.ffi",
360 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 system_shared_libs: [],
362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000363 // TODO: remove //apex_available:platform
364 apex_available: [
365 "//apex_available:platform",
366 "myapex",
367 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 }
369
Alex Light3d673592019-01-18 14:37:31 -0800370 cc_binary {
371 name: "foo",
372 srcs: ["mylib.cpp"],
373 compile_multilib: "both",
374 multilib: {
375 lib32: {
376 suffix: "32",
377 },
378 lib64: {
379 suffix: "64",
380 },
381 },
382 symlinks: ["foo_link_"],
383 symlink_preferred_arch: true,
384 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800385 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700386 apex_available: [ "myapex", "com.android.gki.*" ],
387 }
388
Jiyong Park99644e92020-11-17 22:21:02 +0900389 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000390 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900391 srcs: ["foo.rs"],
392 rlibs: ["libfoo.rlib.rust"],
393 dylibs: ["libfoo.dylib.rust"],
394 apex_available: ["myapex"],
395 }
396
397 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000398 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900399 srcs: ["foo.rs"],
400 crate_name: "foo",
401 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900402 shared_libs: ["libfoo.shared_from_rust"],
403 }
404
405 cc_library_shared {
406 name: "libfoo.shared_from_rust",
407 srcs: ["mylib.cpp"],
408 system_shared_libs: [],
409 stl: "none",
410 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900411 }
412
413 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000414 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900415 srcs: ["foo.rs"],
416 crate_name: "foo",
417 apex_available: ["myapex"],
418 }
419
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900420 rust_ffi_shared {
421 name: "libfoo.ffi",
422 srcs: ["foo.rs"],
423 crate_name: "foo",
424 apex_available: ["myapex"],
425 }
426
427 rust_ffi_shared {
428 name: "libbar.ffi",
429 srcs: ["foo.rs"],
430 crate_name: "bar",
431 apex_available: ["myapex"],
432 }
433
Yifan Hongd22a84a2020-07-28 17:37:46 -0700434 apex {
435 name: "com.android.gki.fake",
436 binaries: ["foo"],
437 key: "myapex.key",
438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000439 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800440 }
441
Paul Duffindddd5462020-04-07 15:25:44 +0100442 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900443 name: "mylib2",
444 srcs: ["mylib.cpp"],
445 system_shared_libs: [],
446 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900447 static_libs: ["libstatic"],
448 // TODO: remove //apex_available:platform
449 apex_available: [
450 "//apex_available:platform",
451 "myapex",
452 ],
453 }
454
Paul Duffindddd5462020-04-07 15:25:44 +0100455 cc_prebuilt_library_shared {
456 name: "mylib2",
457 srcs: ["prebuilt.so"],
458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
463 }
464
Jiyong Park9918e1a2020-03-17 19:16:40 +0900465 cc_library_static {
466 name: "libstatic",
467 srcs: ["mylib.cpp"],
468 system_shared_libs: [],
469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900475 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476
477 java_library {
478 name: "myjar",
479 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900480 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900484 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000485 // TODO: remove //apex_available:platform
486 apex_available: [
487 "//apex_available:platform",
488 "myapex",
489 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 }
491
Jiyong Park77acec62020-06-01 21:39:15 +0900492 dex_import {
493 name: "myjar_dex",
494 jars: ["prebuilt.jar"],
495 apex_available: [
496 "//apex_available:platform",
497 "myapex",
498 ],
499 }
500
Jiyong Park7f7766d2019-07-25 22:02:35 +0900501 java_library {
502 name: "myotherjar",
503 srcs: ["foo/bar/MyClass.java"],
504 sdk_version: "none",
505 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900506 // TODO: remove //apex_available:platform
507 apex_available: [
508 "//apex_available:platform",
509 "myapex",
510 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900511 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900512
513 java_library {
514 name: "mysharedjar",
515 srcs: ["foo/bar/MyClass.java"],
516 sdk_version: "none",
517 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900518 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900519 `)
520
Paul Duffina71a67a2021-03-29 00:42:57 +0100521 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900523 // Make sure that Android.mk is created
524 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700525 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 var builder strings.Builder
527 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
528
529 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000530 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900531 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
532
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533 optFlags := apexRule.Args["opt_flags"]
534 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700535 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100536 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900537
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538 copyCmds := apexRule.Args["copy_commands"]
539
540 // Ensure that main rule creates an output
541 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
542
543 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900549
550 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557
558 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800559 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
565 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 // .. but not for java libs
568 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800570
Colin Cross7113d202019-11-20 16:39:12 -0800571 // Ensure that the platform variant ends with _shared or _common
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900574 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
575 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
577
578 // Ensure that dynamic dependency to java libs are not included
579 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800580
581 // Ensure that all symlinks are present.
582 found_foo_link_64 := false
583 found_foo := false
584 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900585 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800586 if strings.HasSuffix(cmd, "bin/foo") {
587 found_foo = true
588 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
589 found_foo_link_64 = true
590 }
591 }
592 }
593 good := found_foo && found_foo_link_64
594 if !good {
595 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
596 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900597
Artur Satayeva8bd1132020-04-27 18:07:06 +0100598 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
601 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
602 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100603
604 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100606 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
608 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800609}
610
Jooyung Hanf21c7972019-12-16 22:32:06 +0900611func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800612 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613 apex_defaults {
614 name: "myapex-defaults",
615 key: "myapex.key",
616 prebuilts: ["myetc"],
617 native_shared_libs: ["mylib"],
618 java_libs: ["myjar"],
619 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900620 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800621 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000622 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900623 }
624
625 prebuilt_etc {
626 name: "myetc",
627 src: "myprebuilt",
628 }
629
630 apex {
631 name: "myapex",
632 defaults: ["myapex-defaults"],
633 }
634
635 apex_key {
636 name: "myapex.key",
637 public_key: "testkey.avbpubkey",
638 private_key: "testkey.pem",
639 }
640
641 cc_library {
642 name: "mylib",
643 system_shared_libs: [],
644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900646 }
647
648 java_library {
649 name: "myjar",
650 srcs: ["foo/bar/MyClass.java"],
651 sdk_version: "none",
652 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000653 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900654 }
655
656 android_app {
657 name: "AppFoo",
658 srcs: ["foo/bar/MyClass.java"],
659 sdk_version: "none",
660 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000661 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900662 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900663
664 runtime_resource_overlay {
665 name: "rro",
666 theme: "blue",
667 }
668
markchien2f59ec92020-09-02 16:23:38 +0800669 bpf {
670 name: "bpf",
671 srcs: ["bpf.c", "bpf2.c"],
672 }
673
Ken Chenfad7f9d2021-11-10 22:02:57 +0800674 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800675 name: "netdTest",
676 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800677 sub_dir: "netd",
678 }
679
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000681 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 "etc/myetc",
683 "javalib/myjar.jar",
684 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000685 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900686 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800687 "etc/bpf/bpf.o",
688 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800689 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900690 })
691}
692
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800694 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 apex {
696 name: "myapex",
697 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000698 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 }
700
701 apex_key {
702 name: "myapex.key",
703 public_key: "testkey.avbpubkey",
704 private_key: "testkey.pem",
705 }
706 `)
707
708 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900709 args := module.Rule("apexRule").Args
710 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
711 t.Error("manifest should be apex_manifest.pb, but " + manifest)
712 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900713}
714
Liz Kammer4854a7d2021-05-27 14:28:27 -0400715func TestApexManifestMinSdkVersion(t *testing.T) {
716 ctx := testApex(t, `
717 apex_defaults {
718 name: "my_defaults",
719 key: "myapex.key",
720 product_specific: true,
721 file_contexts: ":my-file-contexts",
722 updatable: false,
723 }
724 apex {
725 name: "myapex_30",
726 min_sdk_version: "30",
727 defaults: ["my_defaults"],
728 }
729
730 apex {
731 name: "myapex_current",
732 min_sdk_version: "current",
733 defaults: ["my_defaults"],
734 }
735
736 apex {
737 name: "myapex_none",
738 defaults: ["my_defaults"],
739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746
747 filegroup {
748 name: "my-file-contexts",
749 srcs: ["product_specific_file_contexts"],
750 }
751 `, withFiles(map[string][]byte{
752 "product_specific_file_contexts": nil,
753 }), android.FixtureModifyProductVariables(
754 func(variables android.FixtureProductVariables) {
755 variables.Unbundled_build = proptools.BoolPtr(true)
756 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
757 }), android.FixtureMergeEnv(map[string]string{
758 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
759 }))
760
761 testCases := []struct {
762 module string
763 minSdkVersion string
764 }{
765 {
766 module: "myapex_30",
767 minSdkVersion: "30",
768 },
769 {
770 module: "myapex_current",
771 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
772 },
773 {
774 module: "myapex_none",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 }
778 for _, tc := range testCases {
779 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
780 args := module.Rule("apexRule").Args
781 optFlags := args["opt_flags"]
782 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
783 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
784 }
785 }
786}
787
Jooyung Hanaf730952023-02-28 14:13:38 +0900788func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900789 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900790 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900791 if vendor {
792 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900793 }
794 ctx := testApex(t, `
795 apex {
796 name: "myapex",
797 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900798 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900799 `+prop+`
800 }
801
802 apex_key {
803 name: "myapex.key",
804 public_key: "testkey.avbpubkey",
805 private_key: "testkey.pem",
806 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900807 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900808
809 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900810 if vendor {
811 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
812 rule.RuleParams.Command,
813 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900814 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900815 android.AssertStringDoesContain(t, "should force-label as system_file",
816 rule.RuleParams.Command,
817 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900818 }
819 }
820}
821
Alex Light5098a612018-11-29 17:12:15 -0800822func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800823 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800824 apex {
825 name: "myapex",
826 key: "myapex.key",
827 payload_type: "zip",
828 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000829 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800830 }
831
832 apex_key {
833 name: "myapex.key",
834 public_key: "testkey.avbpubkey",
835 private_key: "testkey.pem",
836 }
837
838 cc_library {
839 name: "mylib",
840 srcs: ["mylib.cpp"],
841 shared_libs: ["mylib2"],
842 system_shared_libs: [],
843 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000844 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800845 }
846
847 cc_library {
848 name: "mylib2",
849 srcs: ["mylib.cpp"],
850 system_shared_libs: [],
851 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000852 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800853 }
854 `)
855
Sundong Ahnabb64432019-10-22 13:58:29 +0900856 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800857 copyCmds := zipApexRule.Args["copy_commands"]
858
859 // Ensure that main rule creates an output
860 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
861
862 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700863 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800864
865 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700866 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800867
868 // Ensure that both direct and indirect deps are copied into apex
869 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
870 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900871}
872
873func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800874 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900875 apex {
876 name: "myapex",
877 key: "myapex.key",
878 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900879 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000880 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900881 }
882
883 apex_key {
884 name: "myapex.key",
885 public_key: "testkey.avbpubkey",
886 private_key: "testkey.pem",
887 }
888
889 cc_library {
890 name: "mylib",
891 srcs: ["mylib.cpp"],
892 shared_libs: ["mylib2", "mylib3"],
893 system_shared_libs: [],
894 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000895 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900896 }
897
898 cc_library {
899 name: "mylib2",
900 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900901 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900902 system_shared_libs: [],
903 stl: "none",
904 stubs: {
905 versions: ["1", "2", "3"],
906 },
907 }
908
909 cc_library {
910 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900911 srcs: ["mylib.cpp"],
912 shared_libs: ["mylib4"],
913 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914 stl: "none",
915 stubs: {
916 versions: ["10", "11", "12"],
917 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000918 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900920
921 cc_library {
922 name: "mylib4",
923 srcs: ["mylib.cpp"],
924 system_shared_libs: [],
925 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000926 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900927 }
Jiyong Park105dc322021-06-11 17:22:09 +0900928
929 rust_binary {
930 name: "foo.rust",
931 srcs: ["foo.rs"],
932 shared_libs: ["libfoo.shared_from_rust"],
933 prefer_rlib: true,
934 apex_available: ["myapex"],
935 }
936
937 cc_library_shared {
938 name: "libfoo.shared_from_rust",
939 srcs: ["mylib.cpp"],
940 system_shared_libs: [],
941 stl: "none",
942 stubs: {
943 versions: ["10", "11", "12"],
944 },
945 }
946
Jiyong Park25fc6a92018-11-18 18:02:45 +0900947 `)
948
Sundong Ahnabb64432019-10-22 13:58:29 +0900949 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900950 copyCmds := apexRule.Args["copy_commands"]
951
952 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800953 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900954
955 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800956 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900957
958 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800959 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900960
Colin Crossaede88c2020-08-11 12:17:01 -0700961 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900962
963 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900964 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900965 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900966 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900967
968 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700969 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900970 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700971 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900972
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700973 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
974 // is replaced by sharing of "cFlags" in cc/builder.go.
975 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
976 // module variable representing "cflags". So it was not detected by ensureNotContains.
977 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
978 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
979 // including the original cflags's "-include mylib.h".
980 //
Jiyong Park64379952018-12-13 18:37:29 +0900981 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700982 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
983 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900984
Jiyong Park85cc35a2022-07-17 11:30:47 +0900985 // Ensure that genstub for platform-provided lib is invoked with --systemapi
986 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
987 // Ensure that genstub for apex-provided lib is invoked with --apex
988 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900989
Jooyung Hana57af4a2020-01-23 05:36:59 +0000990 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900991 "lib64/mylib.so",
992 "lib64/mylib3.so",
993 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900994 "bin/foo.rust",
995 "lib64/libc++.so", // by the implicit dependency from foo.rust
996 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900997 })
Jiyong Park105dc322021-06-11 17:22:09 +0900998
999 // Ensure that stub dependency from a rust module is not included
1000 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1001 // The rust module is linked to the stub cc library
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001002 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001003 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1004 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001005
1006 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1007 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001008}
1009
Jiyong Park1bc84122021-06-22 20:23:05 +09001010func TestApexCanUsePrivateApis(t *testing.T) {
1011 ctx := testApex(t, `
1012 apex {
1013 name: "myapex",
1014 key: "myapex.key",
1015 native_shared_libs: ["mylib"],
1016 binaries: ["foo.rust"],
1017 updatable: false,
1018 platform_apis: true,
1019 }
1020
1021 apex_key {
1022 name: "myapex.key",
1023 public_key: "testkey.avbpubkey",
1024 private_key: "testkey.pem",
1025 }
1026
1027 cc_library {
1028 name: "mylib",
1029 srcs: ["mylib.cpp"],
1030 shared_libs: ["mylib2"],
1031 system_shared_libs: [],
1032 stl: "none",
1033 apex_available: [ "myapex" ],
1034 }
1035
1036 cc_library {
1037 name: "mylib2",
1038 srcs: ["mylib.cpp"],
1039 cflags: ["-include mylib.h"],
1040 system_shared_libs: [],
1041 stl: "none",
1042 stubs: {
1043 versions: ["1", "2", "3"],
1044 },
1045 }
1046
1047 rust_binary {
1048 name: "foo.rust",
1049 srcs: ["foo.rs"],
1050 shared_libs: ["libfoo.shared_from_rust"],
1051 prefer_rlib: true,
1052 apex_available: ["myapex"],
1053 }
1054
1055 cc_library_shared {
1056 name: "libfoo.shared_from_rust",
1057 srcs: ["mylib.cpp"],
1058 system_shared_libs: [],
1059 stl: "none",
1060 stubs: {
1061 versions: ["10", "11", "12"],
1062 },
1063 }
1064 `)
1065
1066 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1067 copyCmds := apexRule.Args["copy_commands"]
1068
1069 // Ensure that indirect stubs dep is not included
1070 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1071 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1072
1073 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1074 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001075 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001076 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1077 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001078 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001079 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1080 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1081}
1082
Colin Cross7812fd32020-09-25 12:35:10 -07001083func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1084 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001085 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001086 apex {
1087 name: "myapex",
1088 key: "myapex.key",
1089 native_shared_libs: ["mylib", "mylib3"],
1090 min_sdk_version: "29",
1091 }
1092
1093 apex_key {
1094 name: "myapex.key",
1095 public_key: "testkey.avbpubkey",
1096 private_key: "testkey.pem",
1097 }
1098
1099 cc_library {
1100 name: "mylib",
1101 srcs: ["mylib.cpp"],
1102 shared_libs: ["mylib2", "mylib3"],
1103 system_shared_libs: [],
1104 stl: "none",
1105 apex_available: [ "myapex" ],
1106 min_sdk_version: "28",
1107 }
1108
1109 cc_library {
1110 name: "mylib2",
1111 srcs: ["mylib.cpp"],
1112 cflags: ["-include mylib.h"],
1113 system_shared_libs: [],
1114 stl: "none",
1115 stubs: {
1116 versions: ["28", "29", "30", "current"],
1117 },
1118 min_sdk_version: "28",
1119 }
1120
1121 cc_library {
1122 name: "mylib3",
1123 srcs: ["mylib.cpp"],
1124 shared_libs: ["mylib4"],
1125 system_shared_libs: [],
1126 stl: "none",
1127 stubs: {
1128 versions: ["28", "29", "30", "current"],
1129 },
1130 apex_available: [ "myapex" ],
1131 min_sdk_version: "28",
1132 }
1133
1134 cc_library {
1135 name: "mylib4",
1136 srcs: ["mylib.cpp"],
1137 system_shared_libs: [],
1138 stl: "none",
1139 apex_available: [ "myapex" ],
1140 min_sdk_version: "28",
1141 }
1142 `)
1143
1144 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1145 copyCmds := apexRule.Args["copy_commands"]
1146
1147 // Ensure that direct non-stubs dep is always included
1148 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1149
1150 // Ensure that indirect stubs dep is not included
1151 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1152
1153 // Ensure that direct stubs dep is included
1154 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1155
1156 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1157
Jiyong Park55549df2021-02-26 23:57:23 +09001158 // Ensure that mylib is linking with the latest version of stub for mylib2
1159 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001160 // ... and not linking to the non-stub (impl) variant of mylib2
1161 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1162
1163 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1164 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1165 // .. and not linking to the stubs variant of mylib3
1166 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1167
1168 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001169 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001170 ensureNotContains(t, mylib2Cflags, "-include ")
1171
Jiyong Park85cc35a2022-07-17 11:30:47 +09001172 // Ensure that genstub is invoked with --systemapi
1173 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001174
1175 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1176 "lib64/mylib.so",
1177 "lib64/mylib3.so",
1178 "lib64/mylib4.so",
1179 })
1180}
1181
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001182func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1183 t.Parallel()
1184 // myapex (Z)
1185 // mylib -----------------.
1186 // |
1187 // otherapex (29) |
1188 // libstub's versions: 29 Z current
1189 // |
1190 // <platform> |
1191 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001192 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001193 apex {
1194 name: "myapex",
1195 key: "myapex.key",
1196 native_shared_libs: ["mylib"],
1197 min_sdk_version: "Z", // non-final
1198 }
1199
1200 cc_library {
1201 name: "mylib",
1202 srcs: ["mylib.cpp"],
1203 shared_libs: ["libstub"],
1204 apex_available: ["myapex"],
1205 min_sdk_version: "Z",
1206 }
1207
1208 apex_key {
1209 name: "myapex.key",
1210 public_key: "testkey.avbpubkey",
1211 private_key: "testkey.pem",
1212 }
1213
1214 apex {
1215 name: "otherapex",
1216 key: "myapex.key",
1217 native_shared_libs: ["libstub"],
1218 min_sdk_version: "29",
1219 }
1220
1221 cc_library {
1222 name: "libstub",
1223 srcs: ["mylib.cpp"],
1224 stubs: {
1225 versions: ["29", "Z", "current"],
1226 },
1227 apex_available: ["otherapex"],
1228 min_sdk_version: "29",
1229 }
1230
1231 // platform module depending on libstub from otherapex should use the latest stub("current")
1232 cc_library {
1233 name: "libplatform",
1234 srcs: ["mylib.cpp"],
1235 shared_libs: ["libstub"],
1236 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001237 `,
1238 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1239 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1240 variables.Platform_sdk_final = proptools.BoolPtr(false)
1241 variables.Platform_version_active_codenames = []string{"Z"}
1242 }),
1243 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001244
Jiyong Park55549df2021-02-26 23:57:23 +09001245 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001246 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001247 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001248 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001249 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001250
1251 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1252 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1253 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1254 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1255 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1256}
1257
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001258func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001259 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001260 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001261 name: "myapex2",
1262 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001263 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001264 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001265 }
1266
1267 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001268 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001269 public_key: "testkey.avbpubkey",
1270 private_key: "testkey.pem",
1271 }
1272
1273 cc_library {
1274 name: "mylib",
1275 srcs: ["mylib.cpp"],
1276 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001277 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278 system_shared_libs: [],
1279 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001280 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001281 }
1282
1283 cc_library {
1284 name: "libfoo",
1285 srcs: ["mylib.cpp"],
1286 shared_libs: ["libbar"],
1287 system_shared_libs: [],
1288 stl: "none",
1289 stubs: {
1290 versions: ["10", "20", "30"],
1291 },
1292 }
1293
1294 cc_library {
1295 name: "libbar",
1296 srcs: ["mylib.cpp"],
1297 system_shared_libs: [],
1298 stl: "none",
1299 }
1300
Jiyong Park678c8812020-02-07 17:25:49 +09001301 cc_library_static {
1302 name: "libbaz",
1303 srcs: ["mylib.cpp"],
1304 system_shared_libs: [],
1305 stl: "none",
1306 apex_available: [ "myapex2" ],
1307 }
1308
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001309 `)
1310
Jiyong Park83dc74b2020-01-14 18:38:44 +09001311 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001312 copyCmds := apexRule.Args["copy_commands"]
1313
1314 // Ensure that direct non-stubs dep is always included
1315 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1316
1317 // Ensure that indirect stubs dep is not included
1318 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1319
1320 // Ensure that dependency of stubs is not included
1321 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1322
Colin Crossaede88c2020-08-11 12:17:01 -07001323 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001324
1325 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001326 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001327 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001328 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001329
Jiyong Park3ff16992019-12-27 14:11:47 +09001330 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001331
1332 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1333 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001334
Artur Satayeva8bd1132020-04-27 18:07:06 +01001335 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001336 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001337
Artur Satayeva8bd1132020-04-27 18:07:06 +01001338 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001339 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001340}
1341
Jooyung Hand3639552019-08-09 12:57:43 +09001342func TestApexWithRuntimeLibsDependency(t *testing.T) {
1343 /*
1344 myapex
1345 |
1346 v (runtime_libs)
1347 mylib ------+------> libfoo [provides stub]
1348 |
1349 `------> libbar
1350 */
Colin Cross1c460562021-02-16 17:55:47 -08001351 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001352 apex {
1353 name: "myapex",
1354 key: "myapex.key",
1355 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001356 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001357 }
1358
1359 apex_key {
1360 name: "myapex.key",
1361 public_key: "testkey.avbpubkey",
1362 private_key: "testkey.pem",
1363 }
1364
1365 cc_library {
1366 name: "mylib",
1367 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001368 static_libs: ["libstatic"],
1369 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001370 runtime_libs: ["libfoo", "libbar"],
1371 system_shared_libs: [],
1372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001373 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001374 }
1375
1376 cc_library {
1377 name: "libfoo",
1378 srcs: ["mylib.cpp"],
1379 system_shared_libs: [],
1380 stl: "none",
1381 stubs: {
1382 versions: ["10", "20", "30"],
1383 },
1384 }
1385
1386 cc_library {
1387 name: "libbar",
1388 srcs: ["mylib.cpp"],
1389 system_shared_libs: [],
1390 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001391 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001392 }
1393
Liz Kammer5f108fa2023-05-11 14:33:17 -04001394 cc_library {
1395 name: "libstatic",
1396 srcs: ["mylib.cpp"],
1397 system_shared_libs: [],
1398 stl: "none",
1399 apex_available: [ "myapex" ],
1400 runtime_libs: ["libstatic_to_runtime"],
1401 }
1402
1403 cc_library {
1404 name: "libshared",
1405 srcs: ["mylib.cpp"],
1406 system_shared_libs: [],
1407 stl: "none",
1408 apex_available: [ "myapex" ],
1409 runtime_libs: ["libshared_to_runtime"],
1410 }
1411
1412 cc_library {
1413 name: "libstatic_to_runtime",
1414 srcs: ["mylib.cpp"],
1415 system_shared_libs: [],
1416 stl: "none",
1417 apex_available: [ "myapex" ],
1418 }
1419
1420 cc_library {
1421 name: "libshared_to_runtime",
1422 srcs: ["mylib.cpp"],
1423 system_shared_libs: [],
1424 stl: "none",
1425 apex_available: [ "myapex" ],
1426 }
Jooyung Hand3639552019-08-09 12:57:43 +09001427 `)
1428
Sundong Ahnabb64432019-10-22 13:58:29 +09001429 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001430 copyCmds := apexRule.Args["copy_commands"]
1431
1432 // Ensure that direct non-stubs dep is always included
1433 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1434
1435 // Ensure that indirect stubs dep is not included
1436 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1437
1438 // Ensure that runtime_libs dep in included
1439 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001440 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1441 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1442
1443 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001444
Sundong Ahnabb64432019-10-22 13:58:29 +09001445 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001446 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1447 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001448}
1449
Paul Duffina02cae32021-03-09 01:44:06 +00001450var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1451 cc.PrepareForTestWithCcBuildComponents,
1452 PrepareForTestWithApexBuildComponents,
1453 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001454 apex {
1455 name: "com.android.runtime",
1456 key: "com.android.runtime.key",
1457 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001458 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001459 }
1460
1461 apex_key {
1462 name: "com.android.runtime.key",
1463 public_key: "testkey.avbpubkey",
1464 private_key: "testkey.pem",
1465 }
Paul Duffina02cae32021-03-09 01:44:06 +00001466 `),
1467 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1468)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001469
Paul Duffina02cae32021-03-09 01:44:06 +00001470func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001471 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001472 cc_library {
1473 name: "libc",
1474 no_libcrt: true,
1475 nocrt: true,
1476 stl: "none",
1477 system_shared_libs: [],
1478 stubs: { versions: ["1"] },
1479 apex_available: ["com.android.runtime"],
1480
1481 sanitize: {
1482 hwaddress: true,
1483 }
1484 }
1485
1486 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001487 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001488 no_libcrt: true,
1489 nocrt: true,
1490 stl: "none",
1491 system_shared_libs: [],
1492 srcs: [""],
1493 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001494 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001495
1496 sanitize: {
1497 never: true,
1498 },
Spandan Das4de7b492023-05-05 21:13:01 +00001499 apex_available: [
1500 "//apex_available:anyapex",
1501 "//apex_available:platform",
1502 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001503 } `)
1504 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001505
1506 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1507 "lib64/bionic/libc.so",
1508 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1509 })
1510
Colin Cross4c4c1be2022-02-10 11:41:18 -08001511 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001512
1513 installed := hwasan.Description("install libclang_rt.hwasan")
1514 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1515
1516 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1517 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1518 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1519}
1520
1521func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001522 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001523 prepareForTestOfRuntimeApexWithHwasan,
1524 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1525 variables.SanitizeDevice = []string{"hwaddress"}
1526 }),
1527 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001528 cc_library {
1529 name: "libc",
1530 no_libcrt: true,
1531 nocrt: true,
1532 stl: "none",
1533 system_shared_libs: [],
1534 stubs: { versions: ["1"] },
1535 apex_available: ["com.android.runtime"],
1536 }
1537
1538 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001539 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001540 no_libcrt: true,
1541 nocrt: true,
1542 stl: "none",
1543 system_shared_libs: [],
1544 srcs: [""],
1545 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001546 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001547
1548 sanitize: {
1549 never: true,
1550 },
Spandan Das4de7b492023-05-05 21:13:01 +00001551 apex_available: [
1552 "//apex_available:anyapex",
1553 "//apex_available:platform",
1554 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001555 }
Paul Duffina02cae32021-03-09 01:44:06 +00001556 `)
1557 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001558
1559 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1560 "lib64/bionic/libc.so",
1561 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1562 })
1563
Colin Cross4c4c1be2022-02-10 11:41:18 -08001564 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001565
1566 installed := hwasan.Description("install libclang_rt.hwasan")
1567 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1568
1569 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1570 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1571 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1572}
1573
Jooyung Han61b66e92020-03-21 14:21:46 +00001574func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1575 testcases := []struct {
1576 name string
1577 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001578 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001579 shouldLink string
1580 shouldNotLink []string
1581 }{
1582 {
Jiyong Park55549df2021-02-26 23:57:23 +09001583 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001584 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001585 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001586 shouldLink: "current",
1587 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001588 },
1589 {
Jiyong Park55549df2021-02-26 23:57:23 +09001590 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001591 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001592 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001593 shouldLink: "current",
1594 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001595 },
1596 }
1597 for _, tc := range testcases {
1598 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001599 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001600 apex {
1601 name: "myapex",
1602 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001603 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001604 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001605 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001606 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001607
Jooyung Han61b66e92020-03-21 14:21:46 +00001608 apex_key {
1609 name: "myapex.key",
1610 public_key: "testkey.avbpubkey",
1611 private_key: "testkey.pem",
1612 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001613
Jooyung Han61b66e92020-03-21 14:21:46 +00001614 cc_library {
1615 name: "mylib",
1616 srcs: ["mylib.cpp"],
1617 vendor_available: true,
1618 shared_libs: ["libbar"],
1619 system_shared_libs: [],
1620 stl: "none",
1621 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001622 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001623 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001624
Jooyung Han61b66e92020-03-21 14:21:46 +00001625 cc_library {
1626 name: "libbar",
1627 srcs: ["mylib.cpp"],
1628 system_shared_libs: [],
1629 stl: "none",
1630 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001631 llndk: {
1632 symbol_file: "libbar.map.txt",
1633 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001634 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001635 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001636 withUnbundledBuild,
1637 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001638
Jooyung Han61b66e92020-03-21 14:21:46 +00001639 // Ensure that LLNDK dep is not included
1640 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1641 "lib64/mylib.so",
1642 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001643
Jooyung Han61b66e92020-03-21 14:21:46 +00001644 // Ensure that LLNDK dep is required
1645 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1646 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1647 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001648
Steven Moreland2c4000c2021-04-27 02:08:49 +00001649 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1650 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001651 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001652 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001653 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001654
Steven Moreland2c4000c2021-04-27 02:08:49 +00001655 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001656 ver := tc.shouldLink
1657 if tc.shouldLink == "current" {
1658 ver = strconv.Itoa(android.FutureApiLevelInt)
1659 }
1660 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001661 })
1662 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001663}
1664
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001666 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001667 apex {
1668 name: "myapex",
1669 key: "myapex.key",
1670 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001671 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001672 }
1673
1674 apex_key {
1675 name: "myapex.key",
1676 public_key: "testkey.avbpubkey",
1677 private_key: "testkey.pem",
1678 }
1679
1680 cc_library {
1681 name: "mylib",
1682 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001683 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001684 shared_libs: ["libdl#27"],
1685 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001686 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001687 }
1688
1689 cc_library_shared {
1690 name: "mylib_shared",
1691 srcs: ["mylib.cpp"],
1692 shared_libs: ["libdl#27"],
1693 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001694 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001695 }
1696
1697 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001698 name: "libBootstrap",
1699 srcs: ["mylib.cpp"],
1700 stl: "none",
1701 bootstrap: true,
1702 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001703 `)
1704
Sundong Ahnabb64432019-10-22 13:58:29 +09001705 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001706 copyCmds := apexRule.Args["copy_commands"]
1707
1708 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001709 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001710 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1711 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001712
1713 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001714 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001715
Colin Crossaede88c2020-08-11 12:17:01 -07001716 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1717 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1718 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001719
1720 // For dependency to libc
1721 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001722 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001723 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001724 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001725 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001726 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1727 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001728
1729 // For dependency to libm
1730 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001731 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001732 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001733 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001734 // ... and is not compiling with the stub
1735 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1736 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1737
1738 // For dependency to libdl
1739 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001740 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001741 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001742 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1743 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001744 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001745 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001746 // ... Cflags from stub is correctly exported to mylib
1747 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1748 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001749
1750 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001751 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1752 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1753 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1754 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001755}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001756
Jooyung Han749dc692020-04-15 11:03:39 +09001757func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001758 // there are three links between liba --> libz.
1759 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001760 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001761 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001762 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001763 apex {
1764 name: "myapex",
1765 key: "myapex.key",
1766 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001767 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001768 }
1769
1770 apex {
1771 name: "otherapex",
1772 key: "myapex.key",
1773 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001774 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001775 }
1776
1777 apex_key {
1778 name: "myapex.key",
1779 public_key: "testkey.avbpubkey",
1780 private_key: "testkey.pem",
1781 }
1782
1783 cc_library {
1784 name: "libx",
1785 shared_libs: ["liba"],
1786 system_shared_libs: [],
1787 stl: "none",
1788 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001789 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001790 }
1791
1792 cc_library {
1793 name: "liby",
1794 shared_libs: ["liba"],
1795 system_shared_libs: [],
1796 stl: "none",
1797 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001798 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001799 }
1800
1801 cc_library {
1802 name: "liba",
1803 shared_libs: ["libz"],
1804 system_shared_libs: [],
1805 stl: "none",
1806 apex_available: [
1807 "//apex_available:anyapex",
1808 "//apex_available:platform",
1809 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001810 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001811 }
1812
1813 cc_library {
1814 name: "libz",
1815 system_shared_libs: [],
1816 stl: "none",
1817 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001818 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001819 },
1820 }
Jooyung Han749dc692020-04-15 11:03:39 +09001821 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001822
1823 expectLink := func(from, from_variant, to, to_variant string) {
1824 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1825 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1826 }
1827 expectNoLink := func(from, from_variant, to, to_variant string) {
1828 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1829 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1830 }
1831 // platform liba is linked to non-stub version
1832 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001833 // liba in myapex is linked to current
1834 expectLink("liba", "shared_apex29", "libz", "shared_current")
1835 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001836 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001837 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001838 // liba in otherapex is linked to current
1839 expectLink("liba", "shared_apex30", "libz", "shared_current")
1840 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001841 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1842 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001843}
1844
Jooyung Hanaed150d2020-04-02 01:41:41 +09001845func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001846 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001847 apex {
1848 name: "myapex",
1849 key: "myapex.key",
1850 native_shared_libs: ["libx"],
1851 min_sdk_version: "R",
1852 }
1853
1854 apex_key {
1855 name: "myapex.key",
1856 public_key: "testkey.avbpubkey",
1857 private_key: "testkey.pem",
1858 }
1859
1860 cc_library {
1861 name: "libx",
1862 shared_libs: ["libz"],
1863 system_shared_libs: [],
1864 stl: "none",
1865 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001866 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001867 }
1868
1869 cc_library {
1870 name: "libz",
1871 system_shared_libs: [],
1872 stl: "none",
1873 stubs: {
1874 versions: ["29", "R"],
1875 },
1876 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001877 `,
1878 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1879 variables.Platform_version_active_codenames = []string{"R"}
1880 }),
1881 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001882
1883 expectLink := func(from, from_variant, to, to_variant string) {
1884 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1885 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1886 }
1887 expectNoLink := func(from, from_variant, to, to_variant string) {
1888 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1889 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1890 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001891 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1892 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001893 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1894 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001895}
1896
Jooyung Han4c4da062021-06-23 10:23:16 +09001897func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1898 testApex(t, `
1899 apex {
1900 name: "myapex",
1901 key: "myapex.key",
1902 java_libs: ["libx"],
1903 min_sdk_version: "S",
1904 }
1905
1906 apex_key {
1907 name: "myapex.key",
1908 public_key: "testkey.avbpubkey",
1909 private_key: "testkey.pem",
1910 }
1911
1912 java_library {
1913 name: "libx",
1914 srcs: ["a.java"],
1915 apex_available: [ "myapex" ],
1916 sdk_version: "current",
1917 min_sdk_version: "S", // should be okay
1918 }
1919 `,
1920 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1921 variables.Platform_version_active_codenames = []string{"S"}
1922 variables.Platform_sdk_codename = proptools.StringPtr("S")
1923 }),
1924 )
1925}
1926
Jooyung Han749dc692020-04-15 11:03:39 +09001927func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001928 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001929 apex {
1930 name: "myapex",
1931 key: "myapex.key",
1932 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001933 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001934 }
1935
1936 apex_key {
1937 name: "myapex.key",
1938 public_key: "testkey.avbpubkey",
1939 private_key: "testkey.pem",
1940 }
1941
1942 cc_library {
1943 name: "libx",
1944 shared_libs: ["libz"],
1945 system_shared_libs: [],
1946 stl: "none",
1947 apex_available: [ "myapex" ],
1948 }
1949
1950 cc_library {
1951 name: "libz",
1952 system_shared_libs: [],
1953 stl: "none",
1954 stubs: {
1955 versions: ["1", "2"],
1956 },
1957 }
1958 `)
1959
1960 expectLink := func(from, from_variant, to, to_variant string) {
1961 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1962 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1963 }
1964 expectNoLink := func(from, from_variant, to, to_variant string) {
1965 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1966 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1967 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001968 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001969 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001970 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001971 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001972}
1973
Jooyung Handfc864c2023-03-20 18:19:07 +09001974func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001975 ctx := testApex(t, `
1976 apex {
1977 name: "myapex",
1978 key: "myapex.key",
1979 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001980 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001981 vendor: true,
1982 min_sdk_version: "29",
1983 }
1984
1985 apex_key {
1986 name: "myapex.key",
1987 public_key: "testkey.avbpubkey",
1988 private_key: "testkey.pem",
1989 }
1990
1991 cc_library {
1992 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001993 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001994 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001995 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001996 shared_libs: ["libbar"],
1997 }
1998
1999 cc_library {
2000 name: "libbar",
2001 stubs: { versions: ["29", "30"] },
2002 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002003 }
2004 `)
2005
2006 vendorVariant := "android_vendor.29_arm64_armv8-a"
2007
Jooyung Handfc864c2023-03-20 18:19:07 +09002008 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
2009
2010 // Ensure that mylib links with "current" LLNDK
2011 libFlags := names(mylib.Rule("ld").Args["libFlags"])
2012 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
2013
2014 // Ensure that mylib is targeting 29
2015 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2016 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2017
2018 // Ensure that the correct variant of crtbegin_so is used.
2019 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2020 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002021
2022 // Ensure that the crtbegin_so used by the APEX is targeting 29
2023 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2024 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2025}
2026
Jooyung Han4495f842023-04-25 16:39:59 +09002027func TestTrackAllowedDeps(t *testing.T) {
2028 ctx := testApex(t, `
2029 apex {
2030 name: "myapex",
2031 key: "myapex.key",
2032 updatable: true,
2033 native_shared_libs: [
2034 "mylib",
2035 "yourlib",
2036 ],
2037 min_sdk_version: "29",
2038 }
2039
2040 apex {
2041 name: "myapex2",
2042 key: "myapex.key",
2043 updatable: false,
2044 native_shared_libs: ["yourlib"],
2045 }
2046
2047 apex_key {
2048 name: "myapex.key",
2049 public_key: "testkey.avbpubkey",
2050 private_key: "testkey.pem",
2051 }
2052
2053 cc_library {
2054 name: "mylib",
2055 srcs: ["mylib.cpp"],
2056 shared_libs: ["libbar"],
2057 min_sdk_version: "29",
2058 apex_available: ["myapex"],
2059 }
2060
2061 cc_library {
2062 name: "libbar",
2063 stubs: { versions: ["29", "30"] },
2064 }
2065
2066 cc_library {
2067 name: "yourlib",
2068 srcs: ["mylib.cpp"],
2069 min_sdk_version: "29",
2070 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2071 }
2072 `, withFiles(android.MockFS{
2073 "packages/modules/common/build/allowed_deps.txt": nil,
2074 }))
2075
2076 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2077 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2078 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2079 "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
2080 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2081 "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
2082
2083 myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2084 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2085 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2086 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2087 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2088 flatlist, "mylib:(minSdkVersion:29)")
2089 android.AssertStringListContains(t, "track platform-available lib",
2090 flatlist, "yourlib(minSdkVersion:29)")
2091}
2092
2093func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2094 ctx := testApex(t, `
2095 apex {
2096 name: "myapex",
2097 key: "myapex.key",
2098 updatable: true,
2099 min_sdk_version: "29",
2100 }
2101
2102 apex_key {
2103 name: "myapex.key",
2104 public_key: "testkey.avbpubkey",
2105 private_key: "testkey.pem",
2106 }
2107 `)
2108 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2109 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2110 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2111 }
2112}
2113
Jooyung Han03b51852020-02-26 22:45:42 +09002114func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002115 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002116 apex {
2117 name: "myapex",
2118 key: "myapex.key",
2119 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002120 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002121 }
2122
2123 apex_key {
2124 name: "myapex.key",
2125 public_key: "testkey.avbpubkey",
2126 private_key: "testkey.pem",
2127 }
2128
2129 cc_library {
2130 name: "libx",
2131 system_shared_libs: [],
2132 stl: "none",
2133 apex_available: [ "myapex" ],
2134 stubs: {
2135 versions: ["1", "2"],
2136 },
2137 }
2138
2139 cc_library {
2140 name: "libz",
2141 shared_libs: ["libx"],
2142 system_shared_libs: [],
2143 stl: "none",
2144 }
2145 `)
2146
2147 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002148 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002149 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2150 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2151 }
2152 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002153 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002154 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2155 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2156 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002157 expectLink("libz", "shared", "libx", "shared_current")
2158 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002159 expectNoLink("libz", "shared", "libz", "shared_1")
2160 expectNoLink("libz", "shared", "libz", "shared")
2161}
2162
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002163var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2164 func(variables android.FixtureProductVariables) {
2165 variables.SanitizeDevice = []string{"hwaddress"}
2166 },
2167)
2168
Jooyung Han75568392020-03-20 04:29:24 +09002169func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002170 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002171 apex {
2172 name: "myapex",
2173 key: "myapex.key",
2174 native_shared_libs: ["libx"],
2175 min_sdk_version: "29",
2176 }
2177
2178 apex_key {
2179 name: "myapex.key",
2180 public_key: "testkey.avbpubkey",
2181 private_key: "testkey.pem",
2182 }
2183
2184 cc_library {
2185 name: "libx",
2186 shared_libs: ["libbar"],
2187 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002188 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002189 }
2190
2191 cc_library {
2192 name: "libbar",
2193 stubs: {
2194 versions: ["29", "30"],
2195 },
2196 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002197 `,
2198 prepareForTestWithSantitizeHwaddress,
2199 )
Jooyung Han03b51852020-02-26 22:45:42 +09002200 expectLink := func(from, from_variant, to, to_variant string) {
2201 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2202 libFlags := ld.Args["libFlags"]
2203 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2204 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002205 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002206}
2207
Jooyung Han75568392020-03-20 04:29:24 +09002208func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002209 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002210 apex {
2211 name: "myapex",
2212 key: "myapex.key",
2213 native_shared_libs: ["libx"],
2214 min_sdk_version: "29",
2215 }
2216
2217 apex_key {
2218 name: "myapex.key",
2219 public_key: "testkey.avbpubkey",
2220 private_key: "testkey.pem",
2221 }
2222
2223 cc_library {
2224 name: "libx",
2225 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002226 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002227 }
Jooyung Han75568392020-03-20 04:29:24 +09002228 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002229
2230 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002231 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002232 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002233 // note that platform variant is not.
2234 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002235 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002236}
2237
Jooyung Han749dc692020-04-15 11:03:39 +09002238func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2239 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002240 apex {
2241 name: "myapex",
2242 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002243 native_shared_libs: ["mylib"],
2244 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002245 }
2246
2247 apex_key {
2248 name: "myapex.key",
2249 public_key: "testkey.avbpubkey",
2250 private_key: "testkey.pem",
2251 }
Jooyung Han749dc692020-04-15 11:03:39 +09002252
2253 cc_library {
2254 name: "mylib",
2255 srcs: ["mylib.cpp"],
2256 system_shared_libs: [],
2257 stl: "none",
2258 apex_available: [
2259 "myapex",
2260 ],
2261 min_sdk_version: "30",
2262 }
2263 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002264
2265 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2266 apex {
2267 name: "myapex",
2268 key: "myapex.key",
2269 native_shared_libs: ["libfoo.ffi"],
2270 min_sdk_version: "29",
2271 }
2272
2273 apex_key {
2274 name: "myapex.key",
2275 public_key: "testkey.avbpubkey",
2276 private_key: "testkey.pem",
2277 }
2278
2279 rust_ffi_shared {
2280 name: "libfoo.ffi",
2281 srcs: ["foo.rs"],
2282 crate_name: "foo",
2283 apex_available: [
2284 "myapex",
2285 ],
2286 min_sdk_version: "30",
2287 }
2288 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002289
2290 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2291 apex {
2292 name: "myapex",
2293 key: "myapex.key",
2294 java_libs: ["libfoo"],
2295 min_sdk_version: "29",
2296 }
2297
2298 apex_key {
2299 name: "myapex.key",
2300 public_key: "testkey.avbpubkey",
2301 private_key: "testkey.pem",
2302 }
2303
2304 java_import {
2305 name: "libfoo",
2306 jars: ["libfoo.jar"],
2307 apex_available: [
2308 "myapex",
2309 ],
2310 min_sdk_version: "30",
2311 }
2312 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002313
2314 // Skip check for modules compiling against core API surface
2315 testApex(t, `
2316 apex {
2317 name: "myapex",
2318 key: "myapex.key",
2319 java_libs: ["libfoo"],
2320 min_sdk_version: "29",
2321 }
2322
2323 apex_key {
2324 name: "myapex.key",
2325 public_key: "testkey.avbpubkey",
2326 private_key: "testkey.pem",
2327 }
2328
2329 java_library {
2330 name: "libfoo",
2331 srcs: ["Foo.java"],
2332 apex_available: [
2333 "myapex",
2334 ],
2335 // Compile against core API surface
2336 sdk_version: "core_current",
2337 min_sdk_version: "30",
2338 }
2339 `)
2340
Jooyung Han749dc692020-04-15 11:03:39 +09002341}
2342
2343func TestApexMinSdkVersion_Okay(t *testing.T) {
2344 testApex(t, `
2345 apex {
2346 name: "myapex",
2347 key: "myapex.key",
2348 native_shared_libs: ["libfoo"],
2349 java_libs: ["libbar"],
2350 min_sdk_version: "29",
2351 }
2352
2353 apex_key {
2354 name: "myapex.key",
2355 public_key: "testkey.avbpubkey",
2356 private_key: "testkey.pem",
2357 }
2358
2359 cc_library {
2360 name: "libfoo",
2361 srcs: ["mylib.cpp"],
2362 shared_libs: ["libfoo_dep"],
2363 apex_available: ["myapex"],
2364 min_sdk_version: "29",
2365 }
2366
2367 cc_library {
2368 name: "libfoo_dep",
2369 srcs: ["mylib.cpp"],
2370 apex_available: ["myapex"],
2371 min_sdk_version: "29",
2372 }
2373
2374 java_library {
2375 name: "libbar",
2376 sdk_version: "current",
2377 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002378 static_libs: [
2379 "libbar_dep",
2380 "libbar_import_dep",
2381 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002382 apex_available: ["myapex"],
2383 min_sdk_version: "29",
2384 }
2385
2386 java_library {
2387 name: "libbar_dep",
2388 sdk_version: "current",
2389 srcs: ["a.java"],
2390 apex_available: ["myapex"],
2391 min_sdk_version: "29",
2392 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002393
2394 java_import {
2395 name: "libbar_import_dep",
2396 jars: ["libbar.jar"],
2397 apex_available: ["myapex"],
2398 min_sdk_version: "29",
2399 }
Jooyung Han03b51852020-02-26 22:45:42 +09002400 `)
2401}
2402
Colin Cross8ca61c12022-10-06 21:00:14 -07002403func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2404 // Tests that an apex dependency with min_sdk_version higher than the
2405 // min_sdk_version of the apex is allowed as long as the dependency's
2406 // min_sdk_version is less than or equal to the api level that the
2407 // architecture was introduced in. In this case, arm64 didn't exist
2408 // until api level 21, so the arm64 code will never need to run on
2409 // an api level 20 device, even if other architectures of the apex
2410 // will.
2411 testApex(t, `
2412 apex {
2413 name: "myapex",
2414 key: "myapex.key",
2415 native_shared_libs: ["libfoo"],
2416 min_sdk_version: "20",
2417 }
2418
2419 apex_key {
2420 name: "myapex.key",
2421 public_key: "testkey.avbpubkey",
2422 private_key: "testkey.pem",
2423 }
2424
2425 cc_library {
2426 name: "libfoo",
2427 srcs: ["mylib.cpp"],
2428 apex_available: ["myapex"],
2429 min_sdk_version: "21",
2430 stl: "none",
2431 }
2432 `)
2433}
2434
Artur Satayev8cf899a2020-04-15 17:29:42 +01002435func TestJavaStableSdkVersion(t *testing.T) {
2436 testCases := []struct {
2437 name string
2438 expectedError string
2439 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002440 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002441 }{
2442 {
2443 name: "Non-updatable apex with non-stable dep",
2444 bp: `
2445 apex {
2446 name: "myapex",
2447 java_libs: ["myjar"],
2448 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002449 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002450 }
2451 apex_key {
2452 name: "myapex.key",
2453 public_key: "testkey.avbpubkey",
2454 private_key: "testkey.pem",
2455 }
2456 java_library {
2457 name: "myjar",
2458 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002459 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002460 apex_available: ["myapex"],
2461 }
2462 `,
2463 },
2464 {
2465 name: "Updatable apex with stable dep",
2466 bp: `
2467 apex {
2468 name: "myapex",
2469 java_libs: ["myjar"],
2470 key: "myapex.key",
2471 updatable: true,
2472 min_sdk_version: "29",
2473 }
2474 apex_key {
2475 name: "myapex.key",
2476 public_key: "testkey.avbpubkey",
2477 private_key: "testkey.pem",
2478 }
2479 java_library {
2480 name: "myjar",
2481 srcs: ["foo/bar/MyClass.java"],
2482 sdk_version: "current",
2483 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002484 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002485 }
2486 `,
2487 },
2488 {
2489 name: "Updatable apex with non-stable dep",
2490 expectedError: "cannot depend on \"myjar\"",
2491 bp: `
2492 apex {
2493 name: "myapex",
2494 java_libs: ["myjar"],
2495 key: "myapex.key",
2496 updatable: true,
2497 }
2498 apex_key {
2499 name: "myapex.key",
2500 public_key: "testkey.avbpubkey",
2501 private_key: "testkey.pem",
2502 }
2503 java_library {
2504 name: "myjar",
2505 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002506 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002507 apex_available: ["myapex"],
2508 }
2509 `,
2510 },
2511 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002512 name: "Updatable apex with non-stable legacy core platform dep",
2513 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2514 bp: `
2515 apex {
2516 name: "myapex",
2517 java_libs: ["myjar-uses-legacy"],
2518 key: "myapex.key",
2519 updatable: true,
2520 }
2521 apex_key {
2522 name: "myapex.key",
2523 public_key: "testkey.avbpubkey",
2524 private_key: "testkey.pem",
2525 }
2526 java_library {
2527 name: "myjar-uses-legacy",
2528 srcs: ["foo/bar/MyClass.java"],
2529 sdk_version: "core_platform",
2530 apex_available: ["myapex"],
2531 }
2532 `,
2533 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2534 },
2535 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002536 name: "Updatable apex with non-stable transitive dep",
2537 // This is not actually detecting that the transitive dependency is unstable, rather it is
2538 // detecting that the transitive dependency is building against a wider API surface than the
2539 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002540 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002541 bp: `
2542 apex {
2543 name: "myapex",
2544 java_libs: ["myjar"],
2545 key: "myapex.key",
2546 updatable: true,
2547 }
2548 apex_key {
2549 name: "myapex.key",
2550 public_key: "testkey.avbpubkey",
2551 private_key: "testkey.pem",
2552 }
2553 java_library {
2554 name: "myjar",
2555 srcs: ["foo/bar/MyClass.java"],
2556 sdk_version: "current",
2557 apex_available: ["myapex"],
2558 static_libs: ["transitive-jar"],
2559 }
2560 java_library {
2561 name: "transitive-jar",
2562 srcs: ["foo/bar/MyClass.java"],
2563 sdk_version: "core_platform",
2564 apex_available: ["myapex"],
2565 }
2566 `,
2567 },
2568 }
2569
2570 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002571 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2572 continue
2573 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002574 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002575 errorHandler := android.FixtureExpectsNoErrors
2576 if test.expectedError != "" {
2577 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002578 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002579 android.GroupFixturePreparers(
2580 java.PrepareForTestWithJavaDefaultModules,
2581 PrepareForTestWithApexBuildComponents,
2582 prepareForTestWithMyapex,
2583 android.OptionalFixturePreparer(test.preparer),
2584 ).
2585 ExtendWithErrorHandler(errorHandler).
2586 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002587 })
2588 }
2589}
2590
Jooyung Han749dc692020-04-15 11:03:39 +09002591func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2592 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2593 apex {
2594 name: "myapex",
2595 key: "myapex.key",
2596 native_shared_libs: ["mylib"],
2597 min_sdk_version: "29",
2598 }
2599
2600 apex_key {
2601 name: "myapex.key",
2602 public_key: "testkey.avbpubkey",
2603 private_key: "testkey.pem",
2604 }
2605
2606 cc_library {
2607 name: "mylib",
2608 srcs: ["mylib.cpp"],
2609 shared_libs: ["mylib2"],
2610 system_shared_libs: [],
2611 stl: "none",
2612 apex_available: [
2613 "myapex",
2614 ],
2615 min_sdk_version: "29",
2616 }
2617
2618 // indirect part of the apex
2619 cc_library {
2620 name: "mylib2",
2621 srcs: ["mylib.cpp"],
2622 system_shared_libs: [],
2623 stl: "none",
2624 apex_available: [
2625 "myapex",
2626 ],
2627 min_sdk_version: "30",
2628 }
2629 `)
2630}
2631
2632func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2633 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2634 apex {
2635 name: "myapex",
2636 key: "myapex.key",
2637 apps: ["AppFoo"],
2638 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002639 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002640 }
2641
2642 apex_key {
2643 name: "myapex.key",
2644 public_key: "testkey.avbpubkey",
2645 private_key: "testkey.pem",
2646 }
2647
2648 android_app {
2649 name: "AppFoo",
2650 srcs: ["foo/bar/MyClass.java"],
2651 sdk_version: "current",
2652 min_sdk_version: "29",
2653 system_modules: "none",
2654 stl: "none",
2655 static_libs: ["bar"],
2656 apex_available: [ "myapex" ],
2657 }
2658
2659 java_library {
2660 name: "bar",
2661 sdk_version: "current",
2662 srcs: ["a.java"],
2663 apex_available: [ "myapex" ],
2664 }
2665 `)
2666}
2667
2668func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002669 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002670 apex {
2671 name: "myapex",
2672 key: "myapex.key",
2673 native_shared_libs: ["mylib"],
2674 min_sdk_version: "29",
2675 }
2676
2677 apex_key {
2678 name: "myapex.key",
2679 public_key: "testkey.avbpubkey",
2680 private_key: "testkey.pem",
2681 }
2682
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002683 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002684 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2685 cc_library {
2686 name: "mylib",
2687 srcs: ["mylib.cpp"],
2688 shared_libs: ["mylib2"],
2689 system_shared_libs: [],
2690 stl: "none",
2691 apex_available: ["myapex", "otherapex"],
2692 min_sdk_version: "29",
2693 }
2694
2695 cc_library {
2696 name: "mylib2",
2697 srcs: ["mylib.cpp"],
2698 system_shared_libs: [],
2699 stl: "none",
2700 apex_available: ["otherapex"],
2701 stubs: { versions: ["29", "30"] },
2702 min_sdk_version: "30",
2703 }
2704
2705 apex {
2706 name: "otherapex",
2707 key: "myapex.key",
2708 native_shared_libs: ["mylib", "mylib2"],
2709 min_sdk_version: "30",
2710 }
2711 `)
2712 expectLink := func(from, from_variant, to, to_variant string) {
2713 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2714 libFlags := ld.Args["libFlags"]
2715 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2716 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002717 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002718 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002719}
2720
Jooyung Haned124c32021-01-26 11:43:46 +09002721func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002722 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2723 func(variables android.FixtureProductVariables) {
2724 variables.Platform_sdk_codename = proptools.StringPtr("S")
2725 variables.Platform_version_active_codenames = []string{"S"}
2726 },
2727 )
Jooyung Haned124c32021-01-26 11:43:46 +09002728 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2729 apex {
2730 name: "myapex",
2731 key: "myapex.key",
2732 native_shared_libs: ["libfoo"],
2733 min_sdk_version: "S",
2734 }
2735 apex_key {
2736 name: "myapex.key",
2737 public_key: "testkey.avbpubkey",
2738 private_key: "testkey.pem",
2739 }
2740 cc_library {
2741 name: "libfoo",
2742 shared_libs: ["libbar"],
2743 apex_available: ["myapex"],
2744 min_sdk_version: "29",
2745 }
2746 cc_library {
2747 name: "libbar",
2748 apex_available: ["myapex"],
2749 }
2750 `, withSAsActiveCodeNames)
2751}
2752
2753func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002754 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2755 variables.Platform_sdk_codename = proptools.StringPtr("S")
2756 variables.Platform_version_active_codenames = []string{"S", "T"}
2757 })
Colin Cross1c460562021-02-16 17:55:47 -08002758 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002759 apex {
2760 name: "myapex",
2761 key: "myapex.key",
2762 native_shared_libs: ["libfoo"],
2763 min_sdk_version: "S",
2764 }
2765 apex_key {
2766 name: "myapex.key",
2767 public_key: "testkey.avbpubkey",
2768 private_key: "testkey.pem",
2769 }
2770 cc_library {
2771 name: "libfoo",
2772 shared_libs: ["libbar"],
2773 apex_available: ["myapex"],
2774 min_sdk_version: "S",
2775 }
2776 cc_library {
2777 name: "libbar",
2778 stubs: {
2779 symbol_file: "libbar.map.txt",
2780 versions: ["30", "S", "T"],
2781 },
2782 }
2783 `, withSAsActiveCodeNames)
2784
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002785 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002786 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2787 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002788 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002789}
2790
Jiyong Park7c2ee712018-12-07 00:42:25 +09002791func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002792 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002793 apex {
2794 name: "myapex",
2795 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002796 native_shared_libs: ["mylib"],
2797 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002798 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002799 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002800 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002801 }
2802
2803 apex_key {
2804 name: "myapex.key",
2805 public_key: "testkey.avbpubkey",
2806 private_key: "testkey.pem",
2807 }
2808
2809 prebuilt_etc {
2810 name: "myetc",
2811 src: "myprebuilt",
2812 sub_dir: "foo/bar",
2813 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002814
2815 cc_library {
2816 name: "mylib",
2817 srcs: ["mylib.cpp"],
2818 relative_install_path: "foo/bar",
2819 system_shared_libs: [],
2820 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002821 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002822 }
2823
2824 cc_binary {
2825 name: "mybin",
2826 srcs: ["mylib.cpp"],
2827 relative_install_path: "foo/bar",
2828 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002829 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002830 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002831 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002832 `)
2833
Sundong Ahnabb64432019-10-22 13:58:29 +09002834 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002835 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002836
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002837 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002838 ensureContains(t, cmd, "/etc ")
2839 ensureContains(t, cmd, "/etc/foo ")
2840 ensureContains(t, cmd, "/etc/foo/bar ")
2841 ensureContains(t, cmd, "/lib64 ")
2842 ensureContains(t, cmd, "/lib64/foo ")
2843 ensureContains(t, cmd, "/lib64/foo/bar ")
2844 ensureContains(t, cmd, "/lib ")
2845 ensureContains(t, cmd, "/lib/foo ")
2846 ensureContains(t, cmd, "/lib/foo/bar ")
2847 ensureContains(t, cmd, "/bin ")
2848 ensureContains(t, cmd, "/bin/foo ")
2849 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002850}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002851
Jooyung Han35155c42020-02-06 17:33:20 +09002852func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002853 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002854 apex {
2855 name: "myapex",
2856 key: "myapex.key",
2857 multilib: {
2858 both: {
2859 native_shared_libs: ["mylib"],
2860 binaries: ["mybin"],
2861 },
2862 },
2863 compile_multilib: "both",
2864 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002865 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002866 }
2867
2868 apex_key {
2869 name: "myapex.key",
2870 public_key: "testkey.avbpubkey",
2871 private_key: "testkey.pem",
2872 }
2873
2874 cc_library {
2875 name: "mylib",
2876 relative_install_path: "foo/bar",
2877 system_shared_libs: [],
2878 stl: "none",
2879 apex_available: [ "myapex" ],
2880 native_bridge_supported: true,
2881 }
2882
2883 cc_binary {
2884 name: "mybin",
2885 relative_install_path: "foo/bar",
2886 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002887 stl: "none",
2888 apex_available: [ "myapex" ],
2889 native_bridge_supported: true,
2890 compile_multilib: "both", // default is "first" for binary
2891 multilib: {
2892 lib64: {
2893 suffix: "64",
2894 },
2895 },
2896 }
2897 `, withNativeBridgeEnabled)
2898 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2899 "bin/foo/bar/mybin",
2900 "bin/foo/bar/mybin64",
2901 "bin/arm/foo/bar/mybin",
2902 "bin/arm64/foo/bar/mybin64",
2903 "lib/foo/bar/mylib.so",
2904 "lib/arm/foo/bar/mylib.so",
2905 "lib64/foo/bar/mylib.so",
2906 "lib64/arm64/foo/bar/mylib.so",
2907 })
2908}
2909
Jooyung Han85d61762020-06-24 23:50:26 +09002910func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002911 result := android.GroupFixturePreparers(
2912 prepareForApexTest,
2913 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2914 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002915 apex {
2916 name: "myapex",
2917 key: "myapex.key",
2918 binaries: ["mybin"],
2919 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002920 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002921 }
2922 apex_key {
2923 name: "myapex.key",
2924 public_key: "testkey.avbpubkey",
2925 private_key: "testkey.pem",
2926 }
2927 cc_binary {
2928 name: "mybin",
2929 vendor: true,
2930 shared_libs: ["libfoo"],
2931 }
2932 cc_library {
2933 name: "libfoo",
2934 proprietary: true,
2935 }
2936 `)
2937
Colin Crossc68db4b2021-11-11 18:59:15 -08002938 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002939 "bin/mybin",
2940 "lib64/libfoo.so",
2941 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2942 "lib64/libc++.so",
2943 })
2944
Colin Crossc68db4b2021-11-11 18:59:15 -08002945 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2946 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002947 name := apexBundle.BaseModuleName()
2948 prefix := "TARGET_"
2949 var builder strings.Builder
2950 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002951 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002952 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002953 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002954
Colin Crossc68db4b2021-11-11 18:59:15 -08002955 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002956 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2957 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002958}
2959
Jooyung Hanc5a96762022-02-04 11:54:50 +09002960func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2961 testApexError(t, `Trying to include a VNDK library`, `
2962 apex {
2963 name: "myapex",
2964 key: "myapex.key",
2965 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2966 vendor: true,
2967 use_vndk_as_stable: true,
2968 updatable: false,
2969 }
2970 apex_key {
2971 name: "myapex.key",
2972 public_key: "testkey.avbpubkey",
2973 private_key: "testkey.pem",
2974 }`)
2975}
2976
Jooyung Handf78e212020-07-22 15:54:47 +09002977func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002978 // myapex myapex2
2979 // | |
2980 // mybin ------. mybin2
2981 // \ \ / |
2982 // (stable) .---\--------` |
2983 // \ / \ |
2984 // \ / \ /
2985 // libvndk libvendor
2986 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002987 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002988 apex {
2989 name: "myapex",
2990 key: "myapex.key",
2991 binaries: ["mybin"],
2992 vendor: true,
2993 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002994 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002995 }
2996 apex_key {
2997 name: "myapex.key",
2998 public_key: "testkey.avbpubkey",
2999 private_key: "testkey.pem",
3000 }
3001 cc_binary {
3002 name: "mybin",
3003 vendor: true,
3004 shared_libs: ["libvndk", "libvendor"],
3005 }
3006 cc_library {
3007 name: "libvndk",
3008 vndk: {
3009 enabled: true,
3010 },
3011 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003012 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003013 }
3014 cc_library {
3015 name: "libvendor",
3016 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003017 stl: "none",
3018 }
3019 apex {
3020 name: "myapex2",
3021 key: "myapex.key",
3022 binaries: ["mybin2"],
3023 vendor: true,
3024 use_vndk_as_stable: false,
3025 updatable: false,
3026 }
3027 cc_binary {
3028 name: "mybin2",
3029 vendor: true,
3030 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003031 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09003032 `,
3033 android.FixtureModifyConfig(func(config android.Config) {
3034 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
3035 }),
3036 )
Jooyung Handf78e212020-07-22 15:54:47 +09003037
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003038 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003039
Jooyung Han91f92032022-02-04 12:36:33 +09003040 for _, tc := range []struct {
3041 name string
3042 apexName string
3043 moduleName string
3044 moduleVariant string
3045 libs []string
3046 contents []string
3047 requireVndkNamespace bool
3048 }{
3049 {
3050 name: "use_vndk_as_stable",
3051 apexName: "myapex",
3052 moduleName: "mybin",
3053 moduleVariant: vendorVariant + "_apex10000",
3054 libs: []string{
3055 // should link with vendor variants of VNDK libs(libvndk/libc++)
3056 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3057 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3058 // unstable Vendor libs as APEX variant
3059 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3060 },
3061 contents: []string{
3062 "bin/mybin",
3063 "lib64/libvendor.so",
3064 // VNDK libs (libvndk/libc++) are not included
3065 },
3066 requireVndkNamespace: true,
3067 },
3068 {
3069 name: "!use_vndk_as_stable",
3070 apexName: "myapex2",
3071 moduleName: "mybin2",
3072 moduleVariant: vendorVariant + "_myapex2",
3073 libs: []string{
3074 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3075 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3076 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3077 // unstable vendor libs have "merged" APEX variants
3078 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3079 },
3080 contents: []string{
3081 "bin/mybin2",
3082 "lib64/libvendor.so",
3083 // VNDK libs are included as well
3084 "lib64/libvndk.so",
3085 "lib64/libc++.so",
3086 },
3087 requireVndkNamespace: false,
3088 },
3089 } {
3090 t.Run(tc.name, func(t *testing.T) {
3091 // Check linked libs
3092 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3093 libs := names(ldRule.Args["libFlags"])
3094 for _, lib := range tc.libs {
3095 ensureListContains(t, libs, lib)
3096 }
3097 // Check apex contents
3098 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003099
Jooyung Han91f92032022-02-04 12:36:33 +09003100 // Check "requireNativeLibs"
3101 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3102 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3103 if tc.requireVndkNamespace {
3104 ensureListContains(t, requireNativeLibs, ":vndk")
3105 } else {
3106 ensureListNotContains(t, requireNativeLibs, ":vndk")
3107 }
3108 })
3109 }
Jooyung Handf78e212020-07-22 15:54:47 +09003110}
3111
Justin Yun13decfb2021-03-08 19:25:55 +09003112func TestProductVariant(t *testing.T) {
3113 ctx := testApex(t, `
3114 apex {
3115 name: "myapex",
3116 key: "myapex.key",
3117 updatable: false,
3118 product_specific: true,
3119 binaries: ["foo"],
3120 }
3121
3122 apex_key {
3123 name: "myapex.key",
3124 public_key: "testkey.avbpubkey",
3125 private_key: "testkey.pem",
3126 }
3127
3128 cc_binary {
3129 name: "foo",
3130 product_available: true,
3131 apex_available: ["myapex"],
3132 srcs: ["foo.cpp"],
3133 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003134 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3135 variables.ProductVndkVersion = proptools.StringPtr("current")
3136 }),
3137 )
Justin Yun13decfb2021-03-08 19:25:55 +09003138
3139 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003140 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003141 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3142 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3143 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3144 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3145}
3146
Jooyung Han8e5685d2020-09-21 11:02:57 +09003147func TestApex_withPrebuiltFirmware(t *testing.T) {
3148 testCases := []struct {
3149 name string
3150 additionalProp string
3151 }{
3152 {"system apex with prebuilt_firmware", ""},
3153 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3154 }
3155 for _, tc := range testCases {
3156 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003157 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003158 apex {
3159 name: "myapex",
3160 key: "myapex.key",
3161 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003162 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003163 `+tc.additionalProp+`
3164 }
3165 apex_key {
3166 name: "myapex.key",
3167 public_key: "testkey.avbpubkey",
3168 private_key: "testkey.pem",
3169 }
3170 prebuilt_firmware {
3171 name: "myfirmware",
3172 src: "myfirmware.bin",
3173 filename_from_src: true,
3174 `+tc.additionalProp+`
3175 }
3176 `)
3177 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3178 "etc/firmware/myfirmware.bin",
3179 })
3180 })
3181 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003182}
3183
Jooyung Hanefb184e2020-06-25 17:14:25 +09003184func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003185 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003186 apex {
3187 name: "myapex",
3188 key: "myapex.key",
3189 vendor: true,
3190 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003191 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003192 }
3193
3194 apex_key {
3195 name: "myapex.key",
3196 public_key: "testkey.avbpubkey",
3197 private_key: "testkey.pem",
3198 }
3199
3200 cc_library {
3201 name: "mylib",
3202 vendor_available: true,
3203 }
3204 `)
3205
3206 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003207 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003208 name := apexBundle.BaseModuleName()
3209 prefix := "TARGET_"
3210 var builder strings.Builder
3211 data.Custom(&builder, name, prefix, "", data)
3212 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003213 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 +09003214}
3215
Jooyung Han2ed99d02020-06-24 23:26:26 +09003216func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003217 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003218 apex {
3219 name: "myapex",
3220 key: "myapex.key",
3221 vintf_fragments: ["fragment.xml"],
3222 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003223 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003224 }
3225 apex_key {
3226 name: "myapex.key",
3227 public_key: "testkey.avbpubkey",
3228 private_key: "testkey.pem",
3229 }
3230 cc_binary {
3231 name: "mybin",
3232 }
3233 `)
3234
3235 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003236 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003237 name := apexBundle.BaseModuleName()
3238 prefix := "TARGET_"
3239 var builder strings.Builder
3240 data.Custom(&builder, name, prefix, "", data)
3241 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003242 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003243 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003244}
3245
Jiyong Park16e91a02018-12-20 18:18:08 +09003246func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003247 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003248 apex {
3249 name: "myapex",
3250 key: "myapex.key",
3251 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003252 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003253 }
3254
3255 apex_key {
3256 name: "myapex.key",
3257 public_key: "testkey.avbpubkey",
3258 private_key: "testkey.pem",
3259 }
3260
3261 cc_library {
3262 name: "mylib",
3263 srcs: ["mylib.cpp"],
3264 system_shared_libs: [],
3265 stl: "none",
3266 stubs: {
3267 versions: ["1", "2", "3"],
3268 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003269 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003270 }
3271
3272 cc_binary {
3273 name: "not_in_apex",
3274 srcs: ["mylib.cpp"],
3275 static_libs: ["mylib"],
3276 static_executable: true,
3277 system_shared_libs: [],
3278 stl: "none",
3279 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003280 `)
3281
Colin Cross7113d202019-11-20 16:39:12 -08003282 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003283
3284 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003285 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003286}
Jiyong Park9335a262018-12-24 11:31:58 +09003287
3288func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003289 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003290 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003291 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003292 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003293 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003294 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003295 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003296 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003297 }
3298
3299 cc_library {
3300 name: "mylib",
3301 srcs: ["mylib.cpp"],
3302 system_shared_libs: [],
3303 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003304 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003305 }
3306
3307 apex_key {
3308 name: "myapex.key",
3309 public_key: "testkey.avbpubkey",
3310 private_key: "testkey.pem",
3311 }
3312
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003313 android_app_certificate {
3314 name: "myapex.certificate",
3315 certificate: "testkey",
3316 }
3317
3318 android_app_certificate {
3319 name: "myapex.certificate.override",
3320 certificate: "testkey.override",
3321 }
3322
Jiyong Park9335a262018-12-24 11:31:58 +09003323 `)
3324
3325 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003326 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003327
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003328 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3329 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003330 "vendor/foo/devkeys/testkey.avbpubkey")
3331 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003332 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3333 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003334 "vendor/foo/devkeys/testkey.pem")
3335 }
3336
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003337 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003338 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003339 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003340 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003341 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003342 }
3343}
Jiyong Park58e364a2019-01-19 19:24:06 +09003344
Jooyung Hanf121a652019-12-17 14:30:11 +09003345func TestCertificate(t *testing.T) {
3346 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003347 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003348 apex {
3349 name: "myapex",
3350 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003351 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003352 }
3353 apex_key {
3354 name: "myapex.key",
3355 public_key: "testkey.avbpubkey",
3356 private_key: "testkey.pem",
3357 }`)
3358 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3359 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.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 unspecified", 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",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003370 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003371 }
3372 apex_key {
3373 name: "myapex.key",
3374 public_key: "testkey.avbpubkey",
3375 private_key: "testkey.pem",
3376 }
3377 android_app_certificate {
3378 name: "myapex.certificate.override",
3379 certificate: "testkey.override",
3380 }`)
3381 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3382 expected := "testkey.override.x509.pem testkey.override.pk8"
3383 if actual := rule.Args["certificates"]; actual != expected {
3384 t.Errorf("certificates should be %q, not %q", expected, actual)
3385 }
3386 })
3387 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003388 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003389 apex {
3390 name: "myapex",
3391 key: "myapex.key",
3392 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003393 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003394 }
3395 apex_key {
3396 name: "myapex.key",
3397 public_key: "testkey.avbpubkey",
3398 private_key: "testkey.pem",
3399 }
3400 android_app_certificate {
3401 name: "myapex.certificate",
3402 certificate: "testkey",
3403 }`)
3404 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3405 expected := "testkey.x509.pem testkey.pk8"
3406 if actual := rule.Args["certificates"]; actual != expected {
3407 t.Errorf("certificates should be %q, not %q", expected, actual)
3408 }
3409 })
3410 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003411 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003412 apex {
3413 name: "myapex_keytest",
3414 key: "myapex.key",
3415 file_contexts: ":myapex-file_contexts",
3416 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003417 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003418 }
3419 apex_key {
3420 name: "myapex.key",
3421 public_key: "testkey.avbpubkey",
3422 private_key: "testkey.pem",
3423 }
3424 android_app_certificate {
3425 name: "myapex.certificate.override",
3426 certificate: "testkey.override",
3427 }`)
3428 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3429 expected := "testkey.override.x509.pem testkey.override.pk8"
3430 if actual := rule.Args["certificates"]; actual != expected {
3431 t.Errorf("certificates should be %q, not %q", expected, actual)
3432 }
3433 })
3434 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003435 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003436 apex {
3437 name: "myapex",
3438 key: "myapex.key",
3439 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003440 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003441 }
3442 apex_key {
3443 name: "myapex.key",
3444 public_key: "testkey.avbpubkey",
3445 private_key: "testkey.pem",
3446 }`)
3447 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3448 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3449 if actual := rule.Args["certificates"]; actual != expected {
3450 t.Errorf("certificates should be %q, not %q", expected, actual)
3451 }
3452 })
3453 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003454 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003455 apex {
3456 name: "myapex_keytest",
3457 key: "myapex.key",
3458 file_contexts: ":myapex-file_contexts",
3459 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003460 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003461 }
3462 apex_key {
3463 name: "myapex.key",
3464 public_key: "testkey.avbpubkey",
3465 private_key: "testkey.pem",
3466 }
3467 android_app_certificate {
3468 name: "myapex.certificate.override",
3469 certificate: "testkey.override",
3470 }`)
3471 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3472 expected := "testkey.override.x509.pem testkey.override.pk8"
3473 if actual := rule.Args["certificates"]; actual != expected {
3474 t.Errorf("certificates should be %q, not %q", expected, actual)
3475 }
3476 })
3477}
3478
Jiyong Park58e364a2019-01-19 19:24:06 +09003479func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003480 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003481 apex {
3482 name: "myapex",
3483 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003484 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003485 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003486 }
3487
3488 apex {
3489 name: "otherapex",
3490 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003491 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003492 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003493 }
3494
3495 apex_key {
3496 name: "myapex.key",
3497 public_key: "testkey.avbpubkey",
3498 private_key: "testkey.pem",
3499 }
3500
3501 cc_library {
3502 name: "mylib",
3503 srcs: ["mylib.cpp"],
3504 system_shared_libs: [],
3505 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003506 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003507 "myapex",
3508 "otherapex",
3509 ],
Jooyung Han24282772020-03-21 23:20:55 +09003510 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003511 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003512 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003513 cc_library {
3514 name: "mylib2",
3515 srcs: ["mylib.cpp"],
3516 system_shared_libs: [],
3517 stl: "none",
3518 apex_available: [
3519 "myapex",
3520 "otherapex",
3521 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003522 static_libs: ["mylib3"],
3523 recovery_available: true,
3524 min_sdk_version: "29",
3525 }
3526 cc_library {
3527 name: "mylib3",
3528 srcs: ["mylib.cpp"],
3529 system_shared_libs: [],
3530 stl: "none",
3531 apex_available: [
3532 "myapex",
3533 "otherapex",
3534 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003535 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003536 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003537 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003538 `)
3539
Jooyung Hanc87a0592020-03-02 17:44:33 +09003540 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003541 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003542 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003543
Vinh Tranf9754732023-01-19 22:41:46 -05003544 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003545 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003546 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003547
Vinh Tranf9754732023-01-19 22:41:46 -05003548 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003549 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003550 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003551
Colin Crossaede88c2020-08-11 12:17:01 -07003552 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3553 // each variant defines additional macros to distinguish which apex variant it is built for
3554
3555 // non-APEX variant does not have __ANDROID_APEX__ defined
3556 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3557 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3558
Vinh Tranf9754732023-01-19 22:41:46 -05003559 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003560 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3561 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003562
Jooyung Hanc87a0592020-03-02 17:44:33 +09003563 // non-APEX variant does not have __ANDROID_APEX__ defined
3564 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3565 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3566
Vinh Tranf9754732023-01-19 22:41:46 -05003567 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003568 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003569 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003570}
Jiyong Park7e636d02019-01-28 16:16:54 +09003571
3572func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003573 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003574 apex {
3575 name: "myapex",
3576 key: "myapex.key",
3577 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003578 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003579 }
3580
3581 apex_key {
3582 name: "myapex.key",
3583 public_key: "testkey.avbpubkey",
3584 private_key: "testkey.pem",
3585 }
3586
3587 cc_library_headers {
3588 name: "mylib_headers",
3589 export_include_dirs: ["my_include"],
3590 system_shared_libs: [],
3591 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003592 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003593 }
3594
3595 cc_library {
3596 name: "mylib",
3597 srcs: ["mylib.cpp"],
3598 system_shared_libs: [],
3599 stl: "none",
3600 header_libs: ["mylib_headers"],
3601 export_header_lib_headers: ["mylib_headers"],
3602 stubs: {
3603 versions: ["1", "2", "3"],
3604 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003605 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003606 }
3607
3608 cc_library {
3609 name: "otherlib",
3610 srcs: ["mylib.cpp"],
3611 system_shared_libs: [],
3612 stl: "none",
3613 shared_libs: ["mylib"],
3614 }
3615 `)
3616
Colin Cross7113d202019-11-20 16:39:12 -08003617 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003618
3619 // Ensure that the include path of the header lib is exported to 'otherlib'
3620 ensureContains(t, cFlags, "-Imy_include")
3621}
Alex Light9670d332019-01-29 18:07:33 -08003622
Jiyong Park7cd10e32020-01-14 09:22:18 +09003623type fileInApex struct {
3624 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003625 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003626 isLink bool
3627}
3628
Jooyung Han1724d582022-12-21 10:17:44 +09003629func (f fileInApex) String() string {
3630 return f.src + ":" + f.path
3631}
3632
3633func (f fileInApex) match(expectation string) bool {
3634 parts := strings.Split(expectation, ":")
3635 if len(parts) == 1 {
3636 match, _ := path.Match(parts[0], f.path)
3637 return match
3638 }
3639 if len(parts) == 2 {
3640 matchSrc, _ := path.Match(parts[0], f.src)
3641 matchDst, _ := path.Match(parts[1], f.path)
3642 return matchSrc && matchDst
3643 }
3644 panic("invalid expected file specification: " + expectation)
3645}
3646
Jooyung Hana57af4a2020-01-23 05:36:59 +00003647func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003648 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003649 module := ctx.ModuleForTests(moduleName, variant)
3650 apexRule := module.MaybeRule("apexRule")
3651 apexDir := "/image.apex/"
3652 if apexRule.Rule == nil {
3653 apexRule = module.Rule("zipApexRule")
3654 apexDir = "/image.zipapex/"
3655 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003656 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003657 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003658 for _, cmd := range strings.Split(copyCmds, "&&") {
3659 cmd = strings.TrimSpace(cmd)
3660 if cmd == "" {
3661 continue
3662 }
3663 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003664 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003665 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003666 switch terms[0] {
3667 case "mkdir":
3668 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003669 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003670 t.Fatal("copyCmds contains invalid cp command", cmd)
3671 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003672 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003673 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003674 isLink = false
3675 case "ln":
3676 if len(terms) != 3 && len(terms) != 4 {
3677 // ln LINK TARGET or ln -s LINK TARGET
3678 t.Fatal("copyCmds contains invalid ln command", cmd)
3679 }
3680 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003681 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003682 isLink = true
3683 default:
3684 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3685 }
3686 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003687 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003688 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003689 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003690 }
Jooyung Han1724d582022-12-21 10:17:44 +09003691 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003692 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003693 }
3694 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003695 return ret
3696}
3697
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003698func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003699 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003700 var failed bool
3701 var surplus []string
3702 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003703 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003704 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003705 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003706 if file.match(expected) {
3707 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003708 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003709 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003710 }
3711 }
Jooyung Han1724d582022-12-21 10:17:44 +09003712 if !matchFound {
3713 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003714 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003715 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003716
Jooyung Han31c470b2019-10-18 16:26:59 +09003717 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003718 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003719 t.Log("surplus files", surplus)
3720 failed = true
3721 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003722
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003723 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003724 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003725 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003726 if !filesMatched[expected] {
3727 missing = append(missing, expected)
3728 }
3729 }
3730 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003731 t.Log("missing files", missing)
3732 failed = true
3733 }
3734 if failed {
3735 t.Fail()
3736 }
3737}
3738
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003739func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3740 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3741}
3742
3743func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3744 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3745 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3746 if deapexer.Output != nil {
3747 outputs = append(outputs, deapexer.Output.String())
3748 }
3749 for _, output := range deapexer.ImplicitOutputs {
3750 outputs = append(outputs, output.String())
3751 }
3752 actualFiles := make([]fileInApex, 0, len(outputs))
3753 for _, output := range outputs {
3754 dir := "/deapexer/"
3755 pos := strings.LastIndex(output, dir)
3756 if pos == -1 {
3757 t.Fatal("Unknown deapexer output ", output)
3758 }
3759 path := output[pos+len(dir):]
3760 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3761 }
3762 assertFileListEquals(t, files, actualFiles)
3763}
3764
Jooyung Han344d5432019-08-23 11:17:39 +09003765func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003766 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003767 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003768 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003769 "etc/llndk.libraries.29.txt",
3770 "etc/vndkcore.libraries.29.txt",
3771 "etc/vndksp.libraries.29.txt",
3772 "etc/vndkprivate.libraries.29.txt",
3773 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003774 }
3775 testCases := []struct {
3776 vndkVersion string
3777 expectedFiles []string
3778 }{
3779 {
3780 vndkVersion: "current",
3781 expectedFiles: append(commonFiles,
3782 "lib/libvndk.so",
3783 "lib/libvndksp.so",
3784 "lib64/libvndk.so",
3785 "lib64/libvndksp.so"),
3786 },
3787 {
3788 vndkVersion: "",
3789 expectedFiles: append(commonFiles,
3790 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3791 "lib/libvndksp.so",
3792 "lib64/libvndksp.so"),
3793 },
3794 }
3795 for _, tc := range testCases {
3796 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3797 ctx := testApex(t, `
3798 apex_vndk {
3799 name: "com.android.vndk.current",
3800 key: "com.android.vndk.current.key",
3801 updatable: false,
3802 }
3803
3804 apex_key {
3805 name: "com.android.vndk.current.key",
3806 public_key: "testkey.avbpubkey",
3807 private_key: "testkey.pem",
3808 }
3809
3810 cc_library {
3811 name: "libvndk",
3812 srcs: ["mylib.cpp"],
3813 vendor_available: true,
3814 product_available: true,
3815 vndk: {
3816 enabled: true,
3817 },
3818 system_shared_libs: [],
3819 stl: "none",
3820 apex_available: [ "com.android.vndk.current" ],
3821 }
3822
3823 cc_library {
3824 name: "libvndksp",
3825 srcs: ["mylib.cpp"],
3826 vendor_available: true,
3827 product_available: true,
3828 vndk: {
3829 enabled: true,
3830 support_system_process: true,
3831 },
3832 system_shared_libs: [],
3833 stl: "none",
3834 apex_available: [ "com.android.vndk.current" ],
3835 }
3836
3837 // VNDK-Ext should not cause any problems
3838
3839 cc_library {
3840 name: "libvndk.ext",
3841 srcs: ["mylib2.cpp"],
3842 vendor: true,
3843 vndk: {
3844 enabled: true,
3845 extends: "libvndk",
3846 },
3847 system_shared_libs: [],
3848 stl: "none",
3849 }
3850
3851 cc_library {
3852 name: "libvndksp.ext",
3853 srcs: ["mylib2.cpp"],
3854 vendor: true,
3855 vndk: {
3856 enabled: true,
3857 support_system_process: true,
3858 extends: "libvndksp",
3859 },
3860 system_shared_libs: [],
3861 stl: "none",
3862 }
3863 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3864 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3865 }))
3866 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3867 })
3868 }
Jooyung Han344d5432019-08-23 11:17:39 +09003869}
3870
3871func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003872 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003873 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003874 name: "com.android.vndk.current",
3875 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003876 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003877 }
3878
3879 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003880 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003881 public_key: "testkey.avbpubkey",
3882 private_key: "testkey.pem",
3883 }
3884
3885 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003886 name: "libvndk",
3887 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003888 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003889 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003890 vndk: {
3891 enabled: true,
3892 },
3893 system_shared_libs: [],
3894 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003895 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003896 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003897
3898 cc_prebuilt_library_shared {
3899 name: "libvndk.arm",
3900 srcs: ["libvndk.arm.so"],
3901 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003902 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003903 vndk: {
3904 enabled: true,
3905 },
3906 enabled: false,
3907 arch: {
3908 arm: {
3909 enabled: true,
3910 },
3911 },
3912 system_shared_libs: [],
3913 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003914 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003915 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003916 `+vndkLibrariesTxtFiles("current"),
3917 withFiles(map[string][]byte{
3918 "libvndk.so": nil,
3919 "libvndk.arm.so": nil,
3920 }))
Colin Cross2807f002021-03-02 10:15:29 -08003921 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003922 "lib/libvndk.so",
3923 "lib/libvndk.arm.so",
3924 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003925 "lib/libc++.so",
3926 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003927 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003928 })
Jooyung Han344d5432019-08-23 11:17:39 +09003929}
3930
Jooyung Han39edb6c2019-11-06 16:53:07 +09003931func vndkLibrariesTxtFiles(vers ...string) (result string) {
3932 for _, v := range vers {
3933 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003934 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003935 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003936 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003937 name: "` + txt + `.libraries.txt",
3938 }
3939 `
3940 }
3941 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003942 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003943 result += `
3944 prebuilt_etc {
3945 name: "` + txt + `.libraries.` + v + `.txt",
3946 src: "dummy.txt",
3947 }
3948 `
3949 }
3950 }
3951 }
3952 return
3953}
3954
Jooyung Han344d5432019-08-23 11:17:39 +09003955func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003956 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003957 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003958 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003959 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003960 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003961 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003962 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003963 }
3964
3965 apex_key {
3966 name: "myapex.key",
3967 public_key: "testkey.avbpubkey",
3968 private_key: "testkey.pem",
3969 }
3970
Jooyung Han31c470b2019-10-18 16:26:59 +09003971 vndk_prebuilt_shared {
3972 name: "libvndk27",
3973 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003974 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003975 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003976 vndk: {
3977 enabled: true,
3978 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003979 target_arch: "arm64",
3980 arch: {
3981 arm: {
3982 srcs: ["libvndk27_arm.so"],
3983 },
3984 arm64: {
3985 srcs: ["libvndk27_arm64.so"],
3986 },
3987 },
Colin Cross2807f002021-03-02 10:15:29 -08003988 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003989 }
3990
3991 vndk_prebuilt_shared {
3992 name: "libvndk27",
3993 version: "27",
3994 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003995 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003996 vndk: {
3997 enabled: true,
3998 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003999 target_arch: "x86_64",
4000 arch: {
4001 x86: {
4002 srcs: ["libvndk27_x86.so"],
4003 },
4004 x86_64: {
4005 srcs: ["libvndk27_x86_64.so"],
4006 },
4007 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004008 }
4009 `+vndkLibrariesTxtFiles("27"),
4010 withFiles(map[string][]byte{
4011 "libvndk27_arm.so": nil,
4012 "libvndk27_arm64.so": nil,
4013 "libvndk27_x86.so": nil,
4014 "libvndk27_x86_64.so": nil,
4015 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004016
Colin Cross2807f002021-03-02 10:15:29 -08004017 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004018 "lib/libvndk27_arm.so",
4019 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004020 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004021 })
Jooyung Han344d5432019-08-23 11:17:39 +09004022}
4023
Jooyung Han90eee022019-10-01 20:02:42 +09004024func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004025 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004026 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004027 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004028 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004029 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004030 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004031 }
4032 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004033 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004034 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004035 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004036 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004037 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004038 }
4039 apex_key {
4040 name: "myapex.key",
4041 public_key: "testkey.avbpubkey",
4042 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004043 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004044
4045 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004046 module := ctx.ModuleForTests(moduleName, "android_common_image")
4047 apexManifestRule := module.Rule("apexManifestRule")
4048 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004049 }
4050
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004051 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004052 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004053}
4054
Jooyung Han344d5432019-08-23 11:17:39 +09004055func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004056 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004057 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004058 name: "com.android.vndk.current",
4059 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004060 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004061 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004062 }
4063
4064 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004065 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004066 public_key: "testkey.avbpubkey",
4067 private_key: "testkey.pem",
4068 }
4069
4070 cc_library {
4071 name: "libvndk",
4072 srcs: ["mylib.cpp"],
4073 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004074 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004075 native_bridge_supported: true,
4076 host_supported: true,
4077 vndk: {
4078 enabled: true,
4079 },
4080 system_shared_libs: [],
4081 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004082 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004083 }
Colin Cross2807f002021-03-02 10:15:29 -08004084 `+vndkLibrariesTxtFiles("current"),
4085 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004086
Colin Cross2807f002021-03-02 10:15:29 -08004087 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004088 "lib/libvndk.so",
4089 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004090 "lib/libc++.so",
4091 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004092 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004093 })
Jooyung Han344d5432019-08-23 11:17:39 +09004094}
4095
4096func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004097 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004098 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004099 name: "com.android.vndk.current",
4100 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004101 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004102 native_bridge_supported: true,
4103 }
4104
4105 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004106 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004107 public_key: "testkey.avbpubkey",
4108 private_key: "testkey.pem",
4109 }
4110
4111 cc_library {
4112 name: "libvndk",
4113 srcs: ["mylib.cpp"],
4114 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004115 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004116 native_bridge_supported: true,
4117 host_supported: true,
4118 vndk: {
4119 enabled: true,
4120 },
4121 system_shared_libs: [],
4122 stl: "none",
4123 }
4124 `)
4125}
4126
Jooyung Han31c470b2019-10-18 16:26:59 +09004127func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004128 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004129 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004130 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004131 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004132 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004133 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004134 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004135 }
4136
4137 apex_key {
4138 name: "myapex.key",
4139 public_key: "testkey.avbpubkey",
4140 private_key: "testkey.pem",
4141 }
4142
4143 vndk_prebuilt_shared {
4144 name: "libvndk27",
4145 version: "27",
4146 target_arch: "arm",
4147 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004148 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004149 vndk: {
4150 enabled: true,
4151 },
4152 arch: {
4153 arm: {
4154 srcs: ["libvndk27.so"],
4155 }
4156 },
4157 }
4158
4159 vndk_prebuilt_shared {
4160 name: "libvndk27",
4161 version: "27",
4162 target_arch: "arm",
4163 binder32bit: true,
4164 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004165 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004166 vndk: {
4167 enabled: true,
4168 },
4169 arch: {
4170 arm: {
4171 srcs: ["libvndk27binder32.so"],
4172 }
4173 },
Colin Cross2807f002021-03-02 10:15:29 -08004174 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004175 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004176 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004177 withFiles(map[string][]byte{
4178 "libvndk27.so": nil,
4179 "libvndk27binder32.so": nil,
4180 }),
4181 withBinder32bit,
4182 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004183 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004184 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4185 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004186 },
4187 }),
4188 )
4189
Colin Cross2807f002021-03-02 10:15:29 -08004190 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004191 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004192 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004193 })
4194}
4195
Jooyung Han45a96772020-06-15 14:59:42 +09004196func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004197 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004198 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004199 name: "com.android.vndk.current",
4200 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004201 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004202 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004203 }
4204
4205 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004206 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004207 public_key: "testkey.avbpubkey",
4208 private_key: "testkey.pem",
4209 }
4210
4211 cc_library {
4212 name: "libz",
4213 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004214 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004215 vndk: {
4216 enabled: true,
4217 },
4218 stubs: {
4219 symbol_file: "libz.map.txt",
4220 versions: ["30"],
4221 }
4222 }
4223 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4224 "libz.map.txt": nil,
4225 }))
4226
Colin Cross2807f002021-03-02 10:15:29 -08004227 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004228 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4229 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004230 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4231 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4232 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4233 "*/*",
4234 })
Jooyung Han45a96772020-06-15 14:59:42 +09004235}
4236
Jooyung Hane3f02812023-05-08 13:54:50 +09004237func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4238 ctx := testApex(t, "",
4239 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4240 variables.DeviceVndkVersion = proptools.StringPtr("27")
4241 }),
4242 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4243 cc.RegisterVendorSnapshotModules(ctx)
4244 }),
4245 withFiles(map[string][]byte{
4246 "vendor/foo/Android.bp": []byte(`
4247 apex {
4248 name: "myapex",
4249 binaries: ["foo"],
4250 key: "myapex.key",
4251 min_sdk_version: "27",
4252 vendor: true,
4253 }
4254
4255 cc_binary {
4256 name: "foo",
4257 vendor: true,
4258 srcs: ["abc.cpp"],
4259 shared_libs: [
4260 "libllndk",
4261 "libvndk",
4262 ],
4263 nocrt: true,
4264 system_shared_libs: [],
4265 min_sdk_version: "27",
4266 }
4267
4268 apex_key {
4269 name: "myapex.key",
4270 public_key: "testkey.avbpubkey",
4271 private_key: "testkey.pem",
4272 }
4273 `),
4274 // Simulate VNDK prebuilts with vendor_snapshot
4275 "prebuilts/vndk/Android.bp": []byte(`
4276 vndk_prebuilt_shared {
4277 name: "libllndk",
4278 version: "27",
4279 vendor_available: true,
4280 product_available: true,
4281 target_arch: "arm64",
4282 arch: {
4283 arm64: {
4284 srcs: ["libllndk.so"],
4285 },
4286 },
4287 }
4288
4289 vndk_prebuilt_shared {
4290 name: "libvndk",
4291 version: "27",
4292 vendor_available: true,
4293 product_available: true,
4294 target_arch: "arm64",
4295 arch: {
4296 arm64: {
4297 srcs: ["libvndk.so"],
4298 },
4299 },
4300 vndk: {
4301 enabled: true,
4302 },
4303 min_sdk_version: "27",
4304 }
4305
4306 vndk_prebuilt_shared {
4307 name: "libc++",
4308 version: "27",
4309 target_arch: "arm64",
4310 vendor_available: true,
4311 product_available: true,
4312 vndk: {
4313 enabled: true,
4314 support_system_process: true,
4315 },
4316 arch: {
4317 arm64: {
4318 srcs: ["libc++.so"],
4319 },
4320 },
4321 min_sdk_version: "apex_inherit",
4322 }
4323
4324 vendor_snapshot {
4325 name: "vendor_snapshot",
4326 version: "27",
4327 arch: {
4328 arm64: {
4329 vndk_libs: [
4330 "libc++",
4331 "libllndk",
4332 "libvndk",
4333 ],
4334 static_libs: [
4335 "libc++demangle",
4336 "libclang_rt.builtins",
4337 "libunwind",
4338 ],
4339 },
4340 }
4341 }
4342
4343 vendor_snapshot_static {
4344 name: "libclang_rt.builtins",
4345 version: "27",
4346 target_arch: "arm64",
4347 vendor: true,
4348 arch: {
4349 arm64: {
4350 src: "libclang_rt.builtins-aarch64-android.a",
4351 },
4352 },
4353 }
4354
4355 vendor_snapshot_static {
4356 name: "libc++demangle",
4357 version: "27",
4358 target_arch: "arm64",
4359 compile_multilib: "64",
4360 vendor: true,
4361 arch: {
4362 arm64: {
4363 src: "libc++demangle.a",
4364 },
4365 },
4366 min_sdk_version: "apex_inherit",
4367 }
4368
4369 vendor_snapshot_static {
4370 name: "libunwind",
4371 version: "27",
4372 target_arch: "arm64",
4373 compile_multilib: "64",
4374 vendor: true,
4375 arch: {
4376 arm64: {
4377 src: "libunwind.a",
4378 },
4379 },
4380 min_sdk_version: "apex_inherit",
4381 }
4382 `),
4383 }))
4384
4385 // Should embed the prebuilt VNDK libraries in the apex
4386 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
4387 "bin/foo",
4388 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4389 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4390 })
4391
4392 // Should link foo with prebuilt libraries (shared/static)
4393 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4394 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4395 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4396 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4397 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4398
4399 // Should declare the LLNDK library as a "required" external dependency
4400 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
4401 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4402 ensureListContains(t, requireNativeLibs, "libllndk.so")
4403}
4404
Jooyung Hane1633032019-08-01 17:41:43 +09004405func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004406 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004407 apex {
4408 name: "myapex_nodep",
4409 key: "myapex.key",
4410 native_shared_libs: ["lib_nodep"],
4411 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004412 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004413 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004414 }
4415
4416 apex {
4417 name: "myapex_dep",
4418 key: "myapex.key",
4419 native_shared_libs: ["lib_dep"],
4420 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004421 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004422 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004423 }
4424
4425 apex {
4426 name: "myapex_provider",
4427 key: "myapex.key",
4428 native_shared_libs: ["libfoo"],
4429 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004430 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004431 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004432 }
4433
4434 apex {
4435 name: "myapex_selfcontained",
4436 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004437 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004438 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004439 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004440 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004441 }
4442
4443 apex_key {
4444 name: "myapex.key",
4445 public_key: "testkey.avbpubkey",
4446 private_key: "testkey.pem",
4447 }
4448
4449 cc_library {
4450 name: "lib_nodep",
4451 srcs: ["mylib.cpp"],
4452 system_shared_libs: [],
4453 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004454 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004455 }
4456
4457 cc_library {
4458 name: "lib_dep",
4459 srcs: ["mylib.cpp"],
4460 shared_libs: ["libfoo"],
4461 system_shared_libs: [],
4462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004463 apex_available: [
4464 "myapex_dep",
4465 "myapex_provider",
4466 "myapex_selfcontained",
4467 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004468 }
4469
4470 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004471 name: "lib_dep_on_bar",
4472 srcs: ["mylib.cpp"],
4473 shared_libs: ["libbar"],
4474 system_shared_libs: [],
4475 stl: "none",
4476 apex_available: [
4477 "myapex_selfcontained",
4478 ],
4479 }
4480
4481
4482 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004483 name: "libfoo",
4484 srcs: ["mytest.cpp"],
4485 stubs: {
4486 versions: ["1"],
4487 },
4488 system_shared_libs: [],
4489 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004490 apex_available: [
4491 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004492 ],
4493 }
4494
4495 cc_library {
4496 name: "libbar",
4497 srcs: ["mytest.cpp"],
4498 stubs: {
4499 versions: ["1"],
4500 },
4501 system_shared_libs: [],
4502 stl: "none",
4503 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004504 "myapex_selfcontained",
4505 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004506 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004507
Jooyung Hane1633032019-08-01 17:41:43 +09004508 `)
4509
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004510 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004511 var provideNativeLibs, requireNativeLibs []string
4512
Sundong Ahnabb64432019-10-22 13:58:29 +09004513 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004514 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4515 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004516 ensureListEmpty(t, provideNativeLibs)
4517 ensureListEmpty(t, requireNativeLibs)
4518
Sundong Ahnabb64432019-10-22 13:58:29 +09004519 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004520 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4521 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004522 ensureListEmpty(t, provideNativeLibs)
4523 ensureListContains(t, requireNativeLibs, "libfoo.so")
4524
Sundong Ahnabb64432019-10-22 13:58:29 +09004525 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004526 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4527 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004528 ensureListContains(t, provideNativeLibs, "libfoo.so")
4529 ensureListEmpty(t, requireNativeLibs)
4530
Sundong Ahnabb64432019-10-22 13:58:29 +09004531 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004532 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4533 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004534 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004535 ensureListEmpty(t, requireNativeLibs)
4536}
4537
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004538func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4539 ctx := testApex(t, `
4540 apex {
4541 name: "myapex",
4542 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004543 native_shared_libs: ["mylib"],
4544 updatable: false,
4545 }
4546
4547 apex_key {
4548 name: "myapex.key",
4549 public_key: "testkey.avbpubkey",
4550 private_key: "testkey.pem",
4551 }
4552
4553 cc_library {
4554 name: "mylib",
4555 srcs: ["mylib.cpp"],
4556 system_shared_libs: [],
4557 stl: "none",
4558 apex_available: [
4559 "//apex_available:platform",
4560 "myapex",
4561 ],
4562 }
4563 `, android.FixtureMergeEnv(map[string]string{
4564 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4565 }))
4566
Jooyung Han63dff462023-02-09 00:11:27 +00004567 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004568 apexManifestRule := module.Rule("apexManifestRule")
4569 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4570}
4571
Vinh Tran8f5310f2022-10-07 18:16:47 -04004572func TestCompileMultilibProp(t *testing.T) {
4573 testCases := []struct {
4574 compileMultiLibProp string
4575 containedLibs []string
4576 notContainedLibs []string
4577 }{
4578 {
4579 containedLibs: []string{
4580 "image.apex/lib64/mylib.so",
4581 "image.apex/lib/mylib.so",
4582 },
4583 compileMultiLibProp: `compile_multilib: "both",`,
4584 },
4585 {
4586 containedLibs: []string{"image.apex/lib64/mylib.so"},
4587 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4588 compileMultiLibProp: `compile_multilib: "first",`,
4589 },
4590 {
4591 containedLibs: []string{"image.apex/lib64/mylib.so"},
4592 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4593 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4594 },
4595 {
4596 containedLibs: []string{"image.apex/lib64/mylib.so"},
4597 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4598 compileMultiLibProp: `compile_multilib: "64",`,
4599 },
4600 {
4601 containedLibs: []string{"image.apex/lib/mylib.so"},
4602 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4603 compileMultiLibProp: `compile_multilib: "32",`,
4604 },
4605 }
4606 for _, testCase := range testCases {
4607 ctx := testApex(t, fmt.Sprintf(`
4608 apex {
4609 name: "myapex",
4610 key: "myapex.key",
4611 %s
4612 native_shared_libs: ["mylib"],
4613 updatable: false,
4614 }
4615 apex_key {
4616 name: "myapex.key",
4617 public_key: "testkey.avbpubkey",
4618 private_key: "testkey.pem",
4619 }
4620 cc_library {
4621 name: "mylib",
4622 srcs: ["mylib.cpp"],
4623 apex_available: [
4624 "//apex_available:platform",
4625 "myapex",
4626 ],
4627 }
4628 `, testCase.compileMultiLibProp),
4629 )
4630 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4631 apexRule := module.Rule("apexRule")
4632 copyCmds := apexRule.Args["copy_commands"]
4633 for _, containedLib := range testCase.containedLibs {
4634 ensureContains(t, copyCmds, containedLib)
4635 }
4636 for _, notContainedLib := range testCase.notContainedLibs {
4637 ensureNotContains(t, copyCmds, notContainedLib)
4638 }
4639 }
4640}
4641
Alex Light0851b882019-02-07 13:20:53 -08004642func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004643 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004644 apex {
4645 name: "myapex",
4646 key: "myapex.key",
4647 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004648 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004649 }
4650
4651 apex_key {
4652 name: "myapex.key",
4653 public_key: "testkey.avbpubkey",
4654 private_key: "testkey.pem",
4655 }
4656
4657 cc_library {
4658 name: "mylib_common",
4659 srcs: ["mylib.cpp"],
4660 system_shared_libs: [],
4661 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004662 apex_available: [
4663 "//apex_available:platform",
4664 "myapex",
4665 ],
Alex Light0851b882019-02-07 13:20:53 -08004666 }
4667 `)
4668
Sundong Ahnabb64432019-10-22 13:58:29 +09004669 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004670 apexRule := module.Rule("apexRule")
4671 copyCmds := apexRule.Args["copy_commands"]
4672
4673 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4674 t.Log("Apex was a test apex!")
4675 t.Fail()
4676 }
4677 // Ensure that main rule creates an output
4678 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4679
4680 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004681 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004682
4683 // Ensure that both direct and indirect deps are copied into apex
4684 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4685
Colin Cross7113d202019-11-20 16:39:12 -08004686 // Ensure that the platform variant ends with _shared
4687 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004688
Colin Cross56a83212020-09-15 18:30:11 -07004689 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004690 t.Log("Found mylib_common not in any apex!")
4691 t.Fail()
4692 }
4693}
4694
4695func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004696 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004697 apex_test {
4698 name: "myapex",
4699 key: "myapex.key",
4700 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004701 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004702 }
4703
4704 apex_key {
4705 name: "myapex.key",
4706 public_key: "testkey.avbpubkey",
4707 private_key: "testkey.pem",
4708 }
4709
4710 cc_library {
4711 name: "mylib_common_test",
4712 srcs: ["mylib.cpp"],
4713 system_shared_libs: [],
4714 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004715 // TODO: remove //apex_available:platform
4716 apex_available: [
4717 "//apex_available:platform",
4718 "myapex",
4719 ],
Alex Light0851b882019-02-07 13:20:53 -08004720 }
4721 `)
4722
Sundong Ahnabb64432019-10-22 13:58:29 +09004723 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004724 apexRule := module.Rule("apexRule")
4725 copyCmds := apexRule.Args["copy_commands"]
4726
4727 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4728 t.Log("Apex was not a test apex!")
4729 t.Fail()
4730 }
4731 // Ensure that main rule creates an output
4732 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4733
4734 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004735 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004736
4737 // Ensure that both direct and indirect deps are copied into apex
4738 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4739
Colin Cross7113d202019-11-20 16:39:12 -08004740 // Ensure that the platform variant ends with _shared
4741 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004742}
4743
Alex Light9670d332019-01-29 18:07:33 -08004744func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004745 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004746 apex {
4747 name: "myapex",
4748 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004749 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004750 multilib: {
4751 first: {
4752 native_shared_libs: ["mylib_common"],
4753 }
4754 },
4755 target: {
4756 android: {
4757 multilib: {
4758 first: {
4759 native_shared_libs: ["mylib"],
4760 }
4761 }
4762 },
4763 host: {
4764 multilib: {
4765 first: {
4766 native_shared_libs: ["mylib2"],
4767 }
4768 }
4769 }
4770 }
4771 }
4772
4773 apex_key {
4774 name: "myapex.key",
4775 public_key: "testkey.avbpubkey",
4776 private_key: "testkey.pem",
4777 }
4778
4779 cc_library {
4780 name: "mylib",
4781 srcs: ["mylib.cpp"],
4782 system_shared_libs: [],
4783 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004784 // TODO: remove //apex_available:platform
4785 apex_available: [
4786 "//apex_available:platform",
4787 "myapex",
4788 ],
Alex Light9670d332019-01-29 18:07:33 -08004789 }
4790
4791 cc_library {
4792 name: "mylib_common",
4793 srcs: ["mylib.cpp"],
4794 system_shared_libs: [],
4795 stl: "none",
4796 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004797 // TODO: remove //apex_available:platform
4798 apex_available: [
4799 "//apex_available:platform",
4800 "myapex",
4801 ],
Alex Light9670d332019-01-29 18:07:33 -08004802 }
4803
4804 cc_library {
4805 name: "mylib2",
4806 srcs: ["mylib.cpp"],
4807 system_shared_libs: [],
4808 stl: "none",
4809 compile_multilib: "first",
4810 }
4811 `)
4812
Sundong Ahnabb64432019-10-22 13:58:29 +09004813 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004814 copyCmds := apexRule.Args["copy_commands"]
4815
4816 // Ensure that main rule creates an output
4817 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4818
4819 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004820 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4821 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4822 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004823
4824 // Ensure that both direct and indirect deps are copied into apex
4825 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4826 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4827 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4828
Colin Cross7113d202019-11-20 16:39:12 -08004829 // Ensure that the platform variant ends with _shared
4830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4831 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4832 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004833}
Jiyong Park04480cf2019-02-06 00:16:29 +09004834
Jiyong Park59140302020-12-14 18:44:04 +09004835func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004836 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004837 apex {
4838 name: "myapex",
4839 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004840 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004841 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004842 arch: {
4843 arm64: {
4844 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004845 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004846 },
4847 x86_64: {
4848 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004849 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004850 },
4851 }
4852 }
4853
4854 apex_key {
4855 name: "myapex.key",
4856 public_key: "testkey.avbpubkey",
4857 private_key: "testkey.pem",
4858 }
4859
4860 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004861 name: "mylib.generic",
4862 srcs: ["mylib.cpp"],
4863 system_shared_libs: [],
4864 stl: "none",
4865 // TODO: remove //apex_available:platform
4866 apex_available: [
4867 "//apex_available:platform",
4868 "myapex",
4869 ],
4870 }
4871
4872 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004873 name: "mylib.arm64",
4874 srcs: ["mylib.cpp"],
4875 system_shared_libs: [],
4876 stl: "none",
4877 // TODO: remove //apex_available:platform
4878 apex_available: [
4879 "//apex_available:platform",
4880 "myapex",
4881 ],
4882 }
4883
4884 cc_library {
4885 name: "mylib.x64",
4886 srcs: ["mylib.cpp"],
4887 system_shared_libs: [],
4888 stl: "none",
4889 // TODO: remove //apex_available:platform
4890 apex_available: [
4891 "//apex_available:platform",
4892 "myapex",
4893 ],
4894 }
4895 `)
4896
4897 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4898 copyCmds := apexRule.Args["copy_commands"]
4899
4900 // Ensure that apex variant is created for the direct dep
4901 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004902 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004903 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4904
4905 // Ensure that both direct and indirect deps are copied into apex
4906 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4907 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4908}
4909
Jiyong Park04480cf2019-02-06 00:16:29 +09004910func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004911 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004912 apex {
4913 name: "myapex",
4914 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004915 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004916 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004917 }
4918
4919 apex_key {
4920 name: "myapex.key",
4921 public_key: "testkey.avbpubkey",
4922 private_key: "testkey.pem",
4923 }
4924
4925 sh_binary {
4926 name: "myscript",
4927 src: "mylib.cpp",
4928 filename: "myscript.sh",
4929 sub_dir: "script",
4930 }
4931 `)
4932
Sundong Ahnabb64432019-10-22 13:58:29 +09004933 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004934 copyCmds := apexRule.Args["copy_commands"]
4935
4936 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4937}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004938
Jooyung Han91df2082019-11-20 01:49:42 +09004939func TestApexInVariousPartition(t *testing.T) {
4940 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004941 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004942 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004943 {"", "system"},
4944 {"product_specific: true", "product"},
4945 {"soc_specific: true", "vendor"},
4946 {"proprietary: true", "vendor"},
4947 {"vendor: true", "vendor"},
4948 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004949 }
4950 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004951 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004952 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004953 apex {
4954 name: "myapex",
4955 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004956 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004957 `+tc.propName+`
4958 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004959
Jooyung Han91df2082019-11-20 01:49:42 +09004960 apex_key {
4961 name: "myapex.key",
4962 public_key: "testkey.avbpubkey",
4963 private_key: "testkey.pem",
4964 }
4965 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004966
Jooyung Han91df2082019-11-20 01:49:42 +09004967 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004968 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004969 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004970 if actual != expected {
4971 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4972 }
Jooyung Han91df2082019-11-20 01:49:42 +09004973 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004974 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004975}
Jiyong Park67882562019-03-21 01:11:21 +09004976
Jooyung Han580eb4f2020-06-24 19:33:06 +09004977func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004978 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004979 apex {
4980 name: "myapex",
4981 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004982 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004983 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004984
Jooyung Han580eb4f2020-06-24 19:33:06 +09004985 apex_key {
4986 name: "myapex.key",
4987 public_key: "testkey.avbpubkey",
4988 private_key: "testkey.pem",
4989 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004990 `)
4991 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004992 rule := module.Output("file_contexts")
4993 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4994}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004995
Jooyung Han580eb4f2020-06-24 19:33:06 +09004996func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004997 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004998 apex {
4999 name: "myapex",
5000 key: "myapex.key",
5001 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005002 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005003 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005004
Jooyung Han580eb4f2020-06-24 19:33:06 +09005005 apex_key {
5006 name: "myapex.key",
5007 public_key: "testkey.avbpubkey",
5008 private_key: "testkey.pem",
5009 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005010 `, withFiles(map[string][]byte{
5011 "my_own_file_contexts": nil,
5012 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005013}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005014
Jooyung Han580eb4f2020-06-24 19:33:06 +09005015func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005016 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005017 apex {
5018 name: "myapex",
5019 key: "myapex.key",
5020 product_specific: true,
5021 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005022 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005023 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005024
Jooyung Han580eb4f2020-06-24 19:33:06 +09005025 apex_key {
5026 name: "myapex.key",
5027 public_key: "testkey.avbpubkey",
5028 private_key: "testkey.pem",
5029 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005030 `)
5031
Colin Cross1c460562021-02-16 17:55:47 -08005032 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005033 apex {
5034 name: "myapex",
5035 key: "myapex.key",
5036 product_specific: true,
5037 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005038 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005039 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005040
Jooyung Han580eb4f2020-06-24 19:33:06 +09005041 apex_key {
5042 name: "myapex.key",
5043 public_key: "testkey.avbpubkey",
5044 private_key: "testkey.pem",
5045 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005046 `, withFiles(map[string][]byte{
5047 "product_specific_file_contexts": nil,
5048 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005049 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5050 rule := module.Output("file_contexts")
5051 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5052}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005053
Jooyung Han580eb4f2020-06-24 19:33:06 +09005054func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005055 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005056 apex {
5057 name: "myapex",
5058 key: "myapex.key",
5059 product_specific: true,
5060 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005061 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005062 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005063
Jooyung Han580eb4f2020-06-24 19:33:06 +09005064 apex_key {
5065 name: "myapex.key",
5066 public_key: "testkey.avbpubkey",
5067 private_key: "testkey.pem",
5068 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005069
Jooyung Han580eb4f2020-06-24 19:33:06 +09005070 filegroup {
5071 name: "my-file-contexts",
5072 srcs: ["product_specific_file_contexts"],
5073 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005074 `, withFiles(map[string][]byte{
5075 "product_specific_file_contexts": nil,
5076 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005077 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5078 rule := module.Output("file_contexts")
5079 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005080}
5081
Jiyong Park67882562019-03-21 01:11:21 +09005082func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005083 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005084 apex_key {
5085 name: "myapex.key",
5086 public_key: ":my.avbpubkey",
5087 private_key: ":my.pem",
5088 product_specific: true,
5089 }
5090
5091 filegroup {
5092 name: "my.avbpubkey",
5093 srcs: ["testkey2.avbpubkey"],
5094 }
5095
5096 filegroup {
5097 name: "my.pem",
5098 srcs: ["testkey2.pem"],
5099 }
5100 `)
5101
5102 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5103 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005104 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005105 if actual_pubkey != expected_pubkey {
5106 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5107 }
5108 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005109 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005110 if actual_privkey != expected_privkey {
5111 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5112 }
5113}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005114
5115func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005116 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005117 prebuilt_apex {
5118 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005119 arch: {
5120 arm64: {
5121 src: "myapex-arm64.apex",
5122 },
5123 arm: {
5124 src: "myapex-arm.apex",
5125 },
5126 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005127 }
5128 `)
5129
Wei Li340ee8e2022-03-18 17:33:24 -07005130 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5131 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005132
Jiyong Parkc95714e2019-03-29 14:23:10 +09005133 expectedInput := "myapex-arm64.apex"
5134 if prebuilt.inputApex.String() != expectedInput {
5135 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5136 }
Wei Li340ee8e2022-03-18 17:33:24 -07005137 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5138 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5139 rule := testingModule.Rule("genProvenanceMetaData")
5140 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5141 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5142 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5143 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005144
5145 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5146 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005147}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005148
Paul Duffinc0609c62021-03-01 17:27:16 +00005149func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005150 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005151 prebuilt_apex {
5152 name: "myapex",
5153 }
5154 `)
5155}
5156
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005157func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005158 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005159 prebuilt_apex {
5160 name: "myapex",
5161 src: "myapex-arm.apex",
5162 filename: "notmyapex.apex",
5163 }
5164 `)
5165
Wei Li340ee8e2022-03-18 17:33:24 -07005166 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5167 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005168
5169 expected := "notmyapex.apex"
5170 if p.installFilename != expected {
5171 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5172 }
Wei Li340ee8e2022-03-18 17:33:24 -07005173 rule := testingModule.Rule("genProvenanceMetaData")
5174 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5175 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5176 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5177 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005178}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005179
Samiul Islam7c02e262021-09-08 17:48:28 +01005180func TestApexSetFilenameOverride(t *testing.T) {
5181 testApex(t, `
5182 apex_set {
5183 name: "com.company.android.myapex",
5184 apex_name: "com.android.myapex",
5185 set: "company-myapex.apks",
5186 filename: "com.company.android.myapex.apex"
5187 }
5188 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5189
5190 testApex(t, `
5191 apex_set {
5192 name: "com.company.android.myapex",
5193 apex_name: "com.android.myapex",
5194 set: "company-myapex.apks",
5195 filename: "com.company.android.myapex.capex"
5196 }
5197 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5198
5199 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5200 apex_set {
5201 name: "com.company.android.myapex",
5202 apex_name: "com.android.myapex",
5203 set: "company-myapex.apks",
5204 filename: "some-random-suffix"
5205 }
5206 `)
5207}
5208
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005209func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005210 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005211 prebuilt_apex {
5212 name: "myapex.prebuilt",
5213 src: "myapex-arm.apex",
5214 overrides: [
5215 "myapex",
5216 ],
5217 }
5218 `)
5219
Wei Li340ee8e2022-03-18 17:33:24 -07005220 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5221 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005222
5223 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005224 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005225 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005226 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005227 }
Wei Li340ee8e2022-03-18 17:33:24 -07005228 rule := testingModule.Rule("genProvenanceMetaData")
5229 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5230 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5231 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5232 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005233}
5234
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005235func TestPrebuiltApexName(t *testing.T) {
5236 testApex(t, `
5237 prebuilt_apex {
5238 name: "com.company.android.myapex",
5239 apex_name: "com.android.myapex",
5240 src: "company-myapex-arm.apex",
5241 }
5242 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5243
5244 testApex(t, `
5245 apex_set {
5246 name: "com.company.android.myapex",
5247 apex_name: "com.android.myapex",
5248 set: "company-myapex.apks",
5249 }
5250 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5251}
5252
5253func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5254 _ = android.GroupFixturePreparers(
5255 java.PrepareForTestWithJavaDefaultModules,
5256 PrepareForTestWithApexBuildComponents,
5257 android.FixtureWithRootAndroidBp(`
5258 platform_bootclasspath {
5259 name: "platform-bootclasspath",
5260 fragments: [
5261 {
5262 apex: "com.android.art",
5263 module: "art-bootclasspath-fragment",
5264 },
5265 ],
5266 }
5267
5268 prebuilt_apex {
5269 name: "com.company.android.art",
5270 apex_name: "com.android.art",
5271 src: "com.company.android.art-arm.apex",
5272 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5273 }
5274
5275 prebuilt_bootclasspath_fragment {
5276 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005277 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005278 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005279 hidden_api: {
5280 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5281 metadata: "my-bootclasspath-fragment/metadata.csv",
5282 index: "my-bootclasspath-fragment/index.csv",
5283 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5284 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5285 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005286 }
5287
5288 java_import {
5289 name: "core-oj",
5290 jars: ["prebuilt.jar"],
5291 }
5292 `),
5293 ).RunTest(t)
5294}
5295
Paul Duffin092153d2021-01-26 11:42:39 +00005296// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5297// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005298func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005299 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005300
Paul Duffin89886cb2021-02-05 16:44:03 +00005301 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005302 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005303 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005304 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005305 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005306 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005307 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5308 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5309 android.NormalizePathForTesting(dexJarBuildPath))
5310 }
5311
5312 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005313 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005314 // Make sure the import has been given the correct path to the dex jar.
5315 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5316 dexJarBuildPath := p.DexJarInstallPath()
5317 stem := android.RemoveOptionalPrebuiltPrefix(name)
5318 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5319 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5320 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005321 }
5322
Paul Duffin39853512021-02-26 11:09:39 +00005323 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005324 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005325 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005326 android.AssertArrayString(t, "Check if there is no source variant",
5327 []string{"android_common"},
5328 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005329 }
5330
5331 t.Run("prebuilt only", func(t *testing.T) {
5332 bp := `
5333 prebuilt_apex {
5334 name: "myapex",
5335 arch: {
5336 arm64: {
5337 src: "myapex-arm64.apex",
5338 },
5339 arm: {
5340 src: "myapex-arm.apex",
5341 },
5342 },
Paul Duffin39853512021-02-26 11:09:39 +00005343 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005344 }
5345
5346 java_import {
5347 name: "libfoo",
5348 jars: ["libfoo.jar"],
5349 }
Paul Duffin39853512021-02-26 11:09:39 +00005350
5351 java_sdk_library_import {
5352 name: "libbar",
5353 public: {
5354 jars: ["libbar.jar"],
5355 },
5356 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005357 `
5358
5359 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5360 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5361
Martin Stjernholm44825602021-09-17 01:44:12 +01005362 deapexerName := deapexerModuleName("myapex")
5363 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5364
Paul Duffinf6932af2021-02-26 18:21:56 +00005365 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005366 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005367 rule := deapexer.Rule("deapexer")
5368 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5369 t.Errorf("expected: %q, found: %q", expected, actual)
5370 }
5371
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005372 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005373 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005374 rule = prebuiltApex.Rule("android/soong/android.Cp")
5375 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5376 t.Errorf("expected: %q, found: %q", expected, actual)
5377 }
5378
Paul Duffin89886cb2021-02-05 16:44:03 +00005379 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005380 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005381
5382 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005383 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005384 })
5385
5386 t.Run("prebuilt with source preferred", func(t *testing.T) {
5387
5388 bp := `
5389 prebuilt_apex {
5390 name: "myapex",
5391 arch: {
5392 arm64: {
5393 src: "myapex-arm64.apex",
5394 },
5395 arm: {
5396 src: "myapex-arm.apex",
5397 },
5398 },
Paul Duffin39853512021-02-26 11:09:39 +00005399 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005400 }
5401
5402 java_import {
5403 name: "libfoo",
5404 jars: ["libfoo.jar"],
5405 }
5406
5407 java_library {
5408 name: "libfoo",
5409 }
Paul Duffin39853512021-02-26 11:09:39 +00005410
5411 java_sdk_library_import {
5412 name: "libbar",
5413 public: {
5414 jars: ["libbar.jar"],
5415 },
5416 }
5417
5418 java_sdk_library {
5419 name: "libbar",
5420 srcs: ["foo/bar/MyClass.java"],
5421 unsafe_ignore_missing_latest_api: true,
5422 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005423 `
5424
5425 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5426 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5427
Paul Duffin89886cb2021-02-05 16:44:03 +00005428 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005429 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005430 ensureNoSourceVariant(t, ctx, "libfoo")
5431
5432 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005433 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005434 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005435 })
5436
5437 t.Run("prebuilt preferred with source", func(t *testing.T) {
5438 bp := `
5439 prebuilt_apex {
5440 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005441 arch: {
5442 arm64: {
5443 src: "myapex-arm64.apex",
5444 },
5445 arm: {
5446 src: "myapex-arm.apex",
5447 },
5448 },
Paul Duffin39853512021-02-26 11:09:39 +00005449 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005450 }
5451
5452 java_import {
5453 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005454 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005455 jars: ["libfoo.jar"],
5456 }
5457
5458 java_library {
5459 name: "libfoo",
5460 }
Paul Duffin39853512021-02-26 11:09:39 +00005461
5462 java_sdk_library_import {
5463 name: "libbar",
5464 prefer: true,
5465 public: {
5466 jars: ["libbar.jar"],
5467 },
5468 }
5469
5470 java_sdk_library {
5471 name: "libbar",
5472 srcs: ["foo/bar/MyClass.java"],
5473 unsafe_ignore_missing_latest_api: true,
5474 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005475 `
5476
5477 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5478 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5479
Paul Duffin89886cb2021-02-05 16:44:03 +00005480 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005481 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005482 ensureNoSourceVariant(t, ctx, "libfoo")
5483
5484 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005485 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005486 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005487 })
5488}
5489
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005490func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005491 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005492 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005493 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5494 // is disabled.
5495 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5496 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005497
Paul Duffin37856732021-02-26 14:24:15 +00005498 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5499 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005500 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005501 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005502 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005503 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005504 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005505 foundLibfooJar = true
5506 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005507 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005508 }
5509 }
5510 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005511 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 +00005512 }
5513 }
5514
Paul Duffin40a3f652021-07-19 13:11:24 +01005515 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005516 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005517 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005518 var rule android.TestingBuildParams
5519
5520 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5521 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005522 }
5523
Paul Duffin40a3f652021-07-19 13:11:24 +01005524 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5525 t.Helper()
5526 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5527 var rule android.TestingBuildParams
5528
5529 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5530 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5531 }
5532
Paul Duffin89f570a2021-06-16 01:42:33 +01005533 fragment := java.ApexVariantReference{
5534 Apex: proptools.StringPtr("myapex"),
5535 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5536 }
5537
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005538 t.Run("prebuilt only", func(t *testing.T) {
5539 bp := `
5540 prebuilt_apex {
5541 name: "myapex",
5542 arch: {
5543 arm64: {
5544 src: "myapex-arm64.apex",
5545 },
5546 arm: {
5547 src: "myapex-arm.apex",
5548 },
5549 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005550 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5551 }
5552
5553 prebuilt_bootclasspath_fragment {
5554 name: "my-bootclasspath-fragment",
5555 contents: ["libfoo", "libbar"],
5556 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005557 hidden_api: {
5558 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5559 metadata: "my-bootclasspath-fragment/metadata.csv",
5560 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005561 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5562 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5563 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005564 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005565 }
5566
5567 java_import {
5568 name: "libfoo",
5569 jars: ["libfoo.jar"],
5570 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005571 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005572 }
Paul Duffin37856732021-02-26 14:24:15 +00005573
5574 java_sdk_library_import {
5575 name: "libbar",
5576 public: {
5577 jars: ["libbar.jar"],
5578 },
5579 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005580 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005581 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005582 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005583 `
5584
Paul Duffin89f570a2021-06-16 01:42:33 +01005585 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005586 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5587 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005588
Paul Duffin537ea3d2021-05-14 10:38:00 +01005589 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005590 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005591 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005592 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005593 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005594 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 +01005595 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005596 })
5597
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005598 t.Run("apex_set only", func(t *testing.T) {
5599 bp := `
5600 apex_set {
5601 name: "myapex",
5602 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005603 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005604 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005605 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5606 }
5607
5608 java_import {
5609 name: "myjavalib",
5610 jars: ["myjavalib.jar"],
5611 apex_available: ["myapex"],
5612 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005613 }
5614
5615 prebuilt_bootclasspath_fragment {
5616 name: "my-bootclasspath-fragment",
5617 contents: ["libfoo", "libbar"],
5618 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005619 hidden_api: {
5620 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5621 metadata: "my-bootclasspath-fragment/metadata.csv",
5622 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005623 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5624 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5625 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005626 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005627 }
5628
Liz Kammer2dc72442023-04-20 10:10:48 -04005629 prebuilt_systemserverclasspath_fragment {
5630 name: "my-systemserverclasspath-fragment",
5631 contents: ["libbaz"],
5632 apex_available: ["myapex"],
5633 }
5634
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005635 java_import {
5636 name: "libfoo",
5637 jars: ["libfoo.jar"],
5638 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005639 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005640 }
5641
5642 java_sdk_library_import {
5643 name: "libbar",
5644 public: {
5645 jars: ["libbar.jar"],
5646 },
5647 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005648 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005649 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005650 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005651
5652 java_sdk_library_import {
5653 name: "libbaz",
5654 public: {
5655 jars: ["libbaz.jar"],
5656 },
5657 apex_available: ["myapex"],
5658 shared_library: false,
5659 permitted_packages: ["baz"],
5660 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005661 `
5662
Paul Duffin89f570a2021-06-16 01:42:33 +01005663 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005664 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5665 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5666
Paul Duffin537ea3d2021-05-14 10:38:00 +01005667 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005668 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005669 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005670 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005671 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005672 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 +01005673 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005674
5675 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5676
5677 overrideNames := []string{
5678 "",
5679 "myjavalib.myapex",
5680 "libfoo.myapex",
5681 "libbar.myapex",
5682 "libbaz.myapex",
5683 }
5684 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5685 for i, e := range mkEntries {
5686 g := e.OverrideName
5687 if w := overrideNames[i]; w != g {
5688 t.Errorf("Expected override name %q, got %q", w, g)
5689 }
5690 }
5691
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005692 })
5693
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005694 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5695 bp := `
5696 prebuilt_apex {
5697 name: "myapex",
5698 arch: {
5699 arm64: {
5700 src: "myapex-arm64.apex",
5701 },
5702 arm: {
5703 src: "myapex-arm.apex",
5704 },
5705 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005706 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5707 }
5708
5709 prebuilt_bootclasspath_fragment {
5710 name: "my-bootclasspath-fragment",
5711 contents: ["libfoo", "libbar"],
5712 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005713 hidden_api: {
5714 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5715 metadata: "my-bootclasspath-fragment/metadata.csv",
5716 index: "my-bootclasspath-fragment/index.csv",
5717 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5718 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5719 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005720 }
5721
5722 java_import {
5723 name: "libfoo",
5724 jars: ["libfoo.jar"],
5725 apex_available: ["myapex"],
5726 }
5727
5728 java_library {
5729 name: "libfoo",
5730 srcs: ["foo/bar/MyClass.java"],
5731 apex_available: ["myapex"],
5732 }
Paul Duffin37856732021-02-26 14:24:15 +00005733
5734 java_sdk_library_import {
5735 name: "libbar",
5736 public: {
5737 jars: ["libbar.jar"],
5738 },
5739 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005740 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005741 }
5742
5743 java_sdk_library {
5744 name: "libbar",
5745 srcs: ["foo/bar/MyClass.java"],
5746 unsafe_ignore_missing_latest_api: true,
5747 apex_available: ["myapex"],
5748 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005749 `
5750
5751 // In this test the source (java_library) libfoo is active since the
5752 // prebuilt (java_import) defaults to prefer:false. However the
5753 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5754 // find the dex boot jar in it. We either need to disable the source libfoo
5755 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005756 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005757 // dexbootjar check is skipped if AllowMissingDependencies is true
5758 preparerAllowMissingDeps := android.GroupFixturePreparers(
5759 preparer,
5760 android.PrepareForTestWithAllowMissingDependencies,
5761 )
5762 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005763 })
5764
5765 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5766 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005767 apex {
5768 name: "myapex",
5769 key: "myapex.key",
5770 updatable: false,
5771 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5772 }
5773
5774 apex_key {
5775 name: "myapex.key",
5776 public_key: "testkey.avbpubkey",
5777 private_key: "testkey.pem",
5778 }
5779
5780 bootclasspath_fragment {
5781 name: "my-bootclasspath-fragment",
5782 contents: ["libfoo", "libbar"],
5783 apex_available: ["myapex"],
5784 hidden_api: {
5785 split_packages: ["*"],
5786 },
5787 }
5788
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005789 prebuilt_apex {
5790 name: "myapex",
5791 arch: {
5792 arm64: {
5793 src: "myapex-arm64.apex",
5794 },
5795 arm: {
5796 src: "myapex-arm.apex",
5797 },
5798 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005799 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5800 }
5801
5802 prebuilt_bootclasspath_fragment {
5803 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005804 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005805 contents: ["libfoo", "libbar"],
5806 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005807 hidden_api: {
5808 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5809 metadata: "my-bootclasspath-fragment/metadata.csv",
5810 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005811 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5812 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5813 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005814 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005815 }
5816
5817 java_import {
5818 name: "libfoo",
5819 prefer: true,
5820 jars: ["libfoo.jar"],
5821 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005822 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005823 }
5824
5825 java_library {
5826 name: "libfoo",
5827 srcs: ["foo/bar/MyClass.java"],
5828 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005829 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005830 }
Paul Duffin37856732021-02-26 14:24:15 +00005831
5832 java_sdk_library_import {
5833 name: "libbar",
5834 prefer: true,
5835 public: {
5836 jars: ["libbar.jar"],
5837 },
5838 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005839 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005840 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005841 }
5842
5843 java_sdk_library {
5844 name: "libbar",
5845 srcs: ["foo/bar/MyClass.java"],
5846 unsafe_ignore_missing_latest_api: true,
5847 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005848 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005849 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005850 `
5851
Paul Duffin89f570a2021-06-16 01:42:33 +01005852 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005853 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5854 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005855
Paul Duffin537ea3d2021-05-14 10:38:00 +01005856 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005857 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005858 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005859 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005860 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005861 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 +01005862 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005863 })
5864
5865 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5866 bp := `
5867 apex {
5868 name: "myapex",
5869 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005870 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005871 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005872 }
5873
5874 apex_key {
5875 name: "myapex.key",
5876 public_key: "testkey.avbpubkey",
5877 private_key: "testkey.pem",
5878 }
5879
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005880 bootclasspath_fragment {
5881 name: "my-bootclasspath-fragment",
5882 contents: ["libfoo", "libbar"],
5883 apex_available: ["myapex"],
5884 hidden_api: {
5885 split_packages: ["*"],
5886 },
5887 }
5888
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005889 prebuilt_apex {
5890 name: "myapex",
5891 arch: {
5892 arm64: {
5893 src: "myapex-arm64.apex",
5894 },
5895 arm: {
5896 src: "myapex-arm.apex",
5897 },
5898 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005899 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5900 }
5901
5902 prebuilt_bootclasspath_fragment {
5903 name: "my-bootclasspath-fragment",
5904 contents: ["libfoo", "libbar"],
5905 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005906 hidden_api: {
5907 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5908 metadata: "my-bootclasspath-fragment/metadata.csv",
5909 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005910 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5911 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5912 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005913 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005914 }
5915
5916 java_import {
5917 name: "libfoo",
5918 jars: ["libfoo.jar"],
5919 apex_available: ["myapex"],
5920 }
5921
5922 java_library {
5923 name: "libfoo",
5924 srcs: ["foo/bar/MyClass.java"],
5925 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005926 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005927 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005928 }
Paul Duffin37856732021-02-26 14:24:15 +00005929
5930 java_sdk_library_import {
5931 name: "libbar",
5932 public: {
5933 jars: ["libbar.jar"],
5934 },
5935 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005936 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005937 }
5938
5939 java_sdk_library {
5940 name: "libbar",
5941 srcs: ["foo/bar/MyClass.java"],
5942 unsafe_ignore_missing_latest_api: true,
5943 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005944 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005945 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005946 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005947 `
5948
Paul Duffin89f570a2021-06-16 01:42:33 +01005949 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005950 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5951 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005952
Paul Duffin537ea3d2021-05-14 10:38:00 +01005953 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005954 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005955 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5956 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005957 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5958 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 +01005959 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005960 })
5961
5962 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5963 bp := `
5964 apex {
5965 name: "myapex",
5966 enabled: false,
5967 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005968 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005969 }
5970
5971 apex_key {
5972 name: "myapex.key",
5973 public_key: "testkey.avbpubkey",
5974 private_key: "testkey.pem",
5975 }
5976
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005977 bootclasspath_fragment {
5978 name: "my-bootclasspath-fragment",
5979 enabled: false,
5980 contents: ["libfoo", "libbar"],
5981 apex_available: ["myapex"],
5982 hidden_api: {
5983 split_packages: ["*"],
5984 },
5985 }
5986
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005987 prebuilt_apex {
5988 name: "myapex",
5989 arch: {
5990 arm64: {
5991 src: "myapex-arm64.apex",
5992 },
5993 arm: {
5994 src: "myapex-arm.apex",
5995 },
5996 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005997 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5998 }
5999
6000 prebuilt_bootclasspath_fragment {
6001 name: "my-bootclasspath-fragment",
6002 contents: ["libfoo", "libbar"],
6003 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006004 hidden_api: {
6005 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6006 metadata: "my-bootclasspath-fragment/metadata.csv",
6007 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006008 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6009 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6010 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006011 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006012 }
6013
6014 java_import {
6015 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006016 jars: ["libfoo.jar"],
6017 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006018 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006019 }
6020
6021 java_library {
6022 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006023 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006024 srcs: ["foo/bar/MyClass.java"],
6025 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006026 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006027 }
Paul Duffin37856732021-02-26 14:24:15 +00006028
6029 java_sdk_library_import {
6030 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006031 public: {
6032 jars: ["libbar.jar"],
6033 },
6034 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006035 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006036 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006037 }
6038
6039 java_sdk_library {
6040 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006041 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006042 srcs: ["foo/bar/MyClass.java"],
6043 unsafe_ignore_missing_latest_api: true,
6044 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006045 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006046 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006047 `
6048
Paul Duffin89f570a2021-06-16 01:42:33 +01006049 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006050 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6051 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006052
Paul Duffin537ea3d2021-05-14 10:38:00 +01006053 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006054 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006055 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006056 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006057 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006058 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 +01006059 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006060 })
6061}
6062
Roland Levillain630846d2019-06-26 12:48:34 +01006063func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006064 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006065 apex_test {
6066 name: "myapex",
6067 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006068 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006069 tests: [
6070 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006071 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006072 ],
6073 }
6074
6075 apex_key {
6076 name: "myapex.key",
6077 public_key: "testkey.avbpubkey",
6078 private_key: "testkey.pem",
6079 }
6080
Liz Kammer1c14a212020-05-12 15:26:55 -07006081 filegroup {
6082 name: "fg",
6083 srcs: [
6084 "baz",
6085 "bar/baz"
6086 ],
6087 }
6088
Roland Levillain630846d2019-06-26 12:48:34 +01006089 cc_test {
6090 name: "mytest",
6091 gtest: false,
6092 srcs: ["mytest.cpp"],
6093 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006094 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006095 system_shared_libs: [],
6096 static_executable: true,
6097 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006098 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006099 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006100
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006101 cc_library {
6102 name: "mylib",
6103 srcs: ["mylib.cpp"],
6104 system_shared_libs: [],
6105 stl: "none",
6106 }
6107
Liz Kammer5bd365f2020-05-27 15:15:11 -07006108 filegroup {
6109 name: "fg2",
6110 srcs: [
6111 "testdata/baz"
6112 ],
6113 }
6114
Roland Levillain9b5fde92019-06-28 15:41:19 +01006115 cc_test {
6116 name: "mytests",
6117 gtest: false,
6118 srcs: [
6119 "mytest1.cpp",
6120 "mytest2.cpp",
6121 "mytest3.cpp",
6122 ],
6123 test_per_src: true,
6124 relative_install_path: "test",
6125 system_shared_libs: [],
6126 static_executable: true,
6127 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006128 data: [
6129 ":fg",
6130 ":fg2",
6131 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006132 }
Roland Levillain630846d2019-06-26 12:48:34 +01006133 `)
6134
Sundong Ahnabb64432019-10-22 13:58:29 +09006135 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006136 copyCmds := apexRule.Args["copy_commands"]
6137
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006138 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006139 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006140 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006141
Liz Kammer1c14a212020-05-12 15:26:55 -07006142 //Ensure that test data are copied into apex.
6143 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6144 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6145
Roland Levillain9b5fde92019-06-28 15:41:19 +01006146 // Ensure that test deps built with `test_per_src` are copied into apex.
6147 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6148 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6149 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006150
6151 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07006152 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006153 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006154 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006155 prefix := "TARGET_"
6156 var builder strings.Builder
6157 data.Custom(&builder, name, prefix, "", data)
6158 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006159 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6160 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6161 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6162 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006163 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006164}
6165
Jooyung Hand48f3c32019-08-23 11:18:57 +09006166func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6167 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6168 apex {
6169 name: "myapex",
6170 key: "myapex.key",
6171 native_shared_libs: ["libfoo"],
6172 }
6173
6174 apex_key {
6175 name: "myapex.key",
6176 public_key: "testkey.avbpubkey",
6177 private_key: "testkey.pem",
6178 }
6179
6180 cc_library {
6181 name: "libfoo",
6182 stl: "none",
6183 system_shared_libs: [],
6184 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006185 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006186 }
6187 `)
6188 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6189 apex {
6190 name: "myapex",
6191 key: "myapex.key",
6192 java_libs: ["myjar"],
6193 }
6194
6195 apex_key {
6196 name: "myapex.key",
6197 public_key: "testkey.avbpubkey",
6198 private_key: "testkey.pem",
6199 }
6200
6201 java_library {
6202 name: "myjar",
6203 srcs: ["foo/bar/MyClass.java"],
6204 sdk_version: "none",
6205 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006206 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006207 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006208 }
6209 `)
6210}
6211
Bill Peckhama41a6962021-01-11 10:58:54 -08006212func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006213 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006214 apex {
6215 name: "myapex",
6216 key: "myapex.key",
6217 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006218 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006219 }
6220
6221 apex_key {
6222 name: "myapex.key",
6223 public_key: "testkey.avbpubkey",
6224 private_key: "testkey.pem",
6225 }
6226
6227 java_import {
6228 name: "myjavaimport",
6229 apex_available: ["myapex"],
6230 jars: ["my.jar"],
6231 compile_dex: true,
6232 }
6233 `)
6234
6235 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6236 apexRule := module.Rule("apexRule")
6237 copyCmds := apexRule.Args["copy_commands"]
6238 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6239}
6240
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006241func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006242 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006243 apex {
6244 name: "myapex",
6245 key: "myapex.key",
6246 apps: [
6247 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006248 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006249 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006250 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006251 }
6252
6253 apex_key {
6254 name: "myapex.key",
6255 public_key: "testkey.avbpubkey",
6256 private_key: "testkey.pem",
6257 }
6258
6259 android_app {
6260 name: "AppFoo",
6261 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006262 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006263 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006264 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006265 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006266 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006267 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006268
6269 android_app {
6270 name: "AppFooPriv",
6271 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006272 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006273 system_modules: "none",
6274 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006275 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006276 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006277 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006278 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006279
6280 cc_library_shared {
6281 name: "libjni",
6282 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006283 shared_libs: ["libfoo"],
6284 stl: "none",
6285 system_shared_libs: [],
6286 apex_available: [ "myapex" ],
6287 sdk_version: "current",
6288 }
6289
6290 cc_library_shared {
6291 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006292 stl: "none",
6293 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006294 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006295 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006296 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006297 `)
6298
Sundong Ahnabb64432019-10-22 13:58:29 +09006299 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006300 apexRule := module.Rule("apexRule")
6301 copyCmds := apexRule.Args["copy_commands"]
6302
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006303 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6304 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006305 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006306
Colin Crossaede88c2020-08-11 12:17:01 -07006307 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006308 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006309 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006310 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006311 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006312 // JNI libraries including transitive deps are
6313 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006314 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006315 // ... embedded inside APK (jnilibs.zip)
6316 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6317 // ... and not directly inside the APEX
6318 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6319 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006320
6321 apexBundle := module.Module().(*apexBundle)
6322 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6323 var builder strings.Builder
6324 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6325 androidMk := builder.String()
6326 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6327 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6328 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6329 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6330 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6331 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 +01006332}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006333
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006334func TestApexWithAppImportBuildId(t *testing.T) {
6335 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6336 for _, id := range invalidBuildIds {
6337 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6338 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6339 variables.BuildId = proptools.StringPtr(id)
6340 })
6341 testApexError(t, message, `apex {
6342 name: "myapex",
6343 key: "myapex.key",
6344 apps: ["AppFooPrebuilt"],
6345 updatable: false,
6346 }
6347
6348 apex_key {
6349 name: "myapex.key",
6350 public_key: "testkey.avbpubkey",
6351 private_key: "testkey.pem",
6352 }
6353
6354 android_app_import {
6355 name: "AppFooPrebuilt",
6356 apk: "PrebuiltAppFoo.apk",
6357 presigned: true,
6358 apex_available: ["myapex"],
6359 }
6360 `, fixture)
6361 }
6362}
6363
Dario Frenicde2a032019-10-27 00:29:22 +01006364func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006365 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006366 apex {
6367 name: "myapex",
6368 key: "myapex.key",
6369 apps: [
6370 "AppFooPrebuilt",
6371 "AppFooPrivPrebuilt",
6372 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006373 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006374 }
6375
6376 apex_key {
6377 name: "myapex.key",
6378 public_key: "testkey.avbpubkey",
6379 private_key: "testkey.pem",
6380 }
6381
6382 android_app_import {
6383 name: "AppFooPrebuilt",
6384 apk: "PrebuiltAppFoo.apk",
6385 presigned: true,
6386 dex_preopt: {
6387 enabled: false,
6388 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006389 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006390 }
6391
6392 android_app_import {
6393 name: "AppFooPrivPrebuilt",
6394 apk: "PrebuiltAppFooPriv.apk",
6395 privileged: true,
6396 presigned: true,
6397 dex_preopt: {
6398 enabled: false,
6399 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006400 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006401 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006402 }
6403 `)
6404
Sundong Ahnabb64432019-10-22 13:58:29 +09006405 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006406 apexRule := module.Rule("apexRule")
6407 copyCmds := apexRule.Args["copy_commands"]
6408
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006409 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6410 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006411}
6412
6413func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006414 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006415 apex {
6416 name: "myapex",
6417 key: "myapex.key",
6418 apps: [
6419 "AppFoo",
6420 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006421 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006422 }
6423
6424 apex_key {
6425 name: "myapex.key",
6426 public_key: "testkey.avbpubkey",
6427 private_key: "testkey.pem",
6428 }
6429
6430 android_app {
6431 name: "AppFoo",
6432 srcs: ["foo/bar/MyClass.java"],
6433 sdk_version: "none",
6434 system_modules: "none",
6435 apex_available: [ "myapex" ],
6436 }
6437
6438 android_app_import {
6439 name: "AppFoo",
6440 apk: "AppFooPrebuilt.apk",
6441 filename: "AppFooPrebuilt.apk",
6442 presigned: true,
6443 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006444 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006445 }
6446 `, withFiles(map[string][]byte{
6447 "AppFooPrebuilt.apk": nil,
6448 }))
6449
6450 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006451 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006452 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006453}
6454
Dario Freni6f3937c2019-12-20 22:58:03 +00006455func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006456 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006457 apex {
6458 name: "myapex",
6459 key: "myapex.key",
6460 apps: [
6461 "TesterHelpAppFoo",
6462 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006463 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006464 }
6465
6466 apex_key {
6467 name: "myapex.key",
6468 public_key: "testkey.avbpubkey",
6469 private_key: "testkey.pem",
6470 }
6471
6472 android_test_helper_app {
6473 name: "TesterHelpAppFoo",
6474 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006475 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006476 }
6477
6478 `)
6479
6480 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6481 apexRule := module.Rule("apexRule")
6482 copyCmds := apexRule.Args["copy_commands"]
6483
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006484 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006485}
6486
Jooyung Han18020ea2019-11-13 10:50:48 +09006487func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6488 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006489 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006490 apex {
6491 name: "myapex",
6492 key: "myapex.key",
6493 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006494 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006495 }
6496
6497 apex_key {
6498 name: "myapex.key",
6499 public_key: "testkey.avbpubkey",
6500 private_key: "testkey.pem",
6501 }
6502
6503 apex {
6504 name: "otherapex",
6505 key: "myapex.key",
6506 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006507 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006508 }
6509
6510 cc_defaults {
6511 name: "libfoo-defaults",
6512 apex_available: ["otherapex"],
6513 }
6514
6515 cc_library {
6516 name: "libfoo",
6517 defaults: ["libfoo-defaults"],
6518 stl: "none",
6519 system_shared_libs: [],
6520 }`)
6521}
6522
Paul Duffine52e66f2020-03-30 17:54:29 +01006523func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006524 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006525 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006526 apex {
6527 name: "myapex",
6528 key: "myapex.key",
6529 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006530 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006531 }
6532
6533 apex_key {
6534 name: "myapex.key",
6535 public_key: "testkey.avbpubkey",
6536 private_key: "testkey.pem",
6537 }
6538
6539 apex {
6540 name: "otherapex",
6541 key: "otherapex.key",
6542 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006543 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006544 }
6545
6546 apex_key {
6547 name: "otherapex.key",
6548 public_key: "testkey.avbpubkey",
6549 private_key: "testkey.pem",
6550 }
6551
6552 cc_library {
6553 name: "libfoo",
6554 stl: "none",
6555 system_shared_libs: [],
6556 apex_available: ["otherapex"],
6557 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006558}
Jiyong Park127b40b2019-09-30 16:04:35 +09006559
Paul Duffine52e66f2020-03-30 17:54:29 +01006560func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006561 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006562 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006563.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006564.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006565.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006566.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006567.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006568.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006569 apex {
6570 name: "myapex",
6571 key: "myapex.key",
6572 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006573 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006574 }
6575
6576 apex_key {
6577 name: "myapex.key",
6578 public_key: "testkey.avbpubkey",
6579 private_key: "testkey.pem",
6580 }
6581
Jiyong Park127b40b2019-09-30 16:04:35 +09006582 cc_library {
6583 name: "libfoo",
6584 stl: "none",
6585 shared_libs: ["libbar"],
6586 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006587 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006588 }
6589
6590 cc_library {
6591 name: "libbar",
6592 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006593 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006594 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006595 apex_available: ["myapex"],
6596 }
6597
6598 cc_library {
6599 name: "libbaz",
6600 stl: "none",
6601 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006602 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006603}
Jiyong Park127b40b2019-09-30 16:04:35 +09006604
Liz Kammer5f108fa2023-05-11 14:33:17 -04006605func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6606 testApex(t, `
6607 apex {
6608 name: "myapex",
6609 key: "myapex.key",
6610 native_shared_libs: ["libfoo"],
6611 updatable: false,
6612 }
6613
6614 apex_key {
6615 name: "myapex.key",
6616 public_key: "testkey.avbpubkey",
6617 private_key: "testkey.pem",
6618 }
6619
6620 cc_library {
6621 name: "libfoo",
6622 stl: "none",
6623 static_libs: ["libbar"],
6624 system_shared_libs: [],
6625 apex_available: ["myapex"],
6626 }
6627
6628 cc_library {
6629 name: "libbar",
6630 stl: "none",
6631 shared_libs: ["libbaz"],
6632 system_shared_libs: [],
6633 apex_available: ["myapex"],
6634 }
6635
6636 cc_library {
6637 name: "libbaz",
6638 stl: "none",
6639 system_shared_libs: [],
6640 }`)
6641
6642 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6643 apex {
6644 name: "myapex",
6645 key: "myapex.key",
6646 native_shared_libs: ["libfoo"],
6647 updatable: false,
6648 }
6649
6650 apex_key {
6651 name: "myapex.key",
6652 public_key: "testkey.avbpubkey",
6653 private_key: "testkey.pem",
6654 }
6655
6656 cc_library {
6657 name: "libfoo",
6658 stl: "none",
6659 static_libs: ["libbar"],
6660 system_shared_libs: [],
6661 apex_available: ["myapex"],
6662 }
6663
6664 cc_library {
6665 name: "libbar",
6666 stl: "none",
6667 system_shared_libs: [],
6668 }`)
6669}
6670
Paul Duffine52e66f2020-03-30 17:54:29 +01006671func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006672 testApexError(t, "\"otherapex\" is not a valid module name", `
6673 apex {
6674 name: "myapex",
6675 key: "myapex.key",
6676 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006677 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006678 }
6679
6680 apex_key {
6681 name: "myapex.key",
6682 public_key: "testkey.avbpubkey",
6683 private_key: "testkey.pem",
6684 }
6685
6686 cc_library {
6687 name: "libfoo",
6688 stl: "none",
6689 system_shared_libs: [],
6690 apex_available: ["otherapex"],
6691 }`)
6692
Paul Duffine52e66f2020-03-30 17:54:29 +01006693 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006694 apex {
6695 name: "myapex",
6696 key: "myapex.key",
6697 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006698 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006699 }
6700
6701 apex_key {
6702 name: "myapex.key",
6703 public_key: "testkey.avbpubkey",
6704 private_key: "testkey.pem",
6705 }
6706
6707 cc_library {
6708 name: "libfoo",
6709 stl: "none",
6710 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006711 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006712 apex_available: ["myapex"],
6713 }
6714
6715 cc_library {
6716 name: "libbar",
6717 stl: "none",
6718 system_shared_libs: [],
6719 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006720 }
6721
6722 cc_library {
6723 name: "libbaz",
6724 stl: "none",
6725 system_shared_libs: [],
6726 stubs: {
6727 versions: ["10", "20", "30"],
6728 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006729 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006730}
Jiyong Park127b40b2019-09-30 16:04:35 +09006731
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006732func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6733 t.Run("negative variant_version produces error", func(t *testing.T) {
6734 testApexError(t, "expected an integer between 0-9; got -1", `
6735 apex {
6736 name: "myapex",
6737 key: "myapex.key",
6738 apex_available_name: "com.android.foo",
6739 variant_version: "-1",
6740 updatable: false,
6741 }
6742 apex_key {
6743 name: "myapex.key",
6744 public_key: "testkey.avbpubkey",
6745 private_key: "testkey.pem",
6746 }
6747 `)
6748 })
6749
6750 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6751 testApexError(t, "expected an integer between 0-9; got 10", `
6752 apex {
6753 name: "myapex",
6754 key: "myapex.key",
6755 apex_available_name: "com.android.foo",
6756 variant_version: "10",
6757 updatable: false,
6758 }
6759 apex_key {
6760 name: "myapex.key",
6761 public_key: "testkey.avbpubkey",
6762 private_key: "testkey.pem",
6763 }
6764 `)
6765 })
6766}
6767
6768func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6769 context := android.GroupFixturePreparers(
6770 android.PrepareForIntegrationTestWithAndroid,
6771 PrepareForTestWithApexBuildComponents,
6772 android.FixtureMergeMockFs(android.MockFS{
6773 "system/sepolicy/apex/foo-file_contexts": nil,
6774 "system/sepolicy/apex/bar-file_contexts": nil,
6775 }),
6776 )
6777 result := context.RunTestWithBp(t, `
6778 apex {
6779 name: "foo",
6780 key: "myapex.key",
6781 apex_available_name: "com.android.foo",
6782 variant_version: "0",
6783 updatable: false,
6784 }
6785 apex {
6786 name: "bar",
6787 key: "myapex.key",
6788 apex_available_name: "com.android.foo",
6789 variant_version: "3",
6790 updatable: false,
6791 }
6792 apex_key {
6793 name: "myapex.key",
6794 public_key: "testkey.avbpubkey",
6795 private_key: "testkey.pem",
6796 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006797 override_apex {
6798 name: "myoverrideapex",
6799 base: "bar",
6800 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006801 `)
6802
6803 fooManifestRule := result.ModuleForTests("foo", "android_common_foo_image").Rule("apexManifestRule")
6804 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6805 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6806 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6807 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6808 }
6809
6810 barManifestRule := result.ModuleForTests("bar", "android_common_bar_image").Rule("apexManifestRule")
6811 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6812 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6813 barActualDefaultVersion := barManifestRule.Args["default_version"]
6814 if barActualDefaultVersion != barExpectedDefaultVersion {
6815 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6816 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006817
6818 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar_image").Rule("apexManifestRule")
6819 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6820 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6821 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6822 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006823}
6824
Sam Delmericoca816532023-06-02 14:09:50 -04006825func TestApexAvailable_ApexAvailableName(t *testing.T) {
6826 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6827 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6828 apex {
6829 name: "myapex_sminus",
6830 key: "myapex.key",
6831 apps: ["AppFoo"],
6832 apex_available_name: "myapex",
6833 updatable: false,
6834 }
6835 apex {
6836 name: "myapex",
6837 key: "myapex.key",
6838 apps: ["AppFoo"],
6839 updatable: false,
6840 }
6841 apex_key {
6842 name: "myapex.key",
6843 public_key: "testkey.avbpubkey",
6844 private_key: "testkey.pem",
6845 }
6846 android_app {
6847 name: "AppFoo",
6848 srcs: ["foo/bar/MyClass.java"],
6849 sdk_version: "none",
6850 system_modules: "none",
6851 apex_available: [ "myapex_sminus" ],
6852 }`,
6853 android.FixtureMergeMockFs(android.MockFS{
6854 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6855 }),
6856 )
6857 })
6858
6859 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6860 testApex(t, `
6861 apex {
6862 name: "myapex_sminus",
6863 key: "myapex.key",
6864 apps: ["AppFoo"],
6865 apex_available_name: "myapex",
6866 updatable: false,
6867 }
6868 apex {
6869 name: "myapex",
6870 key: "myapex.key",
6871 apps: ["AppFoo"],
6872 updatable: false,
6873 }
6874 apex_key {
6875 name: "myapex.key",
6876 public_key: "testkey.avbpubkey",
6877 private_key: "testkey.pem",
6878 }
6879 android_app {
6880 name: "AppFoo",
6881 srcs: ["foo/bar/MyClass.java"],
6882 sdk_version: "none",
6883 system_modules: "none",
6884 apex_available: [ "myapex" ],
6885 }`,
6886 android.FixtureMergeMockFs(android.MockFS{
6887 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6888 }),
6889 )
6890 })
6891
6892 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6893 testApex(t, `
6894 override_apex {
6895 name: "myoverrideapex_sminus",
6896 base: "myapex_sminus",
6897 key: "myapex.key",
6898 apps: ["AppFooOverride"],
6899 }
6900 override_apex {
6901 name: "myoverrideapex",
6902 base: "myapex",
6903 key: "myapex.key",
6904 apps: ["AppFooOverride"],
6905 }
6906 apex {
6907 name: "myapex_sminus",
6908 key: "myapex.key",
6909 apps: ["AppFoo"],
6910 apex_available_name: "myapex",
6911 updatable: false,
6912 }
6913 apex {
6914 name: "myapex",
6915 key: "myapex.key",
6916 apps: ["AppFoo"],
6917 updatable: false,
6918 }
6919 apex_key {
6920 name: "myapex.key",
6921 public_key: "testkey.avbpubkey",
6922 private_key: "testkey.pem",
6923 }
6924 android_app {
6925 name: "AppFooOverride",
6926 srcs: ["foo/bar/MyClass.java"],
6927 sdk_version: "none",
6928 system_modules: "none",
6929 apex_available: [ "myapex" ],
6930 }
6931 android_app {
6932 name: "AppFoo",
6933 srcs: ["foo/bar/MyClass.java"],
6934 sdk_version: "none",
6935 system_modules: "none",
6936 apex_available: [ "myapex" ],
6937 }`,
6938 android.FixtureMergeMockFs(android.MockFS{
6939 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6940 }),
6941 )
6942 })
6943}
6944
6945func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6946 context := android.GroupFixturePreparers(
6947 android.PrepareForIntegrationTestWithAndroid,
6948 PrepareForTestWithApexBuildComponents,
6949 java.PrepareForTestWithDexpreopt,
6950 android.FixtureMergeMockFs(android.MockFS{
6951 "system/sepolicy/apex/myapex-file_contexts": nil,
6952 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6953 }),
6954 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6955 variables.BuildId = proptools.StringPtr("buildid")
6956 }),
6957 )
6958 context.RunTestWithBp(t, `
6959 override_apex {
6960 name: "myoverrideapex_sminus",
6961 base: "myapex_sminus",
6962 }
6963 override_apex {
6964 name: "myoverrideapex",
6965 base: "myapex",
6966 }
6967 apex {
6968 name: "myapex",
6969 key: "myapex.key",
6970 apps: ["AppFoo"],
6971 updatable: false,
6972 }
6973 apex {
6974 name: "myapex_sminus",
6975 apex_available_name: "myapex",
6976 key: "myapex.key",
6977 apps: ["AppFoo_sminus"],
6978 updatable: false,
6979 }
6980 apex_key {
6981 name: "myapex.key",
6982 public_key: "testkey.avbpubkey",
6983 private_key: "testkey.pem",
6984 }
6985 android_app {
6986 name: "AppFoo",
6987 srcs: ["foo/bar/MyClass.java"],
6988 sdk_version: "none",
6989 system_modules: "none",
6990 apex_available: [ "myapex" ],
6991 }
6992 android_app {
6993 name: "AppFoo_sminus",
6994 srcs: ["foo/bar/MyClass.java"],
6995 sdk_version: "none",
6996 min_sdk_version: "29",
6997 system_modules: "none",
6998 apex_available: [ "myapex" ],
6999 }`)
7000}
7001
Jiyong Park89e850a2020-04-07 16:37:39 +09007002func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007003 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007004 apex {
7005 name: "myapex",
7006 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007007 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007008 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007009 }
7010
7011 apex_key {
7012 name: "myapex.key",
7013 public_key: "testkey.avbpubkey",
7014 private_key: "testkey.pem",
7015 }
7016
7017 cc_library {
7018 name: "libfoo",
7019 stl: "none",
7020 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007021 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007022 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007023 }
7024
7025 cc_library {
7026 name: "libfoo2",
7027 stl: "none",
7028 system_shared_libs: [],
7029 shared_libs: ["libbaz"],
7030 apex_available: ["//apex_available:platform"],
7031 }
7032
7033 cc_library {
7034 name: "libbar",
7035 stl: "none",
7036 system_shared_libs: [],
7037 apex_available: ["myapex"],
7038 }
7039
7040 cc_library {
7041 name: "libbaz",
7042 stl: "none",
7043 system_shared_libs: [],
7044 apex_available: ["myapex"],
7045 stubs: {
7046 versions: ["1"],
7047 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007048 }`)
7049
Jiyong Park89e850a2020-04-07 16:37:39 +09007050 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7051 // because it depends on libbar which isn't available to platform
7052 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7053 if libfoo.NotAvailableForPlatform() != true {
7054 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7055 }
7056
7057 // libfoo2 however can be available to platform because it depends on libbaz which provides
7058 // stubs
7059 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7060 if libfoo2.NotAvailableForPlatform() == true {
7061 t.Errorf("%q should be available to platform", libfoo2.String())
7062 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007063}
Jiyong Parka90ca002019-10-07 15:47:24 +09007064
Paul Duffine52e66f2020-03-30 17:54:29 +01007065func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007066 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007067 apex {
7068 name: "myapex",
7069 key: "myapex.key",
7070 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007071 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007072 }
7073
7074 apex_key {
7075 name: "myapex.key",
7076 public_key: "testkey.avbpubkey",
7077 private_key: "testkey.pem",
7078 }
7079
7080 cc_library {
7081 name: "libfoo",
7082 stl: "none",
7083 system_shared_libs: [],
7084 apex_available: ["myapex"],
7085 static: {
7086 apex_available: ["//apex_available:platform"],
7087 },
7088 }`)
7089
Jiyong Park89e850a2020-04-07 16:37:39 +09007090 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7091 if libfooShared.NotAvailableForPlatform() != true {
7092 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7093 }
7094 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7095 if libfooStatic.NotAvailableForPlatform() != false {
7096 t.Errorf("%q should be available to platform", libfooStatic.String())
7097 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007098}
7099
Jiyong Park5d790c32019-11-15 18:40:32 +09007100func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007101 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007102 apex {
7103 name: "myapex",
7104 key: "myapex.key",
7105 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007106 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007107 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007108 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007109 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007110 }
7111
7112 override_apex {
7113 name: "override_myapex",
7114 base: "myapex",
7115 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007116 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007117 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007118 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007119 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007120 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007121 key: "mynewapex.key",
7122 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007123 }
7124
7125 apex_key {
7126 name: "myapex.key",
7127 public_key: "testkey.avbpubkey",
7128 private_key: "testkey.pem",
7129 }
7130
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007131 apex_key {
7132 name: "mynewapex.key",
7133 public_key: "testkey2.avbpubkey",
7134 private_key: "testkey2.pem",
7135 }
7136
7137 android_app_certificate {
7138 name: "myapex.certificate",
7139 certificate: "testkey",
7140 }
7141
Jiyong Park5d790c32019-11-15 18:40:32 +09007142 android_app {
7143 name: "app",
7144 srcs: ["foo/bar/MyClass.java"],
7145 package_name: "foo",
7146 sdk_version: "none",
7147 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007148 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007149 }
7150
7151 override_android_app {
7152 name: "override_app",
7153 base: "app",
7154 package_name: "bar",
7155 }
markchien7c803b82021-08-26 22:10:06 +08007156
7157 bpf {
7158 name: "bpf",
7159 srcs: ["bpf.c"],
7160 }
7161
7162 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007163 name: "overrideBpf",
7164 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007165 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007166
7167 prebuilt_etc {
7168 name: "myetc",
7169 src: "myprebuilt",
7170 }
7171
7172 prebuilt_etc {
7173 name: "override_myetc",
7174 src: "override_myprebuilt",
7175 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007176 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007177
Jiyong Park317645e2019-12-05 13:20:58 +09007178 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
7179 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
7180 if originalVariant.GetOverriddenBy() != "" {
7181 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7182 }
7183 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7184 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7185 }
7186
Jiyong Park5d790c32019-11-15 18:40:32 +09007187 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
7188 apexRule := module.Rule("apexRule")
7189 copyCmds := apexRule.Args["copy_commands"]
7190
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007191 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7192 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007193
markchien7c803b82021-08-26 22:10:06 +08007194 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007195 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007196
Daniel Norman5a3ce132021-08-26 15:44:43 -07007197 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7198 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7199
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007200 apexBundle := module.Module().(*apexBundle)
7201 name := apexBundle.Name()
7202 if name != "override_myapex" {
7203 t.Errorf("name should be \"override_myapex\", but was %q", name)
7204 }
7205
Baligh Uddin004d7172020-02-19 21:29:28 -08007206 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7207 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7208 }
7209
Jiyong Park20bacab2020-03-03 11:45:41 +09007210 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007211 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007212 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7213
7214 signApkRule := module.Rule("signapk")
7215 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007216
Colin Crossaa255532020-07-03 13:18:24 -07007217 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007218 var builder strings.Builder
7219 data.Custom(&builder, name, "TARGET_", "", data)
7220 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007221 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7222 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007223 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007224 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007225 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007226 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007227 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007228 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007229}
7230
Albert Martineefabcf2022-03-21 20:11:16 +00007231func TestMinSdkVersionOverride(t *testing.T) {
7232 // Override from 29 to 31
7233 minSdkOverride31 := "31"
7234 ctx := testApex(t, `
7235 apex {
7236 name: "myapex",
7237 key: "myapex.key",
7238 native_shared_libs: ["mylib"],
7239 updatable: true,
7240 min_sdk_version: "29"
7241 }
7242
7243 override_apex {
7244 name: "override_myapex",
7245 base: "myapex",
7246 logging_parent: "com.foo.bar",
7247 package_name: "test.overridden.package"
7248 }
7249
7250 apex_key {
7251 name: "myapex.key",
7252 public_key: "testkey.avbpubkey",
7253 private_key: "testkey.pem",
7254 }
7255
7256 cc_library {
7257 name: "mylib",
7258 srcs: ["mylib.cpp"],
7259 runtime_libs: ["libbar"],
7260 system_shared_libs: [],
7261 stl: "none",
7262 apex_available: [ "myapex" ],
7263 min_sdk_version: "apex_inherit"
7264 }
7265
7266 cc_library {
7267 name: "libbar",
7268 srcs: ["mylib.cpp"],
7269 system_shared_libs: [],
7270 stl: "none",
7271 apex_available: [ "myapex" ],
7272 min_sdk_version: "apex_inherit"
7273 }
7274
7275 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7276
7277 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7278 copyCmds := apexRule.Args["copy_commands"]
7279
7280 // Ensure that direct non-stubs dep is always included
7281 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7282
7283 // Ensure that runtime_libs dep in included
7284 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7285
7286 // Ensure libraries target overridden min_sdk_version value
7287 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7288}
7289
7290func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7291 // Attempt to override from 31 to 29, should be a NOOP
7292 minSdkOverride29 := "29"
7293 ctx := testApex(t, `
7294 apex {
7295 name: "myapex",
7296 key: "myapex.key",
7297 native_shared_libs: ["mylib"],
7298 updatable: true,
7299 min_sdk_version: "31"
7300 }
7301
7302 override_apex {
7303 name: "override_myapex",
7304 base: "myapex",
7305 logging_parent: "com.foo.bar",
7306 package_name: "test.overridden.package"
7307 }
7308
7309 apex_key {
7310 name: "myapex.key",
7311 public_key: "testkey.avbpubkey",
7312 private_key: "testkey.pem",
7313 }
7314
7315 cc_library {
7316 name: "mylib",
7317 srcs: ["mylib.cpp"],
7318 runtime_libs: ["libbar"],
7319 system_shared_libs: [],
7320 stl: "none",
7321 apex_available: [ "myapex" ],
7322 min_sdk_version: "apex_inherit"
7323 }
7324
7325 cc_library {
7326 name: "libbar",
7327 srcs: ["mylib.cpp"],
7328 system_shared_libs: [],
7329 stl: "none",
7330 apex_available: [ "myapex" ],
7331 min_sdk_version: "apex_inherit"
7332 }
7333
7334 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7335
7336 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
7337 copyCmds := apexRule.Args["copy_commands"]
7338
7339 // Ensure that direct non-stubs dep is always included
7340 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7341
7342 // Ensure that runtime_libs dep in included
7343 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7344
7345 // Ensure libraries target the original min_sdk_version value rather than the overridden
7346 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7347}
7348
Jooyung Han214bf372019-11-12 13:03:50 +09007349func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007350 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007351 apex {
7352 name: "myapex",
7353 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007354 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007355 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007356 }
7357
7358 apex_key {
7359 name: "myapex.key",
7360 public_key: "testkey.avbpubkey",
7361 private_key: "testkey.pem",
7362 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007363
7364 cc_library {
7365 name: "mylib",
7366 srcs: ["mylib.cpp"],
7367 stl: "libc++",
7368 system_shared_libs: [],
7369 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007370 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007371 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007372 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007373
7374 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
7375 args := module.Rule("apexRule").Args
7376 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007377 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007378
7379 // The copies of the libraries in the apex should have one more dependency than
7380 // the ones outside the apex, namely the unwinder. Ideally we should check
7381 // the dependency names directly here but for some reason the names are blank in
7382 // this test.
7383 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007384 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007385 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7386 if len(apexImplicits) != len(nonApexImplicits)+1 {
7387 t.Errorf("%q missing unwinder dep", lib)
7388 }
7389 }
Jooyung Han214bf372019-11-12 13:03:50 +09007390}
7391
Paul Duffine05480a2021-03-08 15:07:14 +00007392var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007393 "api/current.txt": nil,
7394 "api/removed.txt": nil,
7395 "api/system-current.txt": nil,
7396 "api/system-removed.txt": nil,
7397 "api/test-current.txt": nil,
7398 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007399
Anton Hanssondff2c782020-12-21 17:10:01 +00007400 "100/public/api/foo.txt": nil,
7401 "100/public/api/foo-removed.txt": nil,
7402 "100/system/api/foo.txt": nil,
7403 "100/system/api/foo-removed.txt": nil,
7404
Paul Duffineedc5d52020-06-12 17:46:39 +01007405 // For java_sdk_library_import
7406 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007407}
7408
Jooyung Han58f26ab2019-12-18 15:34:32 +09007409func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007410 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007411 apex {
7412 name: "myapex",
7413 key: "myapex.key",
7414 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007415 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007416 }
7417
7418 apex_key {
7419 name: "myapex.key",
7420 public_key: "testkey.avbpubkey",
7421 private_key: "testkey.pem",
7422 }
7423
7424 java_sdk_library {
7425 name: "foo",
7426 srcs: ["a.java"],
7427 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007428 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007429 }
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))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007436
7437 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00007438 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007439 "javalib/foo.jar",
7440 "etc/permissions/foo.xml",
7441 })
7442 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007443 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007444 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 +09007445}
7446
Paul Duffin9b879592020-05-26 13:21:35 +01007447func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007448 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007449 apex {
7450 name: "myapex",
7451 key: "myapex.key",
7452 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007453 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007454 }
7455
7456 apex_key {
7457 name: "myapex.key",
7458 public_key: "testkey.avbpubkey",
7459 private_key: "testkey.pem",
7460 }
7461
7462 java_sdk_library {
7463 name: "foo",
7464 srcs: ["a.java"],
7465 api_packages: ["foo"],
7466 apex_available: ["myapex"],
7467 sdk_version: "none",
7468 system_modules: "none",
7469 }
7470
7471 java_library {
7472 name: "bar",
7473 srcs: ["a.java"],
7474 libs: ["foo"],
7475 apex_available: ["myapex"],
7476 sdk_version: "none",
7477 system_modules: "none",
7478 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007479
7480 prebuilt_apis {
7481 name: "sdk",
7482 api_dirs: ["100"],
7483 }
Paul Duffin9b879592020-05-26 13:21:35 +01007484 `, withFiles(filesForSdkLibrary))
7485
7486 // java_sdk_library installs both impl jar and permission XML
7487 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7488 "javalib/bar.jar",
7489 "javalib/foo.jar",
7490 "etc/permissions/foo.xml",
7491 })
7492
7493 // The bar library should depend on the implementation jar.
7494 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007495 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007496 t.Errorf("expected %q, found %#q", expected, actual)
7497 }
7498}
7499
7500func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007501 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007502 apex {
7503 name: "myapex",
7504 key: "myapex.key",
7505 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007506 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007507 }
7508
7509 apex_key {
7510 name: "myapex.key",
7511 public_key: "testkey.avbpubkey",
7512 private_key: "testkey.pem",
7513 }
7514
7515 java_sdk_library {
7516 name: "foo",
7517 srcs: ["a.java"],
7518 api_packages: ["foo"],
7519 apex_available: ["myapex"],
7520 sdk_version: "none",
7521 system_modules: "none",
7522 }
7523
7524 java_library {
7525 name: "bar",
7526 srcs: ["a.java"],
7527 libs: ["foo"],
7528 sdk_version: "none",
7529 system_modules: "none",
7530 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007531
7532 prebuilt_apis {
7533 name: "sdk",
7534 api_dirs: ["100"],
7535 }
Paul Duffin9b879592020-05-26 13:21:35 +01007536 `, withFiles(filesForSdkLibrary))
7537
7538 // java_sdk_library installs both impl jar and permission XML
7539 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7540 "javalib/foo.jar",
7541 "etc/permissions/foo.xml",
7542 })
7543
7544 // The bar library should depend on the stubs jar.
7545 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007546 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007547 t.Errorf("expected %q, found %#q", expected, actual)
7548 }
7549}
7550
Paul Duffineedc5d52020-06-12 17:46:39 +01007551func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007552 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007553 prebuilt_apis {
7554 name: "sdk",
7555 api_dirs: ["100"],
7556 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007557 withFiles(map[string][]byte{
7558 "apex/a.java": nil,
7559 "apex/apex_manifest.json": nil,
7560 "apex/Android.bp": []byte(`
7561 package {
7562 default_visibility: ["//visibility:private"],
7563 }
7564
7565 apex {
7566 name: "myapex",
7567 key: "myapex.key",
7568 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007569 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007570 }
7571
7572 apex_key {
7573 name: "myapex.key",
7574 public_key: "testkey.avbpubkey",
7575 private_key: "testkey.pem",
7576 }
7577
7578 java_library {
7579 name: "bar",
7580 srcs: ["a.java"],
7581 libs: ["foo"],
7582 apex_available: ["myapex"],
7583 sdk_version: "none",
7584 system_modules: "none",
7585 }
7586`),
7587 "source/a.java": nil,
7588 "source/api/current.txt": nil,
7589 "source/api/removed.txt": nil,
7590 "source/Android.bp": []byte(`
7591 package {
7592 default_visibility: ["//visibility:private"],
7593 }
7594
7595 java_sdk_library {
7596 name: "foo",
7597 visibility: ["//apex"],
7598 srcs: ["a.java"],
7599 api_packages: ["foo"],
7600 apex_available: ["myapex"],
7601 sdk_version: "none",
7602 system_modules: "none",
7603 public: {
7604 enabled: true,
7605 },
7606 }
7607`),
7608 "prebuilt/a.jar": nil,
7609 "prebuilt/Android.bp": []byte(`
7610 package {
7611 default_visibility: ["//visibility:private"],
7612 }
7613
7614 java_sdk_library_import {
7615 name: "foo",
7616 visibility: ["//apex", "//source"],
7617 apex_available: ["myapex"],
7618 prefer: true,
7619 public: {
7620 jars: ["a.jar"],
7621 },
7622 }
7623`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007624 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007625 )
7626
7627 // java_sdk_library installs both impl jar and permission XML
7628 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7629 "javalib/bar.jar",
7630 "javalib/foo.jar",
7631 "etc/permissions/foo.xml",
7632 })
7633
7634 // The bar library should depend on the implementation jar.
7635 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007636 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007637 t.Errorf("expected %q, found %#q", expected, actual)
7638 }
7639}
7640
7641func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7642 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7643 apex {
7644 name: "myapex",
7645 key: "myapex.key",
7646 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007647 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007648 }
7649
7650 apex_key {
7651 name: "myapex.key",
7652 public_key: "testkey.avbpubkey",
7653 private_key: "testkey.pem",
7654 }
7655
7656 java_sdk_library_import {
7657 name: "foo",
7658 apex_available: ["myapex"],
7659 prefer: true,
7660 public: {
7661 jars: ["a.jar"],
7662 },
7663 }
7664
7665 `, withFiles(filesForSdkLibrary))
7666}
7667
atrost6e126252020-01-27 17:01:16 +00007668func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007669 result := android.GroupFixturePreparers(
7670 prepareForApexTest,
7671 java.PrepareForTestWithPlatformCompatConfig,
7672 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007673 apex {
7674 name: "myapex",
7675 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007676 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007677 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007678 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007679 }
7680
7681 apex_key {
7682 name: "myapex.key",
7683 public_key: "testkey.avbpubkey",
7684 private_key: "testkey.pem",
7685 }
7686
7687 platform_compat_config {
7688 name: "myjar-platform-compat-config",
7689 src: ":myjar",
7690 }
7691
7692 java_library {
7693 name: "myjar",
7694 srcs: ["foo/bar/MyClass.java"],
7695 sdk_version: "none",
7696 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007697 apex_available: [ "myapex" ],
7698 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007699
7700 // Make sure that a preferred prebuilt does not affect the apex contents.
7701 prebuilt_platform_compat_config {
7702 name: "myjar-platform-compat-config",
7703 metadata: "compat-config/metadata.xml",
7704 prefer: true,
7705 }
atrost6e126252020-01-27 17:01:16 +00007706 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007707 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007708 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7709 "etc/compatconfig/myjar-platform-compat-config.xml",
7710 "javalib/myjar.jar",
7711 })
7712}
7713
Jooyung Han862c0d62022-12-21 10:15:37 +09007714func TestNoDupeApexFiles(t *testing.T) {
7715 android.GroupFixturePreparers(
7716 android.PrepareForTestWithAndroidBuildComponents,
7717 PrepareForTestWithApexBuildComponents,
7718 prepareForTestWithMyapex,
7719 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7720 ).
7721 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7722 RunTestWithBp(t, `
7723 apex {
7724 name: "myapex",
7725 key: "myapex.key",
7726 prebuilts: ["foo", "bar"],
7727 updatable: false,
7728 }
7729
7730 apex_key {
7731 name: "myapex.key",
7732 public_key: "testkey.avbpubkey",
7733 private_key: "testkey.pem",
7734 }
7735
7736 prebuilt_etc {
7737 name: "foo",
7738 src: "myprebuilt",
7739 filename_from_src: true,
7740 }
7741
7742 prebuilt_etc {
7743 name: "bar",
7744 src: "myprebuilt",
7745 filename_from_src: true,
7746 }
7747 `)
7748}
7749
Jiyong Park479321d2019-12-16 11:47:12 +09007750func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7751 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7752 apex {
7753 name: "myapex",
7754 key: "myapex.key",
7755 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007756 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007757 }
7758
7759 apex_key {
7760 name: "myapex.key",
7761 public_key: "testkey.avbpubkey",
7762 private_key: "testkey.pem",
7763 }
7764
7765 java_library {
7766 name: "myjar",
7767 srcs: ["foo/bar/MyClass.java"],
7768 sdk_version: "none",
7769 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007770 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007771 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007772 }
7773 `)
7774}
7775
Jiyong Park7afd1072019-12-30 16:56:33 +09007776func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007777 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007778 apex {
7779 name: "myapex",
7780 key: "myapex.key",
7781 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007782 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007783 }
7784
7785 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"],
7794 system_shared_libs: [],
7795 stl: "none",
7796 required: ["a", "b"],
7797 host_required: ["c", "d"],
7798 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007799 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007800 }
7801 `)
7802
7803 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007804 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007805 name := apexBundle.BaseModuleName()
7806 prefix := "TARGET_"
7807 var builder strings.Builder
7808 data.Custom(&builder, name, prefix, "", data)
7809 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007810 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007811 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7812 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007813}
7814
Jiyong Park7cd10e32020-01-14 09:22:18 +09007815func TestSymlinksFromApexToSystem(t *testing.T) {
7816 bp := `
7817 apex {
7818 name: "myapex",
7819 key: "myapex.key",
7820 native_shared_libs: ["mylib"],
7821 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007822 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007823 }
7824
Jiyong Park9d677202020-02-19 16:29:35 +09007825 apex {
7826 name: "myapex.updatable",
7827 key: "myapex.key",
7828 native_shared_libs: ["mylib"],
7829 java_libs: ["myjar"],
7830 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007831 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007832 }
7833
Jiyong Park7cd10e32020-01-14 09:22:18 +09007834 apex_key {
7835 name: "myapex.key",
7836 public_key: "testkey.avbpubkey",
7837 private_key: "testkey.pem",
7838 }
7839
7840 cc_library {
7841 name: "mylib",
7842 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007843 shared_libs: [
7844 "myotherlib",
7845 "myotherlib_ext",
7846 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007847 system_shared_libs: [],
7848 stl: "none",
7849 apex_available: [
7850 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007851 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007852 "//apex_available:platform",
7853 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007854 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007855 }
7856
7857 cc_library {
7858 name: "myotherlib",
7859 srcs: ["mylib.cpp"],
7860 system_shared_libs: [],
7861 stl: "none",
7862 apex_available: [
7863 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007864 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007865 "//apex_available:platform",
7866 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007867 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007868 }
7869
Jiyong Parkce243632023-02-17 18:22:25 +09007870 cc_library {
7871 name: "myotherlib_ext",
7872 srcs: ["mylib.cpp"],
7873 system_shared_libs: [],
7874 system_ext_specific: true,
7875 stl: "none",
7876 apex_available: [
7877 "myapex",
7878 "myapex.updatable",
7879 "//apex_available:platform",
7880 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007881 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007882 }
7883
Jiyong Park7cd10e32020-01-14 09:22:18 +09007884 java_library {
7885 name: "myjar",
7886 srcs: ["foo/bar/MyClass.java"],
7887 sdk_version: "none",
7888 system_modules: "none",
7889 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007890 apex_available: [
7891 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007892 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007893 "//apex_available:platform",
7894 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007895 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007896 }
7897
7898 java_library {
7899 name: "myotherjar",
7900 srcs: ["foo/bar/MyClass.java"],
7901 sdk_version: "none",
7902 system_modules: "none",
7903 apex_available: [
7904 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007905 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007906 "//apex_available:platform",
7907 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007908 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007909 }
7910 `
7911
7912 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7913 for _, f := range files {
7914 if f.path == file {
7915 if f.isLink {
7916 t.Errorf("%q is not a real file", file)
7917 }
7918 return
7919 }
7920 }
7921 t.Errorf("%q is not found", file)
7922 }
7923
Jiyong Parkce243632023-02-17 18:22:25 +09007924 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007925 for _, f := range files {
7926 if f.path == file {
7927 if !f.isLink {
7928 t.Errorf("%q is not a symlink", file)
7929 }
Jiyong Parkce243632023-02-17 18:22:25 +09007930 if f.src != target {
7931 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7932 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007933 return
7934 }
7935 }
7936 t.Errorf("%q is not found", file)
7937 }
7938
Jiyong Park9d677202020-02-19 16:29:35 +09007939 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7940 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007941 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007942 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007943 ensureRealfileExists(t, files, "javalib/myjar.jar")
7944 ensureRealfileExists(t, files, "lib64/mylib.so")
7945 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007946 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007947
Jiyong Park9d677202020-02-19 16:29:35 +09007948 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7949 ensureRealfileExists(t, files, "javalib/myjar.jar")
7950 ensureRealfileExists(t, files, "lib64/mylib.so")
7951 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007952 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007953
7954 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007955 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007956 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007957 ensureRealfileExists(t, files, "javalib/myjar.jar")
7958 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007959 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7960 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007961
7962 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7963 ensureRealfileExists(t, files, "javalib/myjar.jar")
7964 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007965 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7966 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007967}
7968
Yo Chiange8128052020-07-23 20:09:18 +08007969func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007970 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007971 apex {
7972 name: "myapex",
7973 key: "myapex.key",
7974 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007975 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007976 }
7977
7978 apex_key {
7979 name: "myapex.key",
7980 public_key: "testkey.avbpubkey",
7981 private_key: "testkey.pem",
7982 }
7983
7984 cc_library_shared {
7985 name: "mylib",
7986 srcs: ["mylib.cpp"],
7987 shared_libs: ["myotherlib"],
7988 system_shared_libs: [],
7989 stl: "none",
7990 apex_available: [
7991 "myapex",
7992 "//apex_available:platform",
7993 ],
7994 }
7995
7996 cc_prebuilt_library_shared {
7997 name: "myotherlib",
7998 srcs: ["prebuilt.so"],
7999 system_shared_libs: [],
8000 stl: "none",
8001 apex_available: [
8002 "myapex",
8003 "//apex_available:platform",
8004 ],
8005 }
8006 `)
8007
Prerana Patilb1896c82022-11-09 18:14:34 +00008008 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008009 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008010 var builder strings.Builder
8011 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8012 androidMk := builder.String()
8013 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008014 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008015 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8016 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8017 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008018 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008019}
8020
Jooyung Han643adc42020-02-27 13:50:06 +09008021func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008022 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008023 apex {
8024 name: "myapex",
8025 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09008026 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008027 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008028 }
8029
8030 apex_key {
8031 name: "myapex.key",
8032 public_key: "testkey.avbpubkey",
8033 private_key: "testkey.pem",
8034 }
8035
8036 cc_library {
8037 name: "mylib",
8038 srcs: ["mylib.cpp"],
8039 shared_libs: ["mylib2"],
8040 system_shared_libs: [],
8041 stl: "none",
8042 apex_available: [ "myapex" ],
8043 }
8044
8045 cc_library {
8046 name: "mylib2",
8047 srcs: ["mylib.cpp"],
8048 system_shared_libs: [],
8049 stl: "none",
8050 apex_available: [ "myapex" ],
8051 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008052
8053 rust_ffi_shared {
8054 name: "libfoo.rust",
8055 crate_name: "foo",
8056 srcs: ["foo.rs"],
8057 shared_libs: ["libfoo.shared_from_rust"],
8058 prefer_rlib: true,
8059 apex_available: ["myapex"],
8060 }
8061
8062 cc_library_shared {
8063 name: "libfoo.shared_from_rust",
8064 srcs: ["mylib.cpp"],
8065 system_shared_libs: [],
8066 stl: "none",
8067 stubs: {
8068 versions: ["10", "11", "12"],
8069 },
8070 }
8071
Jooyung Han643adc42020-02-27 13:50:06 +09008072 `)
8073
8074 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
8075 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09008076 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008077 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
8078 "lib64/mylib.so",
8079 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008080 "lib64/libfoo.rust.so",
8081 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8082 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008083 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008084
8085 // b/220397949
8086 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008087}
8088
Jooyung Han49f67012020-04-17 13:43:10 +09008089func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008090 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008091 apex {
8092 name: "myapex",
8093 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008094 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008095 }
8096 apex_key {
8097 name: "myapex.key",
8098 public_key: "testkey.avbpubkey",
8099 private_key: "testkey.pem",
8100 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008101 `,
8102 android.FixtureModifyConfig(func(config android.Config) {
8103 delete(config.Targets, android.Android)
8104 config.AndroidCommonTarget = android.Target{}
8105 }),
8106 )
Jooyung Han49f67012020-04-17 13:43:10 +09008107
8108 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8109 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8110 }
8111}
8112
Jiyong Parkbd159612020-02-28 15:22:21 +09008113func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008114 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008115 apex {
8116 name: "myapex",
8117 key: "myapex.key",
8118 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008119 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008120 }
8121
8122 apex_key {
8123 name: "myapex.key",
8124 public_key: "testkey.avbpubkey",
8125 private_key: "testkey.pem",
8126 }
8127
8128 android_app {
8129 name: "AppFoo",
8130 srcs: ["foo/bar/MyClass.java"],
8131 sdk_version: "none",
8132 system_modules: "none",
8133 apex_available: [ "myapex" ],
8134 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008135 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008136
Colin Crosscf371cc2020-11-13 11:48:42 -08008137 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008138 content := bundleConfigRule.Args["content"]
8139
8140 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008141 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 +09008142}
8143
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008144func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008145 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008146 apex {
8147 name: "myapex",
8148 key: "myapex.key",
8149 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008150 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008151 }
8152
8153 apex_key {
8154 name: "myapex.key",
8155 public_key: "testkey.avbpubkey",
8156 private_key: "testkey.pem",
8157 }
8158
8159 android_app_set {
8160 name: "AppSet",
8161 set: "AppSet.apks",
8162 }`)
8163 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08008164 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008165 content := bundleConfigRule.Args["content"]
8166 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8167 s := mod.Rule("apexRule").Args["copy_commands"]
8168 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008169 if len(copyCmds) != 4 {
8170 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008171 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008172 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8173 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008174 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8175 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008176
8177 // Ensure that canned_fs_config has an entry for the app set zip file
8178 generateFsRule := mod.Rule("generateFsConfig")
8179 cmd := generateFsRule.RuleParams.Command
8180 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008181}
8182
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008183func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008184 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008185 apex_set {
8186 name: "myapex",
8187 filename: "foo_v2.apex",
8188 sanitized: {
8189 none: { set: "myapex.apks", },
8190 hwaddress: { set: "myapex.hwasan.apks", },
8191 },
Paul Duffin24704672021-04-06 16:09:30 +01008192 }
8193 `
8194 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008195
Paul Duffin24704672021-04-06 16:09:30 +01008196 // Check that the extractor produces the correct output file from the correct input file.
8197 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008198
Paul Duffin24704672021-04-06 16:09:30 +01008199 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8200 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008201
Paul Duffin24704672021-04-06 16:09:30 +01008202 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8203
8204 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008205 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8206 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008207
8208 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008209}
8210
Pranav Guptaeba03b02022-09-27 00:27:08 +00008211func TestApexSetApksModuleAssignment(t *testing.T) {
8212 ctx := testApex(t, `
8213 apex_set {
8214 name: "myapex",
8215 set: ":myapex_apks_file",
8216 }
8217
8218 filegroup {
8219 name: "myapex_apks_file",
8220 srcs: ["myapex.apks"],
8221 }
8222 `)
8223
8224 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8225
8226 // Check that the extractor produces the correct apks file from the input module
8227 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8228 extractedApex := m.Output(extractorOutput)
8229
8230 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8231}
8232
Paul Duffin89f570a2021-06-16 01:42:33 +01008233func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008234 t.Helper()
8235
Paul Duffin55607122021-03-30 23:32:51 +01008236 fs := android.MockFS{
8237 "a.java": nil,
8238 "a.jar": nil,
8239 "apex_manifest.json": nil,
8240 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008241 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008242 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8243 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8244 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008245 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008246 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008247
Paul Duffin55607122021-03-30 23:32:51 +01008248 errorHandler := android.FixtureExpectsNoErrors
8249 if errmsg != "" {
8250 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008251 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008252
Paul Duffin55607122021-03-30 23:32:51 +01008253 result := android.GroupFixturePreparers(
8254 cc.PrepareForTestWithCcDefaultModules,
8255 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008256 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008257 java.PrepareForTestWithJavaSdkLibraryFiles,
8258 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008259 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008260 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008261 android.FixtureModifyMockFS(func(fs android.MockFS) {
8262 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8263 insert := ""
8264 for _, fragment := range fragments {
8265 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8266 }
8267 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8268 platform_bootclasspath {
8269 name: "platform-bootclasspath",
8270 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008271 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008272 %s
8273 ],
8274 }
8275 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008276 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008277 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008278 // Dexpreopt for boot jars requires the ART boot image profile.
8279 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8280 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008281 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008282 ).
8283 ExtendWithErrorHandler(errorHandler).
8284 RunTestWithBp(t, bp)
8285
8286 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008287}
8288
Paul Duffin5556c5f2022-06-09 17:32:21 +00008289func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008290 preparers := android.GroupFixturePreparers(
8291 java.PrepareForTestWithJavaDefaultModules,
8292 PrepareForTestWithApexBuildComponents,
8293 ).
8294 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8295 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8296
8297 bpBase := `
8298 apex_set {
8299 name: "com.android.myapex",
8300 installable: true,
8301 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8302 set: "myapex.apks",
8303 }
8304
8305 apex_set {
8306 name: "com.mycompany.android.myapex",
8307 apex_name: "com.android.myapex",
8308 installable: true,
8309 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8310 set: "company-myapex.apks",
8311 }
8312
8313 prebuilt_bootclasspath_fragment {
8314 name: "my-bootclasspath-fragment",
8315 apex_available: ["com.android.myapex"],
8316 %s
8317 }
8318 `
8319
8320 t.Run("java_import", func(t *testing.T) {
8321 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8322 java_import {
8323 name: "libfoo",
8324 jars: ["libfoo.jar"],
8325 apex_available: ["com.android.myapex"],
8326 }
8327 `)
8328 })
8329
8330 t.Run("java_sdk_library_import", func(t *testing.T) {
8331 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8332 java_sdk_library_import {
8333 name: "libfoo",
8334 public: {
8335 jars: ["libbar.jar"],
8336 },
8337 apex_available: ["com.android.myapex"],
8338 }
8339 `)
8340 })
8341
8342 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8343 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8344 image_name: "art",
8345 contents: ["libfoo"],
8346 `)+`
8347 java_sdk_library_import {
8348 name: "libfoo",
8349 public: {
8350 jars: ["libbar.jar"],
8351 },
8352 apex_available: ["com.android.myapex"],
8353 }
8354 `)
8355 })
8356}
8357
Paul Duffin5556c5f2022-06-09 17:32:21 +00008358func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8359 preparers := android.GroupFixturePreparers(
8360 java.PrepareForTestWithJavaDefaultModules,
8361 PrepareForTestWithApexBuildComponents,
8362 )
8363
8364 bpBase := `
8365 apex_set {
8366 name: "com.android.myapex",
8367 installable: true,
8368 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8369 set: "myapex.apks",
8370 }
8371
8372 apex_set {
8373 name: "com.android.myapex_compressed",
8374 apex_name: "com.android.myapex",
8375 installable: true,
8376 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8377 set: "myapex_compressed.apks",
8378 }
8379
8380 prebuilt_bootclasspath_fragment {
8381 name: "my-bootclasspath-fragment",
8382 apex_available: [
8383 "com.android.myapex",
8384 "com.android.myapex_compressed",
8385 ],
8386 hidden_api: {
8387 annotation_flags: "annotation-flags.csv",
8388 metadata: "metadata.csv",
8389 index: "index.csv",
8390 signature_patterns: "signature_patterns.csv",
8391 },
8392 %s
8393 }
8394 `
8395
8396 t.Run("java_import", func(t *testing.T) {
8397 result := preparers.RunTestWithBp(t,
8398 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8399 java_import {
8400 name: "libfoo",
8401 jars: ["libfoo.jar"],
8402 apex_available: [
8403 "com.android.myapex",
8404 "com.android.myapex_compressed",
8405 ],
8406 }
8407 `)
8408
8409 module := result.Module("libfoo", "android_common_com.android.myapex")
8410 usesLibraryDep := module.(java.UsesLibraryDependency)
8411 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8412 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8413 usesLibraryDep.DexJarBuildPath().Path())
8414 })
8415
8416 t.Run("java_sdk_library_import", func(t *testing.T) {
8417 result := preparers.RunTestWithBp(t,
8418 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8419 java_sdk_library_import {
8420 name: "libfoo",
8421 public: {
8422 jars: ["libbar.jar"],
8423 },
8424 apex_available: [
8425 "com.android.myapex",
8426 "com.android.myapex_compressed",
8427 ],
8428 compile_dex: true,
8429 }
8430 `)
8431
8432 module := result.Module("libfoo", "android_common_com.android.myapex")
8433 usesLibraryDep := module.(java.UsesLibraryDependency)
8434 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8435 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8436 usesLibraryDep.DexJarBuildPath().Path())
8437 })
8438
8439 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8440 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8441 image_name: "art",
8442 contents: ["libfoo"],
8443 `)+`
8444 java_sdk_library_import {
8445 name: "libfoo",
8446 public: {
8447 jars: ["libbar.jar"],
8448 },
8449 apex_available: [
8450 "com.android.myapex",
8451 "com.android.myapex_compressed",
8452 ],
8453 compile_dex: true,
8454 }
8455 `)
8456 })
8457}
8458
Jooyung Han548640b2020-04-27 12:10:30 +09008459func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8460 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8461 apex {
8462 name: "myapex",
8463 key: "myapex.key",
8464 updatable: true,
8465 }
8466
8467 apex_key {
8468 name: "myapex.key",
8469 public_key: "testkey.avbpubkey",
8470 private_key: "testkey.pem",
8471 }
8472 `)
8473}
8474
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008475func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8476 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8477 apex {
8478 name: "myapex",
8479 key: "myapex.key",
8480 }
8481
8482 apex_key {
8483 name: "myapex.key",
8484 public_key: "testkey.avbpubkey",
8485 private_key: "testkey.pem",
8486 }
8487 `)
8488}
8489
Jooyung Handfc864c2023-03-20 18:19:07 +09008490func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8491 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008492 apex {
8493 name: "myapex",
8494 key: "myapex.key",
8495 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008496 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008497 soc_specific: true,
8498 }
8499
8500 apex_key {
8501 name: "myapex.key",
8502 public_key: "testkey.avbpubkey",
8503 private_key: "testkey.pem",
8504 }
8505 `)
8506}
8507
Jooyung Han02873da2023-03-22 17:41:03 +09008508func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8509 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8510 apex {
8511 name: "myapex",
8512 key: "myapex.key",
8513 updatable: false,
8514 min_sdk_version: "29",
8515 use_vndk_as_stable: true,
8516 vendor: true,
8517 }
8518
8519 apex_key {
8520 name: "myapex.key",
8521 public_key: "testkey.avbpubkey",
8522 private_key: "testkey.pem",
8523 }
8524 `)
8525}
8526
Jooyung Handfc864c2023-03-20 18:19:07 +09008527func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8528 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8529 apex {
8530 name: "myapex",
8531 key: "myapex.key",
8532 updatable: false,
8533 use_vndk_as_stable: true,
8534 }
8535
8536 apex_key {
8537 name: "myapex.key",
8538 public_key: "testkey.avbpubkey",
8539 private_key: "testkey.pem",
8540 }
8541 `)
8542}
8543
satayevb98371c2021-06-15 16:49:50 +01008544func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8545 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8546 apex {
8547 name: "myapex",
8548 key: "myapex.key",
8549 systemserverclasspath_fragments: [
8550 "mysystemserverclasspathfragment",
8551 ],
8552 min_sdk_version: "29",
8553 updatable: true,
8554 }
8555
8556 apex_key {
8557 name: "myapex.key",
8558 public_key: "testkey.avbpubkey",
8559 private_key: "testkey.pem",
8560 }
8561
8562 java_library {
8563 name: "foo",
8564 srcs: ["b.java"],
8565 min_sdk_version: "29",
8566 installable: true,
8567 apex_available: [
8568 "myapex",
8569 ],
8570 }
8571
8572 systemserverclasspath_fragment {
8573 name: "mysystemserverclasspathfragment",
8574 generate_classpaths_proto: false,
8575 contents: [
8576 "foo",
8577 ],
8578 apex_available: [
8579 "myapex",
8580 ],
8581 }
satayevabcd5972021-08-06 17:49:46 +01008582 `,
8583 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8584 )
satayevb98371c2021-06-15 16:49:50 +01008585}
8586
Paul Duffin064b70c2020-11-02 17:32:38 +00008587func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008588 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008589 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008590 fragment := java.ApexVariantReference{
8591 Apex: proptools.StringPtr("myapex"),
8592 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8593 }
8594
Paul Duffin064b70c2020-11-02 17:32:38 +00008595 testDexpreoptWithApexes(t, `
8596 prebuilt_apex {
8597 name: "myapex" ,
8598 arch: {
8599 arm64: {
8600 src: "myapex-arm64.apex",
8601 },
8602 arm: {
8603 src: "myapex-arm.apex",
8604 },
8605 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008606 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8607 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008608
Paul Duffin89f570a2021-06-16 01:42:33 +01008609 prebuilt_bootclasspath_fragment {
8610 name: "my-bootclasspath-fragment",
8611 contents: ["libfoo"],
8612 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008613 hidden_api: {
8614 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8615 metadata: "my-bootclasspath-fragment/metadata.csv",
8616 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008617 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8618 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8619 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008620 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008621 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008622
Paul Duffin89f570a2021-06-16 01:42:33 +01008623 java_import {
8624 name: "libfoo",
8625 jars: ["libfoo.jar"],
8626 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008627 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008628 }
8629 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008630 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008631}
8632
Spandan Dasf14e2542021-11-12 00:01:37 +00008633func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008634 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008635 bp += `
8636 apex_key {
8637 name: "myapex.key",
8638 public_key: "testkey.avbpubkey",
8639 private_key: "testkey.pem",
8640 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008641 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008642 "lib1/src/A.java": nil,
8643 "lib2/src/B.java": nil,
8644 "system/sepolicy/apex/myapex-file_contexts": nil,
8645 }
8646
Paul Duffin45338f02021-03-30 23:07:52 +01008647 errorHandler := android.FixtureExpectsNoErrors
8648 if errmsg != "" {
8649 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008650 }
Colin Crossae8600b2020-10-29 17:09:13 -07008651
Paul Duffin45338f02021-03-30 23:07:52 +01008652 android.GroupFixturePreparers(
8653 android.PrepareForTestWithAndroidBuildComponents,
8654 java.PrepareForTestWithJavaBuildComponents,
8655 PrepareForTestWithApexBuildComponents,
8656 android.PrepareForTestWithNeverallowRules(rules),
8657 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008658 apexBootJars := make([]string, 0, len(bootJars))
8659 for _, apexBootJar := range bootJars {
8660 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008661 }
satayevd604b212021-07-21 14:23:52 +01008662 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008663 }),
8664 fs.AddToFixture(),
8665 ).
8666 ExtendWithErrorHandler(errorHandler).
8667 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008668}
8669
8670func TestApexPermittedPackagesRules(t *testing.T) {
8671 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008672 name string
8673 expectedError string
8674 bp string
8675 bootJars []string
8676 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008677 }{
8678
8679 {
8680 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8681 expectedError: "",
8682 bp: `
8683 java_library {
8684 name: "bcp_lib1",
8685 srcs: ["lib1/src/*.java"],
8686 permitted_packages: ["foo.bar"],
8687 apex_available: ["myapex"],
8688 sdk_version: "none",
8689 system_modules: "none",
8690 }
8691 java_library {
8692 name: "nonbcp_lib2",
8693 srcs: ["lib2/src/*.java"],
8694 apex_available: ["myapex"],
8695 permitted_packages: ["a.b"],
8696 sdk_version: "none",
8697 system_modules: "none",
8698 }
8699 apex {
8700 name: "myapex",
8701 key: "myapex.key",
8702 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008703 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008704 }`,
8705 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008706 bcpPermittedPackages: map[string][]string{
8707 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008708 "foo.bar",
8709 },
8710 },
8711 },
8712 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008713 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008714 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 +01008715 bp: `
8716 java_library {
8717 name: "bcp_lib1",
8718 srcs: ["lib1/src/*.java"],
8719 apex_available: ["myapex"],
8720 permitted_packages: ["foo.bar"],
8721 sdk_version: "none",
8722 system_modules: "none",
8723 }
8724 java_library {
8725 name: "bcp_lib2",
8726 srcs: ["lib2/src/*.java"],
8727 apex_available: ["myapex"],
8728 permitted_packages: ["foo.bar", "bar.baz"],
8729 sdk_version: "none",
8730 system_modules: "none",
8731 }
8732 apex {
8733 name: "myapex",
8734 key: "myapex.key",
8735 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008736 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008737 }
8738 `,
8739 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008740 bcpPermittedPackages: map[string][]string{
8741 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008742 "foo.bar",
8743 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008744 "bcp_lib2": []string{
8745 "foo.bar",
8746 },
8747 },
8748 },
8749 {
8750 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8751 expectedError: "",
8752 bp: `
8753 java_library {
8754 name: "bcp_lib_restricted",
8755 srcs: ["lib1/src/*.java"],
8756 apex_available: ["myapex"],
8757 permitted_packages: ["foo.bar"],
8758 sdk_version: "none",
8759 min_sdk_version: "29",
8760 system_modules: "none",
8761 }
8762 java_library {
8763 name: "bcp_lib_unrestricted",
8764 srcs: ["lib2/src/*.java"],
8765 apex_available: ["myapex"],
8766 permitted_packages: ["foo.bar", "bar.baz"],
8767 sdk_version: "none",
8768 min_sdk_version: "29",
8769 system_modules: "none",
8770 }
8771 apex {
8772 name: "myapex",
8773 key: "myapex.key",
8774 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8775 updatable: true,
8776 min_sdk_version: "29",
8777 }
8778 `,
8779 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8780 bcpPermittedPackages: map[string][]string{
8781 "bcp_lib1_non_updateable": []string{
8782 "foo.bar",
8783 },
8784 // 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 +01008785 },
8786 },
8787 }
8788 for _, tc := range testcases {
8789 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008790 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8791 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008792 })
8793 }
8794}
8795
Jiyong Park62304bb2020-04-13 16:19:48 +09008796func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008797 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008798 apex {
8799 name: "myapex",
8800 key: "myapex.key",
8801 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008802 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008803 }
8804
8805 apex_key {
8806 name: "myapex.key",
8807 public_key: "testkey.avbpubkey",
8808 private_key: "testkey.pem",
8809 }
8810
8811 cc_library {
8812 name: "mylib",
8813 srcs: ["mylib.cpp"],
8814 system_shared_libs: [],
8815 stl: "none",
8816 stubs: {
8817 versions: ["1"],
8818 },
8819 apex_available: ["myapex"],
8820 }
8821
8822 cc_library {
8823 name: "myprivlib",
8824 srcs: ["mylib.cpp"],
8825 system_shared_libs: [],
8826 stl: "none",
8827 apex_available: ["myapex"],
8828 }
8829
8830
8831 cc_test {
8832 name: "mytest",
8833 gtest: false,
8834 srcs: ["mylib.cpp"],
8835 system_shared_libs: [],
8836 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008837 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008838 test_for: ["myapex"]
8839 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008840
8841 cc_library {
8842 name: "mytestlib",
8843 srcs: ["mylib.cpp"],
8844 system_shared_libs: [],
8845 shared_libs: ["mylib", "myprivlib"],
8846 stl: "none",
8847 test_for: ["myapex"],
8848 }
8849
8850 cc_benchmark {
8851 name: "mybench",
8852 srcs: ["mylib.cpp"],
8853 system_shared_libs: [],
8854 shared_libs: ["mylib", "myprivlib"],
8855 stl: "none",
8856 test_for: ["myapex"],
8857 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008858 `)
8859
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008860 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008861 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008862 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8863 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8864 }
8865
8866 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008867 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008868 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8869 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8870 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8871}
Jiyong Park46a512f2020-12-04 18:02:13 +09008872
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008873func TestIndirectTestFor(t *testing.T) {
8874 ctx := testApex(t, `
8875 apex {
8876 name: "myapex",
8877 key: "myapex.key",
8878 native_shared_libs: ["mylib", "myprivlib"],
8879 updatable: false,
8880 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008881
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008882 apex_key {
8883 name: "myapex.key",
8884 public_key: "testkey.avbpubkey",
8885 private_key: "testkey.pem",
8886 }
8887
8888 cc_library {
8889 name: "mylib",
8890 srcs: ["mylib.cpp"],
8891 system_shared_libs: [],
8892 stl: "none",
8893 stubs: {
8894 versions: ["1"],
8895 },
8896 apex_available: ["myapex"],
8897 }
8898
8899 cc_library {
8900 name: "myprivlib",
8901 srcs: ["mylib.cpp"],
8902 system_shared_libs: [],
8903 stl: "none",
8904 shared_libs: ["mylib"],
8905 apex_available: ["myapex"],
8906 }
8907
8908 cc_library {
8909 name: "mytestlib",
8910 srcs: ["mylib.cpp"],
8911 system_shared_libs: [],
8912 shared_libs: ["myprivlib"],
8913 stl: "none",
8914 test_for: ["myapex"],
8915 }
8916 `)
8917
8918 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008919 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008920 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8921 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8922 }
8923
8924 // The platform variant of mytestlib links to the platform variant of the
8925 // internal myprivlib.
8926 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8927
8928 // The platform variant of myprivlib links to the platform variant of mylib
8929 // and bypasses its stubs.
8930 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 +09008931}
8932
Martin Stjernholmec009002021-03-27 15:18:31 +00008933func TestTestForForLibInOtherApex(t *testing.T) {
8934 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8935 _ = testApex(t, `
8936 apex {
8937 name: "com.android.art",
8938 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008939 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008940 updatable: false,
8941 }
8942
8943 apex {
8944 name: "com.android.art.debug",
8945 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008946 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008947 updatable: false,
8948 }
8949
8950 apex_key {
8951 name: "myapex.key",
8952 public_key: "testkey.avbpubkey",
8953 private_key: "testkey.pem",
8954 }
8955
8956 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008957 name: "libnativebridge",
8958 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008959 system_shared_libs: [],
8960 stl: "none",
8961 stubs: {
8962 versions: ["1"],
8963 },
8964 apex_available: ["com.android.art", "com.android.art.debug"],
8965 }
8966
8967 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008968 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008969 srcs: ["mylib.cpp"],
8970 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008971 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008972 stl: "none",
8973 apex_available: ["com.android.art.debug"],
8974 test_for: ["com.android.art"],
8975 }
8976 `,
8977 android.MockFS{
8978 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8979 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8980 }.AddToFixture())
8981}
8982
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008983// TODO(jungjw): Move this to proptools
8984func intPtr(i int) *int {
8985 return &i
8986}
8987
8988func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008989 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008990 apex_set {
8991 name: "myapex",
8992 set: "myapex.apks",
8993 filename: "foo_v2.apex",
8994 overrides: ["foo"],
8995 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008996 `,
8997 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8998 variables.Platform_sdk_version = intPtr(30)
8999 }),
9000 android.FixtureModifyConfig(func(config android.Config) {
9001 config.Targets[android.Android] = []android.Target{
9002 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9003 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9004 }
9005 }),
9006 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009007
Paul Duffin24704672021-04-06 16:09:30 +01009008 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009009
9010 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009011 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009012 actual := extractedApex.Args["abis"]
9013 expected := "ARMEABI_V7A,ARM64_V8A"
9014 if actual != expected {
9015 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9016 }
9017 actual = extractedApex.Args["sdk-version"]
9018 expected = "30"
9019 if actual != expected {
9020 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9021 }
9022
Paul Duffin6717d882021-06-15 19:09:41 +01009023 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009024 a := m.Module().(*ApexSet)
9025 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009026 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009027 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9028 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9029 }
9030}
9031
Anton Hansson805e0a52022-11-25 14:06:46 +00009032func TestApexSet_NativeBridge(t *testing.T) {
9033 ctx := testApex(t, `
9034 apex_set {
9035 name: "myapex",
9036 set: "myapex.apks",
9037 filename: "foo_v2.apex",
9038 overrides: ["foo"],
9039 }
9040 `,
9041 android.FixtureModifyConfig(func(config android.Config) {
9042 config.Targets[android.Android] = []android.Target{
9043 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9044 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9045 }
9046 }),
9047 )
9048
9049 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9050
9051 // Check extract_apks tool parameters. No native bridge arch expected
9052 extractedApex := m.Output("extracted/myapex.apks")
9053 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9054}
9055
Jiyong Park7d95a512020-05-10 15:16:24 +09009056func TestNoStaticLinkingToStubsLib(t *testing.T) {
9057 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9058 apex {
9059 name: "myapex",
9060 key: "myapex.key",
9061 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009062 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009063 }
9064
9065 apex_key {
9066 name: "myapex.key",
9067 public_key: "testkey.avbpubkey",
9068 private_key: "testkey.pem",
9069 }
9070
9071 cc_library {
9072 name: "mylib",
9073 srcs: ["mylib.cpp"],
9074 static_libs: ["otherlib"],
9075 system_shared_libs: [],
9076 stl: "none",
9077 apex_available: [ "myapex" ],
9078 }
9079
9080 cc_library {
9081 name: "otherlib",
9082 srcs: ["mylib.cpp"],
9083 system_shared_libs: [],
9084 stl: "none",
9085 stubs: {
9086 versions: ["1", "2", "3"],
9087 },
9088 apex_available: [ "myapex" ],
9089 }
9090 `)
9091}
9092
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009093func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009094 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009095 apex {
9096 name: "myapex",
9097 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009098 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009099 custom_sign_tool: "sign_myapex",
9100 }
9101
9102 apex_key {
9103 name: "myapex.key",
9104 public_key: "testkey.avbpubkey",
9105 private_key: "testkey.pem",
9106 }
9107 `)
9108
9109 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9110 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009111 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 +09009112}
9113
9114func TestApexKeysTxtOverrides(t *testing.T) {
9115 ctx := testApex(t, `
9116 apex {
9117 name: "myapex",
9118 key: "myapex.key",
9119 updatable: false,
9120 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009121 }
9122
9123 apex_key {
9124 name: "myapex.key",
9125 public_key: "testkey.avbpubkey",
9126 private_key: "testkey.pem",
9127 }
9128
9129 prebuilt_apex {
9130 name: "myapex",
9131 prefer: true,
9132 arch: {
9133 arm64: {
9134 src: "myapex-arm64.apex",
9135 },
9136 arm: {
9137 src: "myapex-arm.apex",
9138 },
9139 },
9140 }
9141
9142 apex_set {
9143 name: "myapex_set",
9144 set: "myapex.apks",
9145 filename: "myapex_set.apex",
9146 overrides: ["myapex"],
9147 }
9148 `)
9149
9150 apexKeysText := ctx.SingletonForTests("apex_keys_text")
9151 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
9152 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 +09009153 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 +09009154}
9155
Jooyung Han938b5932020-06-20 12:47:47 +09009156func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009157 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009158 apex {
9159 name: "myapex",
9160 key: "myapex.key",
9161 apps: ["app"],
9162 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009163 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009164 }
9165
9166 apex_key {
9167 name: "myapex.key",
9168 public_key: "testkey.avbpubkey",
9169 private_key: "testkey.pem",
9170 }
9171
9172 android_app {
9173 name: "app",
9174 srcs: ["foo/bar/MyClass.java"],
9175 package_name: "foo",
9176 sdk_version: "none",
9177 system_modules: "none",
9178 apex_available: [ "myapex" ],
9179 }
9180 `, withFiles(map[string][]byte{
9181 "sub/Android.bp": []byte(`
9182 override_apex {
9183 name: "override_myapex",
9184 base: "myapex",
9185 apps: ["override_app"],
9186 allowed_files: ":allowed",
9187 }
9188 // Overridable "path" property should be referenced indirectly
9189 filegroup {
9190 name: "allowed",
9191 srcs: ["allowed.txt"],
9192 }
9193 override_android_app {
9194 name: "override_app",
9195 base: "app",
9196 package_name: "bar",
9197 }
9198 `),
9199 }))
9200
9201 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
9202 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9203 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9204 }
9205
9206 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
9207 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9208 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9209 }
9210}
9211
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009212func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009213 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009214 apex {
9215 name: "myapex",
9216 key: "myapex.key",
9217 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009218 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009219 }
9220
9221 apex_key {
9222 name: "myapex.key",
9223 public_key: "testkey.avbpubkey",
9224 private_key: "testkey.pem",
9225 }
9226
9227 cc_library {
9228 name: "mylib",
9229 srcs: ["mylib.cpp"],
9230 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009231 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009232 },
9233 apex_available: ["myapex"],
9234 }
9235
9236 cc_prebuilt_library_shared {
9237 name: "mylib",
9238 prefer: false,
9239 srcs: ["prebuilt.so"],
9240 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009241 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009242 },
9243 apex_available: ["myapex"],
9244 }
9245 `)
9246}
9247
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009248func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009249 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009250 apex {
9251 name: "myapex",
9252 key: "myapex.key",
9253 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009254 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009255 }
9256 apex_key {
9257 name: "myapex.key",
9258 public_key: "testkey.avbpubkey",
9259 private_key: "testkey.pem",
9260 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009261 `,
9262 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9263 variables.CompressedApex = proptools.BoolPtr(true)
9264 }),
9265 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009266
9267 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
9268 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9269
9270 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
9271 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9272
9273 // Make sure output of bundle is .capex
9274 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9275 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9276
9277 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009278 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009279 var builder strings.Builder
9280 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9281 androidMk := builder.String()
9282 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9283}
9284
Martin Stjernholm2856c662020-12-02 15:03:42 +00009285func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009286 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009287 apex {
9288 name: "myapex",
9289 key: "myapex.key",
9290 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009291 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009292 }
9293
9294 apex_key {
9295 name: "myapex.key",
9296 public_key: "testkey.avbpubkey",
9297 private_key: "testkey.pem",
9298 }
9299
9300 cc_library {
9301 name: "mylib",
9302 srcs: ["mylib.cpp"],
9303 apex_available: ["myapex"],
9304 shared_libs: ["otherlib"],
9305 system_shared_libs: [],
9306 }
9307
9308 cc_library {
9309 name: "otherlib",
9310 srcs: ["mylib.cpp"],
9311 stubs: {
9312 versions: ["current"],
9313 },
9314 }
9315
9316 cc_prebuilt_library_shared {
9317 name: "otherlib",
9318 prefer: true,
9319 srcs: ["prebuilt.so"],
9320 stubs: {
9321 versions: ["current"],
9322 },
9323 }
9324 `)
9325
9326 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009327 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009328 var builder strings.Builder
9329 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9330 androidMk := builder.String()
9331
9332 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9333 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009334 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009335}
9336
Jiyong Parke3867542020-12-03 17:28:25 +09009337func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009338 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009339 apex {
9340 name: "myapex",
9341 key: "myapex.key",
9342 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009343 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009344 }
9345
9346 apex_key {
9347 name: "myapex.key",
9348 public_key: "testkey.avbpubkey",
9349 private_key: "testkey.pem",
9350 }
9351
9352 cc_library {
9353 name: "mylib",
9354 srcs: ["mylib.cpp"],
9355 system_shared_libs: [],
9356 stl: "none",
9357 apex_available: ["myapex"],
9358 shared_libs: ["mylib2"],
9359 target: {
9360 apex: {
9361 exclude_shared_libs: ["mylib2"],
9362 },
9363 },
9364 }
9365
9366 cc_library {
9367 name: "mylib2",
9368 srcs: ["mylib.cpp"],
9369 system_shared_libs: [],
9370 stl: "none",
9371 }
9372 `)
9373
9374 // Check if mylib is linked to mylib2 for the non-apex target
9375 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9376 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9377
9378 // Make sure that the link doesn't occur for the apex target
9379 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9380 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9381
9382 // It shouldn't appear in the copy cmd as well.
9383 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9384 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9385}
9386
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009387func TestPrebuiltStubLibDep(t *testing.T) {
9388 bpBase := `
9389 apex {
9390 name: "myapex",
9391 key: "myapex.key",
9392 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009393 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009394 }
9395 apex_key {
9396 name: "myapex.key",
9397 public_key: "testkey.avbpubkey",
9398 private_key: "testkey.pem",
9399 }
9400 cc_library {
9401 name: "mylib",
9402 srcs: ["mylib.cpp"],
9403 apex_available: ["myapex"],
9404 shared_libs: ["stublib"],
9405 system_shared_libs: [],
9406 }
9407 apex {
9408 name: "otherapex",
9409 enabled: %s,
9410 key: "myapex.key",
9411 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009412 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009413 }
9414 `
9415
9416 stublibSourceBp := `
9417 cc_library {
9418 name: "stublib",
9419 srcs: ["mylib.cpp"],
9420 apex_available: ["otherapex"],
9421 system_shared_libs: [],
9422 stl: "none",
9423 stubs: {
9424 versions: ["1"],
9425 },
9426 }
9427 `
9428
9429 stublibPrebuiltBp := `
9430 cc_prebuilt_library_shared {
9431 name: "stublib",
9432 srcs: ["prebuilt.so"],
9433 apex_available: ["otherapex"],
9434 stubs: {
9435 versions: ["1"],
9436 },
9437 %s
9438 }
9439 `
9440
9441 tests := []struct {
9442 name string
9443 stublibBp string
9444 usePrebuilt bool
9445 modNames []string // Modules to collect AndroidMkEntries for
9446 otherApexEnabled []string
9447 }{
9448 {
9449 name: "only_source",
9450 stublibBp: stublibSourceBp,
9451 usePrebuilt: false,
9452 modNames: []string{"stublib"},
9453 otherApexEnabled: []string{"true", "false"},
9454 },
9455 {
9456 name: "source_preferred",
9457 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9458 usePrebuilt: false,
9459 modNames: []string{"stublib", "prebuilt_stublib"},
9460 otherApexEnabled: []string{"true", "false"},
9461 },
9462 {
9463 name: "prebuilt_preferred",
9464 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9465 usePrebuilt: true,
9466 modNames: []string{"stublib", "prebuilt_stublib"},
9467 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9468 },
9469 {
9470 name: "only_prebuilt",
9471 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9472 usePrebuilt: true,
9473 modNames: []string{"stublib"},
9474 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9475 },
9476 }
9477
9478 for _, test := range tests {
9479 t.Run(test.name, func(t *testing.T) {
9480 for _, otherApexEnabled := range test.otherApexEnabled {
9481 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009482 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009483
9484 type modAndMkEntries struct {
9485 mod *cc.Module
9486 mkEntries android.AndroidMkEntries
9487 }
9488 entries := []*modAndMkEntries{}
9489
9490 // Gather shared lib modules that are installable
9491 for _, modName := range test.modNames {
9492 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9493 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9494 continue
9495 }
9496 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009497 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009498 continue
9499 }
Colin Crossaa255532020-07-03 13:18:24 -07009500 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009501 if ent.Disabled {
9502 continue
9503 }
9504 entries = append(entries, &modAndMkEntries{
9505 mod: mod,
9506 mkEntries: ent,
9507 })
9508 }
9509 }
9510 }
9511
9512 var entry *modAndMkEntries = nil
9513 for _, ent := range entries {
9514 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9515 if entry != nil {
9516 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9517 } else {
9518 entry = ent
9519 }
9520 }
9521 }
9522
9523 if entry == nil {
9524 t.Errorf("AndroidMk entry for \"stublib\" missing")
9525 } else {
9526 isPrebuilt := entry.mod.Prebuilt() != nil
9527 if isPrebuilt != test.usePrebuilt {
9528 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9529 }
9530 if !entry.mod.IsStubs() {
9531 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9532 }
9533 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9534 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9535 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009536 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009537 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009538 if !android.InList(expected, cflags) {
9539 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9540 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009541 }
9542 })
9543 }
9544 })
9545 }
9546}
9547
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009548func TestHostApexInHostOnlyBuild(t *testing.T) {
9549 testApex(t, `
9550 apex {
9551 name: "myapex",
9552 host_supported: true,
9553 key: "myapex.key",
9554 updatable: false,
9555 payload_type: "zip",
9556 }
9557 apex_key {
9558 name: "myapex.key",
9559 public_key: "testkey.avbpubkey",
9560 private_key: "testkey.pem",
9561 }
9562 `,
9563 android.FixtureModifyConfig(func(config android.Config) {
9564 // We may not have device targets in all builds, e.g. in
9565 // prebuilts/build-tools/build-prebuilts.sh
9566 config.Targets[android.Android] = []android.Target{}
9567 }))
9568}
9569
Colin Crossc33e5212021-05-25 18:16:02 -07009570func TestApexJavaCoverage(t *testing.T) {
9571 bp := `
9572 apex {
9573 name: "myapex",
9574 key: "myapex.key",
9575 java_libs: ["mylib"],
9576 bootclasspath_fragments: ["mybootclasspathfragment"],
9577 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9578 updatable: false,
9579 }
9580
9581 apex_key {
9582 name: "myapex.key",
9583 public_key: "testkey.avbpubkey",
9584 private_key: "testkey.pem",
9585 }
9586
9587 java_library {
9588 name: "mylib",
9589 srcs: ["mylib.java"],
9590 apex_available: ["myapex"],
9591 compile_dex: true,
9592 }
9593
9594 bootclasspath_fragment {
9595 name: "mybootclasspathfragment",
9596 contents: ["mybootclasspathlib"],
9597 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009598 hidden_api: {
9599 split_packages: ["*"],
9600 },
Colin Crossc33e5212021-05-25 18:16:02 -07009601 }
9602
9603 java_library {
9604 name: "mybootclasspathlib",
9605 srcs: ["mybootclasspathlib.java"],
9606 apex_available: ["myapex"],
9607 compile_dex: true,
9608 }
9609
9610 systemserverclasspath_fragment {
9611 name: "mysystemserverclasspathfragment",
9612 contents: ["mysystemserverclasspathlib"],
9613 apex_available: ["myapex"],
9614 }
9615
9616 java_library {
9617 name: "mysystemserverclasspathlib",
9618 srcs: ["mysystemserverclasspathlib.java"],
9619 apex_available: ["myapex"],
9620 compile_dex: true,
9621 }
9622 `
9623
9624 result := android.GroupFixturePreparers(
9625 PrepareForTestWithApexBuildComponents,
9626 prepareForTestWithMyapex,
9627 java.PrepareForTestWithJavaDefaultModules,
9628 android.PrepareForTestWithAndroidBuildComponents,
9629 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009630 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9631 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009632 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009633 ).RunTest(t)
9634
9635 // Make sure jacoco ran on both mylib and mybootclasspathlib
9636 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9637 t.Errorf("Failed to find jacoco rule for mylib")
9638 }
9639 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9640 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9641 }
9642 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9643 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9644 }
9645}
9646
Jiyong Park192600a2021-08-03 07:52:17 +00009647func TestProhibitStaticExecutable(t *testing.T) {
9648 testApexError(t, `executable mybin is static`, `
9649 apex {
9650 name: "myapex",
9651 key: "myapex.key",
9652 binaries: ["mybin"],
9653 min_sdk_version: "29",
9654 }
9655
9656 apex_key {
9657 name: "myapex.key",
9658 public_key: "testkey.avbpubkey",
9659 private_key: "testkey.pem",
9660 }
9661
9662 cc_binary {
9663 name: "mybin",
9664 srcs: ["mylib.cpp"],
9665 relative_install_path: "foo/bar",
9666 static_executable: true,
9667 system_shared_libs: [],
9668 stl: "none",
9669 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009670 min_sdk_version: "29",
9671 }
9672 `)
9673
9674 testApexError(t, `executable mybin.rust is static`, `
9675 apex {
9676 name: "myapex",
9677 key: "myapex.key",
9678 binaries: ["mybin.rust"],
9679 min_sdk_version: "29",
9680 }
9681
9682 apex_key {
9683 name: "myapex.key",
9684 public_key: "testkey.avbpubkey",
9685 private_key: "testkey.pem",
9686 }
9687
9688 rust_binary {
9689 name: "mybin.rust",
9690 srcs: ["foo.rs"],
9691 static_executable: true,
9692 apex_available: ["myapex"],
9693 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009694 }
9695 `)
9696}
9697
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009698func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9699 ctx := testApex(t, `
9700 apex {
9701 name: "myapex",
9702 key: "myapex.key",
9703 updatable: false,
9704 java_libs: ["foo"],
9705 }
9706
9707 apex_key {
9708 name: "myapex.key",
9709 public_key: "testkey.avbpubkey",
9710 private_key: "testkey.pem",
9711 }
9712
9713 java_library {
9714 name: "foo",
9715 srcs: ["foo.java"],
9716 apex_available: ["myapex"],
9717 installable: true,
9718 }
9719 `,
9720 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9721 )
9722
9723 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9724 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9725 var builder strings.Builder
9726 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9727 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009728 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 +00009729}
9730
9731func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9732 ctx := testApex(t, `
9733 prebuilt_apex {
9734 name: "myapex",
9735 arch: {
9736 arm64: {
9737 src: "myapex-arm64.apex",
9738 },
9739 arm: {
9740 src: "myapex-arm.apex",
9741 },
9742 },
9743 exported_java_libs: ["foo"],
9744 }
9745
9746 java_import {
9747 name: "foo",
9748 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009749 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009750 }
9751 `,
9752 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9753 )
9754
9755 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9756 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9757 mainModuleEntries := entriesList[0]
9758 android.AssertArrayString(t,
9759 "LOCAL_REQUIRED_MODULES",
9760 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9761 []string{
9762 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9763 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9764 })
9765}
9766
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009767func TestAndroidMk_RequiredModules(t *testing.T) {
9768 ctx := testApex(t, `
9769 apex {
9770 name: "myapex",
9771 key: "myapex.key",
9772 updatable: false,
9773 java_libs: ["foo"],
9774 required: ["otherapex"],
9775 }
9776
9777 apex {
9778 name: "otherapex",
9779 key: "myapex.key",
9780 updatable: false,
9781 java_libs: ["foo"],
9782 required: ["otherapex"],
9783 }
9784
9785 apex_key {
9786 name: "myapex.key",
9787 public_key: "testkey.avbpubkey",
9788 private_key: "testkey.pem",
9789 }
9790
9791 java_library {
9792 name: "foo",
9793 srcs: ["foo.java"],
9794 apex_available: ["myapex", "otherapex"],
9795 installable: true,
9796 }
9797 `)
9798
9799 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9800 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9801 var builder strings.Builder
9802 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9803 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009804 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009805}
9806
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009807func TestAndroidMk_RequiredDeps(t *testing.T) {
9808 ctx := testApex(t, `
9809 apex {
9810 name: "myapex",
9811 key: "myapex.key",
9812 updatable: false,
9813 }
9814
9815 apex_key {
9816 name: "myapex.key",
9817 public_key: "testkey.avbpubkey",
9818 private_key: "testkey.pem",
9819 }
9820 `)
9821
9822 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009823 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009824 data := android.AndroidMkDataForTest(t, ctx, bundle)
9825 var builder strings.Builder
9826 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9827 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009828 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009829}
9830
Jooyung Hana6d36672022-02-24 13:58:07 +09009831func TestApexOutputFileProducer(t *testing.T) {
9832 for _, tc := range []struct {
9833 name string
9834 ref string
9835 expected_data []string
9836 }{
9837 {
9838 name: "test_using_output",
9839 ref: ":myapex",
9840 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9841 },
9842 {
9843 name: "test_using_apex",
9844 ref: ":myapex{.apex}",
9845 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9846 },
9847 } {
9848 t.Run(tc.name, func(t *testing.T) {
9849 ctx := testApex(t, `
9850 apex {
9851 name: "myapex",
9852 key: "myapex.key",
9853 compressible: true,
9854 updatable: false,
9855 }
9856
9857 apex_key {
9858 name: "myapex.key",
9859 public_key: "testkey.avbpubkey",
9860 private_key: "testkey.pem",
9861 }
9862
9863 java_test {
9864 name: "`+tc.name+`",
9865 srcs: ["a.java"],
9866 data: ["`+tc.ref+`"],
9867 }
9868 `,
9869 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9870 variables.CompressedApex = proptools.BoolPtr(true)
9871 }))
9872 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9873 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9874 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9875 })
9876 }
9877}
9878
satayev758968a2021-12-06 11:42:40 +00009879func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9880 preparer := android.GroupFixturePreparers(
9881 PrepareForTestWithApexBuildComponents,
9882 prepareForTestWithMyapex,
9883 java.PrepareForTestWithJavaSdkLibraryFiles,
9884 java.PrepareForTestWithJavaDefaultModules,
9885 android.PrepareForTestWithAndroidBuildComponents,
9886 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9887 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9888 )
9889
9890 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9891 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9892 preparer.RunTestWithBp(t, `
9893 apex {
9894 name: "myapex",
9895 key: "myapex.key",
9896 bootclasspath_fragments: ["mybootclasspathfragment"],
9897 min_sdk_version: "30",
9898 updatable: false,
9899 }
9900
9901 apex_key {
9902 name: "myapex.key",
9903 public_key: "testkey.avbpubkey",
9904 private_key: "testkey.pem",
9905 }
9906
9907 bootclasspath_fragment {
9908 name: "mybootclasspathfragment",
9909 contents: ["mybootclasspathlib"],
9910 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009911 hidden_api: {
9912 split_packages: ["*"],
9913 },
satayev758968a2021-12-06 11:42:40 +00009914 }
9915
9916 java_sdk_library {
9917 name: "mybootclasspathlib",
9918 srcs: ["mybootclasspathlib.java"],
9919 apex_available: ["myapex"],
9920 compile_dex: true,
9921 unsafe_ignore_missing_latest_api: true,
9922 min_sdk_version: "31",
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 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9944 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9945 preparer.RunTestWithBp(t, `
9946 apex {
9947 name: "myapex",
9948 key: "myapex.key",
9949 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
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 systemserverclasspath_fragment {
9961 name: "mysystemserverclasspathfragment",
9962 contents: ["mysystemserverclasspathlib"],
9963 apex_available: ["myapex"],
9964 }
9965
9966 java_sdk_library {
9967 name: "mysystemserverclasspathlib",
9968 srcs: ["mysystemserverclasspathlib.java"],
9969 apex_available: ["myapex"],
9970 compile_dex: true,
9971 min_sdk_version: "32",
9972 unsafe_ignore_missing_latest_api: true,
9973 static_libs: ["util"],
9974 }
9975
9976 java_library {
9977 name: "util",
9978 srcs: ["a.java"],
9979 apex_available: ["myapex"],
9980 min_sdk_version: "31",
9981 static_libs: ["another_util"],
9982 }
9983
9984 java_library {
9985 name: "another_util",
9986 srcs: ["a.java"],
9987 min_sdk_version: "31",
9988 apex_available: ["myapex"],
9989 }
9990 `)
9991 })
9992
9993 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9994 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9995 RunTestWithBp(t, `
9996 apex {
9997 name: "myapex",
9998 key: "myapex.key",
9999 bootclasspath_fragments: ["mybootclasspathfragment"],
10000 min_sdk_version: "30",
10001 updatable: false,
10002 }
10003
10004 apex_key {
10005 name: "myapex.key",
10006 public_key: "testkey.avbpubkey",
10007 private_key: "testkey.pem",
10008 }
10009
10010 bootclasspath_fragment {
10011 name: "mybootclasspathfragment",
10012 contents: ["mybootclasspathlib"],
10013 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010014 hidden_api: {
10015 split_packages: ["*"],
10016 },
satayev758968a2021-12-06 11:42:40 +000010017 }
10018
10019 java_sdk_library {
10020 name: "mybootclasspathlib",
10021 srcs: ["mybootclasspathlib.java"],
10022 apex_available: ["myapex"],
10023 compile_dex: true,
10024 unsafe_ignore_missing_latest_api: true,
10025 }
10026 `)
10027 })
10028
10029 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10030 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10031 RunTestWithBp(t, `
10032 apex {
10033 name: "myapex",
10034 key: "myapex.key",
10035 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10036 min_sdk_version: "30",
10037 updatable: false,
10038 }
10039
10040 apex_key {
10041 name: "myapex.key",
10042 public_key: "testkey.avbpubkey",
10043 private_key: "testkey.pem",
10044 }
10045
10046 systemserverclasspath_fragment {
10047 name: "mysystemserverclasspathfragment",
10048 contents: ["mysystemserverclasspathlib"],
10049 apex_available: ["myapex"],
10050 }
10051
10052 java_sdk_library {
10053 name: "mysystemserverclasspathlib",
10054 srcs: ["mysystemserverclasspathlib.java"],
10055 apex_available: ["myapex"],
10056 compile_dex: true,
10057 unsafe_ignore_missing_latest_api: true,
10058 }
10059 `)
10060 })
10061}
10062
Jiakai Zhang6decef92022-01-12 17:56:19 +000010063// Verifies that the APEX depends on all the Make modules in the list.
10064func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10065 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10066 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010067 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010068 }
10069}
10070
10071// Verifies that the APEX does not depend on any of the Make modules in the list.
10072func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10073 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10074 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010075 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010076 }
10077}
10078
Cole Faust1021ccd2023-02-26 21:15:25 -080010079// TODO(b/193460475): Re-enable this test
10080//func TestApexStrictUpdtabilityLint(t *testing.T) {
10081// bpTemplate := `
10082// apex {
10083// name: "myapex",
10084// key: "myapex.key",
10085// java_libs: ["myjavalib"],
10086// updatable: %v,
10087// min_sdk_version: "29",
10088// }
10089// apex_key {
10090// name: "myapex.key",
10091// }
10092// java_library {
10093// name: "myjavalib",
10094// srcs: ["MyClass.java"],
10095// apex_available: [ "myapex" ],
10096// lint: {
10097// strict_updatability_linting: %v,
10098// },
10099// sdk_version: "current",
10100// min_sdk_version: "29",
10101// }
10102// `
10103// fs := android.MockFS{
10104// "lint-baseline.xml": nil,
10105// }
10106//
10107// testCases := []struct {
10108// testCaseName string
10109// apexUpdatable bool
10110// javaStrictUpdtabilityLint bool
10111// lintFileExists bool
10112// disallowedFlagExpected bool
10113// }{
10114// {
10115// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10116// apexUpdatable: true,
10117// javaStrictUpdtabilityLint: true,
10118// lintFileExists: false,
10119// disallowedFlagExpected: false,
10120// },
10121// {
10122// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10123// apexUpdatable: false,
10124// javaStrictUpdtabilityLint: false,
10125// lintFileExists: true,
10126// disallowedFlagExpected: false,
10127// },
10128// {
10129// testCaseName: "non-updatable apex respects strict updatability of javalib",
10130// apexUpdatable: false,
10131// javaStrictUpdtabilityLint: true,
10132// lintFileExists: true,
10133// disallowedFlagExpected: true,
10134// },
10135// {
10136// testCaseName: "updatable apex sets strict updatability of javalib to true",
10137// apexUpdatable: true,
10138// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10139// lintFileExists: true,
10140// disallowedFlagExpected: true,
10141// },
10142// }
10143//
10144// for _, testCase := range testCases {
10145// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10146// fixtures := []android.FixturePreparer{}
10147// if testCase.lintFileExists {
10148// fixtures = append(fixtures, fs.AddToFixture())
10149// }
10150//
10151// result := testApex(t, bp, fixtures...)
10152// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10153// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10154// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10155//
10156// if disallowedFlagActual != testCase.disallowedFlagExpected {
10157// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10158// }
10159// }
10160//}
10161//
10162//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10163// bp := `
10164// apex {
10165// name: "myapex",
10166// key: "myapex.key",
10167// java_libs: ["myjavalib"],
10168// updatable: true,
10169// min_sdk_version: "29",
10170// }
10171// apex_key {
10172// name: "myapex.key",
10173// }
10174// java_library {
10175// name: "myjavalib",
10176// srcs: ["MyClass.java"],
10177// apex_available: [ "myapex" ],
10178// sdk_version: "current",
10179// min_sdk_version: "29",
10180// }
10181// `
10182//
10183// testCases := []struct {
10184// testCaseName string
10185// moduleDirectory string
10186// disallowedFlagExpected bool
10187// }{
10188// {
10189// testCaseName: "lintable module defined outside libcore",
10190// moduleDirectory: "",
10191// disallowedFlagExpected: true,
10192// },
10193// {
10194// testCaseName: "lintable module defined in libcore root directory",
10195// moduleDirectory: "libcore/",
10196// disallowedFlagExpected: false,
10197// },
10198// {
10199// testCaseName: "lintable module defined in libcore child directory",
10200// moduleDirectory: "libcore/childdir/",
10201// disallowedFlagExpected: true,
10202// },
10203// }
10204//
10205// for _, testCase := range testCases {
10206// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10207// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10208// result := testApex(t, "", lintFileCreator, bpFileCreator)
10209// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10210// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10211// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10212// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10213//
10214// if disallowedFlagActual != testCase.disallowedFlagExpected {
10215// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10216// }
10217// }
10218//}
10219//
10220//// checks transtive deps of an apex coming from bootclasspath_fragment
10221//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10222// bp := `
10223// apex {
10224// name: "myapex",
10225// key: "myapex.key",
10226// bootclasspath_fragments: ["mybootclasspathfragment"],
10227// updatable: true,
10228// min_sdk_version: "29",
10229// }
10230// apex_key {
10231// name: "myapex.key",
10232// }
10233// bootclasspath_fragment {
10234// name: "mybootclasspathfragment",
10235// contents: ["myjavalib"],
10236// apex_available: ["myapex"],
10237// hidden_api: {
10238// split_packages: ["*"],
10239// },
10240// }
10241// java_library {
10242// name: "myjavalib",
10243// srcs: ["MyClass.java"],
10244// apex_available: [ "myapex" ],
10245// sdk_version: "current",
10246// min_sdk_version: "29",
10247// compile_dex: true,
10248// }
10249// `
10250// fs := android.MockFS{
10251// "lint-baseline.xml": nil,
10252// }
10253//
10254// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10255// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10256// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10257// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10258// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10259// }
10260//}
Spandan Das66773252022-01-15 00:23:18 +000010261
Spandan Das42e89502022-05-06 22:12:55 +000010262// updatable apexes should propagate updatable=true to its apps
10263func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10264 bp := `
10265 apex {
10266 name: "myapex",
10267 key: "myapex.key",
10268 updatable: %v,
10269 apps: [
10270 "myapp",
10271 ],
10272 min_sdk_version: "30",
10273 }
10274 apex_key {
10275 name: "myapex.key",
10276 }
10277 android_app {
10278 name: "myapp",
10279 updatable: %v,
10280 apex_available: [
10281 "myapex",
10282 ],
10283 sdk_version: "current",
10284 min_sdk_version: "30",
10285 }
10286 `
10287 testCases := []struct {
10288 name string
10289 apex_is_updatable_bp bool
10290 app_is_updatable_bp bool
10291 app_is_updatable_expected bool
10292 }{
10293 {
10294 name: "Non-updatable apex respects updatable property of non-updatable app",
10295 apex_is_updatable_bp: false,
10296 app_is_updatable_bp: false,
10297 app_is_updatable_expected: false,
10298 },
10299 {
10300 name: "Non-updatable apex respects updatable property of updatable app",
10301 apex_is_updatable_bp: false,
10302 app_is_updatable_bp: true,
10303 app_is_updatable_expected: true,
10304 },
10305 {
10306 name: "Updatable apex respects updatable property of updatable app",
10307 apex_is_updatable_bp: true,
10308 app_is_updatable_bp: true,
10309 app_is_updatable_expected: true,
10310 },
10311 {
10312 name: "Updatable apex sets updatable=true on non-updatable app",
10313 apex_is_updatable_bp: true,
10314 app_is_updatable_bp: false,
10315 app_is_updatable_expected: true,
10316 },
10317 }
10318 for _, testCase := range testCases {
10319 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10320 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10321 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10322 }
10323}
10324
Kiyoung Kim487689e2022-07-26 09:48:22 +090010325func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10326 bp := `
10327 apex {
10328 name: "myapex",
10329 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010330 native_shared_libs: ["libbaz"],
10331 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010332 min_sdk_version: "29",
10333 }
10334 apex_key {
10335 name: "myapex.key",
10336 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010337 cc_binary {
10338 name: "binfoo",
10339 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010340 apex_available: ["myapex"],
10341 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010342 recovery_available: false,
10343 }
10344 cc_library {
10345 name: "libbar",
10346 srcs: ["libbar.cc"],
10347 stubs: {
10348 symbol_file: "libbar.map.txt",
10349 versions: [
10350 "29",
10351 ],
10352 },
10353 }
10354 cc_library {
10355 name: "libbaz",
10356 srcs: ["libbaz.cc"],
10357 apex_available: ["myapex"],
10358 min_sdk_version: "29",
10359 stubs: {
10360 symbol_file: "libbaz.map.txt",
10361 versions: [
10362 "29",
10363 ],
10364 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010365 }
10366 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010367 name: "libbar",
10368 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010369 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010370 variants: ["apex.29"],
10371 }
10372 cc_api_variant {
10373 name: "libbar",
10374 variant: "apex",
10375 version: "29",
10376 src: "libbar_apex_29.so",
10377 }
10378 cc_api_library {
10379 name: "libbaz",
10380 src: "libbaz_stub.so",
10381 min_sdk_version: "29",
10382 variants: ["apex.29"],
10383 }
10384 cc_api_variant {
10385 name: "libbaz",
10386 variant: "apex",
10387 version: "29",
10388 src: "libbaz_apex_29.so",
10389 }
10390 cc_api_library {
10391 name: "libqux",
10392 src: "libqux_stub.so",
10393 min_sdk_version: "29",
10394 variants: ["apex.29"],
10395 }
10396 cc_api_variant {
10397 name: "libqux",
10398 variant: "apex",
10399 version: "29",
10400 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010401 }
10402 api_imports {
10403 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010404 apex_shared_libs: [
10405 "libbar",
10406 "libbaz",
10407 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010408 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010409 }
10410 `
10411 result := testApex(t, bp)
10412
10413 hasDep := func(m android.Module, wantDep android.Module) bool {
10414 t.Helper()
10415 var found bool
10416 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10417 if dep == wantDep {
10418 found = true
10419 }
10420 })
10421 return found
10422 }
10423
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010424 // Library defines stubs and cc_api_library should be used with cc_api_library
10425 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10426 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10427 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010428
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010429 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10430 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010431
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010432 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10433 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10434 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10435 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10436
10437 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10438 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10439 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10440 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10441 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10442
10443 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10444 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10445 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10446
10447 // cc_api_library defined without original library should be linked with cc_api_library
10448 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10449 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10450 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10451}
10452
10453func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10454 bp := `
10455 apex {
10456 name: "myapex",
10457 key: "myapex.key",
10458 native_shared_libs: ["libbar"],
10459 min_sdk_version: "29",
10460 }
10461 apex_key {
10462 name: "myapex.key",
10463 }
10464 cc_binary {
10465 name: "binfoo",
10466 shared_libs: ["libbar"],
10467 recovery_available: false,
10468 }
10469 cc_library {
10470 name: "libbar",
10471 srcs: ["libbar.cc"],
10472 apex_available: ["myapex"],
10473 min_sdk_version: "29",
10474 stubs: {
10475 symbol_file: "libbar.map.txt",
10476 versions: [
10477 "29",
10478 ],
10479 },
10480 }
10481 cc_api_library {
10482 name: "libbar",
10483 src: "libbar_stub.so",
10484 variants: ["apex.29"],
10485 }
10486 cc_api_variant {
10487 name: "libbar",
10488 variant: "apex",
10489 version: "29",
10490 src: "libbar_apex_29.so",
10491 }
10492 api_imports {
10493 name: "api_imports",
10494 apex_shared_libs: [
10495 "libbar",
10496 ],
10497 }
10498 `
10499
10500 result := testApex(t, bp)
10501
10502 hasDep := func(m android.Module, wantDep android.Module) bool {
10503 t.Helper()
10504 var found bool
10505 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10506 if dep == wantDep {
10507 found = true
10508 }
10509 })
10510 return found
10511 }
10512
10513 // Library defines stubs and cc_api_library should be used with cc_api_library
10514 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10515 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10516 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10517
10518 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10519 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10520
10521 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10522 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10523 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10524 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010525}
Dennis Shend4f5d932023-01-31 20:27:21 +000010526
10527func TestTrimmedApex(t *testing.T) {
10528 bp := `
10529 apex {
10530 name: "myapex",
10531 key: "myapex.key",
10532 native_shared_libs: ["libfoo","libbaz"],
10533 min_sdk_version: "29",
10534 trim_against: "mydcla",
10535 }
10536 apex {
10537 name: "mydcla",
10538 key: "myapex.key",
10539 native_shared_libs: ["libfoo","libbar"],
10540 min_sdk_version: "29",
10541 file_contexts: ":myapex-file_contexts",
10542 dynamic_common_lib_apex: true,
10543 }
10544 apex_key {
10545 name: "myapex.key",
10546 }
10547 cc_library {
10548 name: "libfoo",
10549 shared_libs: ["libc"],
10550 apex_available: ["myapex","mydcla"],
10551 min_sdk_version: "29",
10552 }
10553 cc_library {
10554 name: "libbar",
10555 shared_libs: ["libc"],
10556 apex_available: ["myapex","mydcla"],
10557 min_sdk_version: "29",
10558 }
10559 cc_library {
10560 name: "libbaz",
10561 shared_libs: ["libc"],
10562 apex_available: ["myapex","mydcla"],
10563 min_sdk_version: "29",
10564 }
10565 cc_api_library {
10566 name: "libc",
10567 src: "libc.so",
10568 min_sdk_version: "29",
10569 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010570 vendor_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010571 }
10572 api_imports {
10573 name: "api_imports",
10574 shared_libs: [
10575 "libc",
10576 ],
10577 header_libs: [],
10578 }
10579 `
10580 ctx := testApex(t, bp)
10581 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10582 apexRule := module.MaybeRule("apexRule")
10583 if apexRule.Rule == nil {
10584 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10585 }
10586
10587 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10588 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10589 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10590 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10591 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10592 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10593}
Jingwen Chendea7a642023-03-28 11:30:50 +000010594
10595func TestCannedFsConfig(t *testing.T) {
10596 ctx := testApex(t, `
10597 apex {
10598 name: "myapex",
10599 key: "myapex.key",
10600 updatable: false,
10601 }
10602
10603 apex_key {
10604 name: "myapex.key",
10605 public_key: "testkey.avbpubkey",
10606 private_key: "testkey.pem",
10607 }`)
10608 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10609 generateFsRule := mod.Rule("generateFsConfig")
10610 cmd := generateFsRule.RuleParams.Command
10611
10612 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10613}
10614
10615func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10616 ctx := testApex(t, `
10617 apex {
10618 name: "myapex",
10619 key: "myapex.key",
10620 canned_fs_config: "my_config",
10621 updatable: false,
10622 }
10623
10624 apex_key {
10625 name: "myapex.key",
10626 public_key: "testkey.avbpubkey",
10627 private_key: "testkey.pem",
10628 }`)
10629 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10630 generateFsRule := mod.Rule("generateFsConfig")
10631 cmd := generateFsRule.RuleParams.Command
10632
10633 // Ensure that canned_fs_config has "cat my_config" at the end
10634 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10635}
Spandan Das20fce2d2023-04-12 17:21:39 +000010636
10637func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10638 testCases := []struct {
10639 desc string
10640 hasStubs bool
10641 apexAvailable string
10642 expectedError string
10643 }{
10644 {
10645 desc: "non-stub library can have multiple apex_available",
10646 hasStubs: false,
10647 apexAvailable: `["myapex", "otherapex"]`,
10648 },
10649 {
10650 desc: "stub library should not be available to anyapex",
10651 hasStubs: true,
10652 apexAvailable: `["//apex_available:anyapex"]`,
10653 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10654 },
10655 {
10656 desc: "stub library should not be available to multiple apexes",
10657 hasStubs: true,
10658 apexAvailable: `["myapex", "otherapex"]`,
10659 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10660 },
10661 {
10662 desc: "stub library can be available to a core apex and a test apex",
10663 hasStubs: true,
10664 apexAvailable: `["myapex", "test_myapex"]`,
10665 },
10666 }
10667 bpTemplate := `
10668 cc_library {
10669 name: "libfoo",
10670 %v
10671 apex_available: %v,
10672 }
10673 apex {
10674 name: "myapex",
10675 key: "apex.key",
10676 updatable: false,
10677 native_shared_libs: ["libfoo"],
10678 }
10679 apex {
10680 name: "otherapex",
10681 key: "apex.key",
10682 updatable: false,
10683 }
10684 apex_test {
10685 name: "test_myapex",
10686 key: "apex.key",
10687 updatable: false,
10688 native_shared_libs: ["libfoo"],
10689 }
10690 apex_key {
10691 name: "apex.key",
10692 }
10693 `
10694 for _, tc := range testCases {
10695 stubs := ""
10696 if tc.hasStubs {
10697 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10698 }
10699 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10700 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10701 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10702 })
10703 if tc.expectedError == "" {
10704 testApex(t, bp, mockFsFixturePreparer)
10705 } else {
10706 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10707 }
10708 }
10709}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010710
10711func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10712 context := android.GroupFixturePreparers(
10713 android.PrepareForIntegrationTestWithAndroid,
10714 cc.PrepareForIntegrationTestWithCc,
10715 PrepareForTestWithApexBuildComponents,
10716 prepareForTestWithMyapex,
10717 filesystem.PrepareForTestWithFilesystemBuildComponents,
10718 )
10719 result := context.RunTestWithBp(t, `
10720 android_system_image {
10721 name: "myfilesystem",
10722 deps: [
10723 "libfoo",
10724 ],
10725 linker_config_src: "linker.config.json",
10726 }
10727
10728 cc_library {
10729 name: "libfoo",
10730 shared_libs: [
10731 "libbar",
10732 ],
10733 stl: "none",
10734 }
10735
10736 cc_library {
10737 name: "libbar",
10738 stl: "none",
10739 apex_available: ["myapex"],
10740 }
10741
10742 apex {
10743 name: "myapex",
10744 native_shared_libs: ["libbar"],
10745 key: "myapex.key",
10746 updatable: false,
10747 }
10748
10749 apex_key {
10750 name: "myapex.key",
10751 public_key: "testkey.avbpubkey",
10752 private_key: "testkey.pem",
10753 }
10754 `)
10755
10756 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10757 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10758 inputs.Strings(),
10759 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10760}