blob: 876a052b2d5845f9b21f5d92490d05c210b03ebe [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"
Liz Kammer0e255ef2022-11-04 16:07:04 -040032 "android/soong/bazel/cquery"
markchien2f59ec92020-09-02 16:23:38 +080033 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090034 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000035 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070036 prebuilt_etc "android/soong/etc"
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,
150 java.PrepareForTestWithJavaDefaultModules,
151 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()
Prerana Patilb1896c82022-11-09 18:14:34 +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
Alex Light5098a612018-11-29 17:12:15 -0800788func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800789 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800790 apex {
791 name: "myapex",
792 key: "myapex.key",
793 payload_type: "zip",
794 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000795 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800796 }
797
798 apex_key {
799 name: "myapex.key",
800 public_key: "testkey.avbpubkey",
801 private_key: "testkey.pem",
802 }
803
804 cc_library {
805 name: "mylib",
806 srcs: ["mylib.cpp"],
807 shared_libs: ["mylib2"],
808 system_shared_libs: [],
809 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000810 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800811 }
812
813 cc_library {
814 name: "mylib2",
815 srcs: ["mylib.cpp"],
816 system_shared_libs: [],
817 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000818 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800819 }
820 `)
821
Sundong Ahnabb64432019-10-22 13:58:29 +0900822 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800823 copyCmds := zipApexRule.Args["copy_commands"]
824
825 // Ensure that main rule creates an output
826 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
827
828 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700829 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800830
831 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700832 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800833
834 // Ensure that both direct and indirect deps are copied into apex
835 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
836 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900837}
838
839func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800840 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900841 apex {
842 name: "myapex",
843 key: "myapex.key",
844 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900845 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000846 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900847 }
848
849 apex_key {
850 name: "myapex.key",
851 public_key: "testkey.avbpubkey",
852 private_key: "testkey.pem",
853 }
854
855 cc_library {
856 name: "mylib",
857 srcs: ["mylib.cpp"],
858 shared_libs: ["mylib2", "mylib3"],
859 system_shared_libs: [],
860 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000861 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900862 }
863
864 cc_library {
865 name: "mylib2",
866 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900867 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900868 system_shared_libs: [],
869 stl: "none",
870 stubs: {
871 versions: ["1", "2", "3"],
872 },
873 }
874
875 cc_library {
876 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900877 srcs: ["mylib.cpp"],
878 shared_libs: ["mylib4"],
879 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900880 stl: "none",
881 stubs: {
882 versions: ["10", "11", "12"],
883 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000884 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900885 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900886
887 cc_library {
888 name: "mylib4",
889 srcs: ["mylib.cpp"],
890 system_shared_libs: [],
891 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000892 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900893 }
Jiyong Park105dc322021-06-11 17:22:09 +0900894
895 rust_binary {
896 name: "foo.rust",
897 srcs: ["foo.rs"],
898 shared_libs: ["libfoo.shared_from_rust"],
899 prefer_rlib: true,
900 apex_available: ["myapex"],
901 }
902
903 cc_library_shared {
904 name: "libfoo.shared_from_rust",
905 srcs: ["mylib.cpp"],
906 system_shared_libs: [],
907 stl: "none",
908 stubs: {
909 versions: ["10", "11", "12"],
910 },
911 }
912
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913 `)
914
Sundong Ahnabb64432019-10-22 13:58:29 +0900915 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916 copyCmds := apexRule.Args["copy_commands"]
917
918 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800919 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900920
921 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800922 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923
924 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800925 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900926
Colin Crossaede88c2020-08-11 12:17:01 -0700927 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928
929 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900930 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900932 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900933
934 // 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 -0700935 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700937 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900938
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700939 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
940 // is replaced by sharing of "cFlags" in cc/builder.go.
941 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
942 // module variable representing "cflags". So it was not detected by ensureNotContains.
943 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
944 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
945 // including the original cflags's "-include mylib.h".
946 //
Jiyong Park64379952018-12-13 18:37:29 +0900947 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700948 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
949 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900950
Jiyong Park85cc35a2022-07-17 11:30:47 +0900951 // Ensure that genstub for platform-provided lib is invoked with --systemapi
952 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
953 // Ensure that genstub for apex-provided lib is invoked with --apex
954 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900955
Jooyung Hana57af4a2020-01-23 05:36:59 +0000956 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900957 "lib64/mylib.so",
958 "lib64/mylib3.so",
959 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900960 "bin/foo.rust",
961 "lib64/libc++.so", // by the implicit dependency from foo.rust
962 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900963 })
Jiyong Park105dc322021-06-11 17:22:09 +0900964
965 // Ensure that stub dependency from a rust module is not included
966 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
967 // The rust module is linked to the stub cc library
968 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
969 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
970 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900971
972 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
973 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900974}
975
Jiyong Park1bc84122021-06-22 20:23:05 +0900976func TestApexCanUsePrivateApis(t *testing.T) {
977 ctx := testApex(t, `
978 apex {
979 name: "myapex",
980 key: "myapex.key",
981 native_shared_libs: ["mylib"],
982 binaries: ["foo.rust"],
983 updatable: false,
984 platform_apis: true,
985 }
986
987 apex_key {
988 name: "myapex.key",
989 public_key: "testkey.avbpubkey",
990 private_key: "testkey.pem",
991 }
992
993 cc_library {
994 name: "mylib",
995 srcs: ["mylib.cpp"],
996 shared_libs: ["mylib2"],
997 system_shared_libs: [],
998 stl: "none",
999 apex_available: [ "myapex" ],
1000 }
1001
1002 cc_library {
1003 name: "mylib2",
1004 srcs: ["mylib.cpp"],
1005 cflags: ["-include mylib.h"],
1006 system_shared_libs: [],
1007 stl: "none",
1008 stubs: {
1009 versions: ["1", "2", "3"],
1010 },
1011 }
1012
1013 rust_binary {
1014 name: "foo.rust",
1015 srcs: ["foo.rs"],
1016 shared_libs: ["libfoo.shared_from_rust"],
1017 prefer_rlib: true,
1018 apex_available: ["myapex"],
1019 }
1020
1021 cc_library_shared {
1022 name: "libfoo.shared_from_rust",
1023 srcs: ["mylib.cpp"],
1024 system_shared_libs: [],
1025 stl: "none",
1026 stubs: {
1027 versions: ["10", "11", "12"],
1028 },
1029 }
1030 `)
1031
1032 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1033 copyCmds := apexRule.Args["copy_commands"]
1034
1035 // Ensure that indirect stubs dep is not included
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1037 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1038
1039 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1040 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001041 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001042 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1043 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001044 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001045 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1046 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1047}
1048
Colin Cross7812fd32020-09-25 12:35:10 -07001049func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1050 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001051 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001052 apex {
1053 name: "myapex",
1054 key: "myapex.key",
1055 native_shared_libs: ["mylib", "mylib3"],
1056 min_sdk_version: "29",
1057 }
1058
1059 apex_key {
1060 name: "myapex.key",
1061 public_key: "testkey.avbpubkey",
1062 private_key: "testkey.pem",
1063 }
1064
1065 cc_library {
1066 name: "mylib",
1067 srcs: ["mylib.cpp"],
1068 shared_libs: ["mylib2", "mylib3"],
1069 system_shared_libs: [],
1070 stl: "none",
1071 apex_available: [ "myapex" ],
1072 min_sdk_version: "28",
1073 }
1074
1075 cc_library {
1076 name: "mylib2",
1077 srcs: ["mylib.cpp"],
1078 cflags: ["-include mylib.h"],
1079 system_shared_libs: [],
1080 stl: "none",
1081 stubs: {
1082 versions: ["28", "29", "30", "current"],
1083 },
1084 min_sdk_version: "28",
1085 }
1086
1087 cc_library {
1088 name: "mylib3",
1089 srcs: ["mylib.cpp"],
1090 shared_libs: ["mylib4"],
1091 system_shared_libs: [],
1092 stl: "none",
1093 stubs: {
1094 versions: ["28", "29", "30", "current"],
1095 },
1096 apex_available: [ "myapex" ],
1097 min_sdk_version: "28",
1098 }
1099
1100 cc_library {
1101 name: "mylib4",
1102 srcs: ["mylib.cpp"],
1103 system_shared_libs: [],
1104 stl: "none",
1105 apex_available: [ "myapex" ],
1106 min_sdk_version: "28",
1107 }
1108 `)
1109
1110 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1111 copyCmds := apexRule.Args["copy_commands"]
1112
1113 // Ensure that direct non-stubs dep is always included
1114 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1115
1116 // Ensure that indirect stubs dep is not included
1117 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1118
1119 // Ensure that direct stubs dep is included
1120 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1121
1122 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1123
Jiyong Park55549df2021-02-26 23:57:23 +09001124 // Ensure that mylib is linking with the latest version of stub for mylib2
1125 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001126 // ... and not linking to the non-stub (impl) variant of mylib2
1127 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1128
1129 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1130 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1131 // .. and not linking to the stubs variant of mylib3
1132 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1133
1134 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001135 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001136 ensureNotContains(t, mylib2Cflags, "-include ")
1137
Jiyong Park85cc35a2022-07-17 11:30:47 +09001138 // Ensure that genstub is invoked with --systemapi
1139 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001140
1141 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1142 "lib64/mylib.so",
1143 "lib64/mylib3.so",
1144 "lib64/mylib4.so",
1145 })
1146}
1147
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001148func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1149 t.Parallel()
1150 // myapex (Z)
1151 // mylib -----------------.
1152 // |
1153 // otherapex (29) |
1154 // libstub's versions: 29 Z current
1155 // |
1156 // <platform> |
1157 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001158 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001159 apex {
1160 name: "myapex",
1161 key: "myapex.key",
1162 native_shared_libs: ["mylib"],
1163 min_sdk_version: "Z", // non-final
1164 }
1165
1166 cc_library {
1167 name: "mylib",
1168 srcs: ["mylib.cpp"],
1169 shared_libs: ["libstub"],
1170 apex_available: ["myapex"],
1171 min_sdk_version: "Z",
1172 }
1173
1174 apex_key {
1175 name: "myapex.key",
1176 public_key: "testkey.avbpubkey",
1177 private_key: "testkey.pem",
1178 }
1179
1180 apex {
1181 name: "otherapex",
1182 key: "myapex.key",
1183 native_shared_libs: ["libstub"],
1184 min_sdk_version: "29",
1185 }
1186
1187 cc_library {
1188 name: "libstub",
1189 srcs: ["mylib.cpp"],
1190 stubs: {
1191 versions: ["29", "Z", "current"],
1192 },
1193 apex_available: ["otherapex"],
1194 min_sdk_version: "29",
1195 }
1196
1197 // platform module depending on libstub from otherapex should use the latest stub("current")
1198 cc_library {
1199 name: "libplatform",
1200 srcs: ["mylib.cpp"],
1201 shared_libs: ["libstub"],
1202 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001203 `,
1204 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1205 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1206 variables.Platform_sdk_final = proptools.BoolPtr(false)
1207 variables.Platform_version_active_codenames = []string{"Z"}
1208 }),
1209 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001210
Jiyong Park55549df2021-02-26 23:57:23 +09001211 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001212 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001213 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001214 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001215 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001216
1217 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1218 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1219 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1220 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1221 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1222}
1223
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001224func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001225 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001226 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001227 name: "myapex2",
1228 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001230 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001231 }
1232
1233 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001234 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001235 public_key: "testkey.avbpubkey",
1236 private_key: "testkey.pem",
1237 }
1238
1239 cc_library {
1240 name: "mylib",
1241 srcs: ["mylib.cpp"],
1242 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001243 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001244 system_shared_libs: [],
1245 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001246 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001247 }
1248
1249 cc_library {
1250 name: "libfoo",
1251 srcs: ["mylib.cpp"],
1252 shared_libs: ["libbar"],
1253 system_shared_libs: [],
1254 stl: "none",
1255 stubs: {
1256 versions: ["10", "20", "30"],
1257 },
1258 }
1259
1260 cc_library {
1261 name: "libbar",
1262 srcs: ["mylib.cpp"],
1263 system_shared_libs: [],
1264 stl: "none",
1265 }
1266
Jiyong Park678c8812020-02-07 17:25:49 +09001267 cc_library_static {
1268 name: "libbaz",
1269 srcs: ["mylib.cpp"],
1270 system_shared_libs: [],
1271 stl: "none",
1272 apex_available: [ "myapex2" ],
1273 }
1274
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001275 `)
1276
Jiyong Park83dc74b2020-01-14 18:38:44 +09001277 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278 copyCmds := apexRule.Args["copy_commands"]
1279
1280 // Ensure that direct non-stubs dep is always included
1281 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1282
1283 // Ensure that indirect stubs dep is not included
1284 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1285
1286 // Ensure that dependency of stubs is not included
1287 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1288
Colin Crossaede88c2020-08-11 12:17:01 -07001289 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001290
1291 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001292 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001293 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001294 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001295
Jiyong Park3ff16992019-12-27 14:11:47 +09001296 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001297
1298 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1299 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001300
Artur Satayeva8bd1132020-04-27 18:07:06 +01001301 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001302 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001303
Artur Satayeva8bd1132020-04-27 18:07:06 +01001304 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001305 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001306}
1307
Jooyung Hand3639552019-08-09 12:57:43 +09001308func TestApexWithRuntimeLibsDependency(t *testing.T) {
1309 /*
1310 myapex
1311 |
1312 v (runtime_libs)
1313 mylib ------+------> libfoo [provides stub]
1314 |
1315 `------> libbar
1316 */
Colin Cross1c460562021-02-16 17:55:47 -08001317 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001318 apex {
1319 name: "myapex",
1320 key: "myapex.key",
1321 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001322 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001323 }
1324
1325 apex_key {
1326 name: "myapex.key",
1327 public_key: "testkey.avbpubkey",
1328 private_key: "testkey.pem",
1329 }
1330
1331 cc_library {
1332 name: "mylib",
1333 srcs: ["mylib.cpp"],
1334 runtime_libs: ["libfoo", "libbar"],
1335 system_shared_libs: [],
1336 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001337 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001338 }
1339
1340 cc_library {
1341 name: "libfoo",
1342 srcs: ["mylib.cpp"],
1343 system_shared_libs: [],
1344 stl: "none",
1345 stubs: {
1346 versions: ["10", "20", "30"],
1347 },
1348 }
1349
1350 cc_library {
1351 name: "libbar",
1352 srcs: ["mylib.cpp"],
1353 system_shared_libs: [],
1354 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001355 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001356 }
1357
1358 `)
1359
Sundong Ahnabb64432019-10-22 13:58:29 +09001360 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001361 copyCmds := apexRule.Args["copy_commands"]
1362
1363 // Ensure that direct non-stubs dep is always included
1364 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1365
1366 // Ensure that indirect stubs dep is not included
1367 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1368
1369 // Ensure that runtime_libs dep in included
1370 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1371
Sundong Ahnabb64432019-10-22 13:58:29 +09001372 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001373 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1374 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001375
1376}
1377
Paul Duffina02cae32021-03-09 01:44:06 +00001378var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1379 cc.PrepareForTestWithCcBuildComponents,
1380 PrepareForTestWithApexBuildComponents,
1381 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001382 apex {
1383 name: "com.android.runtime",
1384 key: "com.android.runtime.key",
1385 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001386 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001387 }
1388
1389 apex_key {
1390 name: "com.android.runtime.key",
1391 public_key: "testkey.avbpubkey",
1392 private_key: "testkey.pem",
1393 }
Paul Duffina02cae32021-03-09 01:44:06 +00001394 `),
1395 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1396)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001397
Paul Duffina02cae32021-03-09 01:44:06 +00001398func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001399 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001400 cc_library {
1401 name: "libc",
1402 no_libcrt: true,
1403 nocrt: true,
1404 stl: "none",
1405 system_shared_libs: [],
1406 stubs: { versions: ["1"] },
1407 apex_available: ["com.android.runtime"],
1408
1409 sanitize: {
1410 hwaddress: true,
1411 }
1412 }
1413
1414 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001415 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001416 no_libcrt: true,
1417 nocrt: true,
1418 stl: "none",
1419 system_shared_libs: [],
1420 srcs: [""],
1421 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001422 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001423
1424 sanitize: {
1425 never: true,
1426 },
Paul Duffina02cae32021-03-09 01:44:06 +00001427 } `)
1428 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001429
1430 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1431 "lib64/bionic/libc.so",
1432 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1433 })
1434
Colin Cross4c4c1be2022-02-10 11:41:18 -08001435 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001436
1437 installed := hwasan.Description("install libclang_rt.hwasan")
1438 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1439
1440 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1441 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1442 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1443}
1444
1445func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001446 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001447 prepareForTestOfRuntimeApexWithHwasan,
1448 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1449 variables.SanitizeDevice = []string{"hwaddress"}
1450 }),
1451 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001452 cc_library {
1453 name: "libc",
1454 no_libcrt: true,
1455 nocrt: true,
1456 stl: "none",
1457 system_shared_libs: [],
1458 stubs: { versions: ["1"] },
1459 apex_available: ["com.android.runtime"],
1460 }
1461
1462 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001463 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001464 no_libcrt: true,
1465 nocrt: true,
1466 stl: "none",
1467 system_shared_libs: [],
1468 srcs: [""],
1469 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001470 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001471
1472 sanitize: {
1473 never: true,
1474 },
1475 }
Paul Duffina02cae32021-03-09 01:44:06 +00001476 `)
1477 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001478
1479 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1480 "lib64/bionic/libc.so",
1481 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1482 })
1483
Colin Cross4c4c1be2022-02-10 11:41:18 -08001484 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001485
1486 installed := hwasan.Description("install libclang_rt.hwasan")
1487 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1488
1489 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1490 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1491 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1492}
1493
Jooyung Han61b66e92020-03-21 14:21:46 +00001494func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1495 testcases := []struct {
1496 name string
1497 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001498 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001499 shouldLink string
1500 shouldNotLink []string
1501 }{
1502 {
Jiyong Park55549df2021-02-26 23:57:23 +09001503 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001504 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001505 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001506 shouldLink: "current",
1507 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001508 },
1509 {
Jiyong Park55549df2021-02-26 23:57:23 +09001510 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001511 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001512 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001513 shouldLink: "current",
1514 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001515 },
1516 }
1517 for _, tc := range testcases {
1518 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001519 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001520 apex {
1521 name: "myapex",
1522 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001523 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001524 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001525 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001526 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001527
Jooyung Han61b66e92020-03-21 14:21:46 +00001528 apex_key {
1529 name: "myapex.key",
1530 public_key: "testkey.avbpubkey",
1531 private_key: "testkey.pem",
1532 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001533
Jooyung Han61b66e92020-03-21 14:21:46 +00001534 cc_library {
1535 name: "mylib",
1536 srcs: ["mylib.cpp"],
1537 vendor_available: true,
1538 shared_libs: ["libbar"],
1539 system_shared_libs: [],
1540 stl: "none",
1541 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001542 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001543 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001544
Jooyung Han61b66e92020-03-21 14:21:46 +00001545 cc_library {
1546 name: "libbar",
1547 srcs: ["mylib.cpp"],
1548 system_shared_libs: [],
1549 stl: "none",
1550 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001551 llndk: {
1552 symbol_file: "libbar.map.txt",
1553 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001554 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001555 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001556 withUnbundledBuild,
1557 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001558
Jooyung Han61b66e92020-03-21 14:21:46 +00001559 // Ensure that LLNDK dep is not included
1560 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1561 "lib64/mylib.so",
1562 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001563
Jooyung Han61b66e92020-03-21 14:21:46 +00001564 // Ensure that LLNDK dep is required
1565 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1566 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1567 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001568
Steven Moreland2c4000c2021-04-27 02:08:49 +00001569 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1570 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001571 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001572 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001573 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001574
Steven Moreland2c4000c2021-04-27 02:08:49 +00001575 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001576 ver := tc.shouldLink
1577 if tc.shouldLink == "current" {
1578 ver = strconv.Itoa(android.FutureApiLevelInt)
1579 }
1580 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001581 })
1582 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001583}
1584
Jiyong Park25fc6a92018-11-18 18:02:45 +09001585func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001586 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001587 apex {
1588 name: "myapex",
1589 key: "myapex.key",
1590 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001591 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001592 }
1593
1594 apex_key {
1595 name: "myapex.key",
1596 public_key: "testkey.avbpubkey",
1597 private_key: "testkey.pem",
1598 }
1599
1600 cc_library {
1601 name: "mylib",
1602 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001603 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001604 shared_libs: ["libdl#27"],
1605 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001606 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001607 }
1608
1609 cc_library_shared {
1610 name: "mylib_shared",
1611 srcs: ["mylib.cpp"],
1612 shared_libs: ["libdl#27"],
1613 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001614 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001615 }
1616
1617 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001618 name: "libBootstrap",
1619 srcs: ["mylib.cpp"],
1620 stl: "none",
1621 bootstrap: true,
1622 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001623 `)
1624
Sundong Ahnabb64432019-10-22 13:58:29 +09001625 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001626 copyCmds := apexRule.Args["copy_commands"]
1627
1628 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001629 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001630 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1631 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001632
1633 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001634 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001635
Colin Crossaede88c2020-08-11 12:17:01 -07001636 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1637 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1638 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001639
1640 // For dependency to libc
1641 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001642 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001643 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001644 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001645 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001646 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1647 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001648
1649 // For dependency to libm
1650 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001651 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001652 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001653 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001654 // ... and is not compiling with the stub
1655 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1656 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1657
1658 // For dependency to libdl
1659 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001660 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001661 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001662 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1663 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001664 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001665 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001666 // ... Cflags from stub is correctly exported to mylib
1667 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1668 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001669
1670 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001671 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1672 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1673 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1674 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001675}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001676
Jooyung Han749dc692020-04-15 11:03:39 +09001677func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001678 // there are three links between liba --> libz.
1679 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001680 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001681 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001682 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001683 apex {
1684 name: "myapex",
1685 key: "myapex.key",
1686 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001687 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001688 }
1689
1690 apex {
1691 name: "otherapex",
1692 key: "myapex.key",
1693 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001694 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001695 }
1696
1697 apex_key {
1698 name: "myapex.key",
1699 public_key: "testkey.avbpubkey",
1700 private_key: "testkey.pem",
1701 }
1702
1703 cc_library {
1704 name: "libx",
1705 shared_libs: ["liba"],
1706 system_shared_libs: [],
1707 stl: "none",
1708 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001709 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001710 }
1711
1712 cc_library {
1713 name: "liby",
1714 shared_libs: ["liba"],
1715 system_shared_libs: [],
1716 stl: "none",
1717 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001718 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001719 }
1720
1721 cc_library {
1722 name: "liba",
1723 shared_libs: ["libz"],
1724 system_shared_libs: [],
1725 stl: "none",
1726 apex_available: [
1727 "//apex_available:anyapex",
1728 "//apex_available:platform",
1729 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001730 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001731 }
1732
1733 cc_library {
1734 name: "libz",
1735 system_shared_libs: [],
1736 stl: "none",
1737 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001738 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001739 },
1740 }
Jooyung Han749dc692020-04-15 11:03:39 +09001741 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001742
1743 expectLink := func(from, from_variant, to, to_variant string) {
1744 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1745 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1746 }
1747 expectNoLink := func(from, from_variant, to, to_variant string) {
1748 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1749 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1750 }
1751 // platform liba is linked to non-stub version
1752 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001753 // liba in myapex is linked to current
1754 expectLink("liba", "shared_apex29", "libz", "shared_current")
1755 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001756 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001757 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001758 // liba in otherapex is linked to current
1759 expectLink("liba", "shared_apex30", "libz", "shared_current")
1760 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001761 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1762 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001763}
1764
Jooyung Hanaed150d2020-04-02 01:41:41 +09001765func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001766 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001767 apex {
1768 name: "myapex",
1769 key: "myapex.key",
1770 native_shared_libs: ["libx"],
1771 min_sdk_version: "R",
1772 }
1773
1774 apex_key {
1775 name: "myapex.key",
1776 public_key: "testkey.avbpubkey",
1777 private_key: "testkey.pem",
1778 }
1779
1780 cc_library {
1781 name: "libx",
1782 shared_libs: ["libz"],
1783 system_shared_libs: [],
1784 stl: "none",
1785 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001786 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001787 }
1788
1789 cc_library {
1790 name: "libz",
1791 system_shared_libs: [],
1792 stl: "none",
1793 stubs: {
1794 versions: ["29", "R"],
1795 },
1796 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001797 `,
1798 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1799 variables.Platform_version_active_codenames = []string{"R"}
1800 }),
1801 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001802
1803 expectLink := func(from, from_variant, to, to_variant string) {
1804 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1805 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1806 }
1807 expectNoLink := func(from, from_variant, to, to_variant string) {
1808 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1809 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1810 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001811 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1812 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001813 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1814 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001815}
1816
Jooyung Han4c4da062021-06-23 10:23:16 +09001817func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1818 testApex(t, `
1819 apex {
1820 name: "myapex",
1821 key: "myapex.key",
1822 java_libs: ["libx"],
1823 min_sdk_version: "S",
1824 }
1825
1826 apex_key {
1827 name: "myapex.key",
1828 public_key: "testkey.avbpubkey",
1829 private_key: "testkey.pem",
1830 }
1831
1832 java_library {
1833 name: "libx",
1834 srcs: ["a.java"],
1835 apex_available: [ "myapex" ],
1836 sdk_version: "current",
1837 min_sdk_version: "S", // should be okay
1838 }
1839 `,
1840 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1841 variables.Platform_version_active_codenames = []string{"S"}
1842 variables.Platform_sdk_codename = proptools.StringPtr("S")
1843 }),
1844 )
1845}
1846
Jooyung Han749dc692020-04-15 11:03:39 +09001847func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001848 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001849 apex {
1850 name: "myapex",
1851 key: "myapex.key",
1852 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001853 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001854 }
1855
1856 apex_key {
1857 name: "myapex.key",
1858 public_key: "testkey.avbpubkey",
1859 private_key: "testkey.pem",
1860 }
1861
1862 cc_library {
1863 name: "libx",
1864 shared_libs: ["libz"],
1865 system_shared_libs: [],
1866 stl: "none",
1867 apex_available: [ "myapex" ],
1868 }
1869
1870 cc_library {
1871 name: "libz",
1872 system_shared_libs: [],
1873 stl: "none",
1874 stubs: {
1875 versions: ["1", "2"],
1876 },
1877 }
1878 `)
1879
1880 expectLink := func(from, from_variant, to, to_variant string) {
1881 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1882 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1883 }
1884 expectNoLink := func(from, from_variant, to, to_variant string) {
1885 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1886 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1887 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001888 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001889 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001890 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001891 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001892}
1893
Jiyong Park5df7bd32021-08-25 16:18:46 +09001894func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1895 ctx := testApex(t, `
1896 apex {
1897 name: "myapex",
1898 key: "myapex.key",
1899 native_shared_libs: ["mylib"],
1900 updatable: false,
1901 vendor: true,
1902 min_sdk_version: "29",
1903 }
1904
1905 apex_key {
1906 name: "myapex.key",
1907 public_key: "testkey.avbpubkey",
1908 private_key: "testkey.pem",
1909 }
1910
1911 cc_library {
1912 name: "mylib",
1913 vendor_available: true,
1914 system_shared_libs: [],
1915 stl: "none",
1916 apex_available: [ "myapex" ],
1917 min_sdk_version: "29",
1918 }
1919 `)
1920
1921 vendorVariant := "android_vendor.29_arm64_armv8-a"
1922
1923 // First check that the correct variant of crtbegin_so is used.
1924 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1925 crtBegin := names(ldRule.Args["crtBegin"])
1926 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1927
1928 // Ensure that the crtbegin_so used by the APEX is targeting 29
1929 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1930 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1931}
1932
Jooyung Han03b51852020-02-26 22:45:42 +09001933func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001934 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001935 apex {
1936 name: "myapex",
1937 key: "myapex.key",
1938 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001939 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001940 }
1941
1942 apex_key {
1943 name: "myapex.key",
1944 public_key: "testkey.avbpubkey",
1945 private_key: "testkey.pem",
1946 }
1947
1948 cc_library {
1949 name: "libx",
1950 system_shared_libs: [],
1951 stl: "none",
1952 apex_available: [ "myapex" ],
1953 stubs: {
1954 versions: ["1", "2"],
1955 },
1956 }
1957
1958 cc_library {
1959 name: "libz",
1960 shared_libs: ["libx"],
1961 system_shared_libs: [],
1962 stl: "none",
1963 }
1964 `)
1965
1966 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001967 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001968 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1969 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1970 }
1971 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001972 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001973 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1974 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1975 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001976 expectLink("libz", "shared", "libx", "shared_current")
1977 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001978 expectNoLink("libz", "shared", "libz", "shared_1")
1979 expectNoLink("libz", "shared", "libz", "shared")
1980}
1981
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001982var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1983 func(variables android.FixtureProductVariables) {
1984 variables.SanitizeDevice = []string{"hwaddress"}
1985 },
1986)
1987
Jooyung Han75568392020-03-20 04:29:24 +09001988func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001989 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001990 apex {
1991 name: "myapex",
1992 key: "myapex.key",
1993 native_shared_libs: ["libx"],
1994 min_sdk_version: "29",
1995 }
1996
1997 apex_key {
1998 name: "myapex.key",
1999 public_key: "testkey.avbpubkey",
2000 private_key: "testkey.pem",
2001 }
2002
2003 cc_library {
2004 name: "libx",
2005 shared_libs: ["libbar"],
2006 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002007 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002008 }
2009
2010 cc_library {
2011 name: "libbar",
2012 stubs: {
2013 versions: ["29", "30"],
2014 },
2015 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002016 `,
2017 prepareForTestWithSantitizeHwaddress,
2018 )
Jooyung Han03b51852020-02-26 22:45:42 +09002019 expectLink := func(from, from_variant, to, to_variant string) {
2020 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2021 libFlags := ld.Args["libFlags"]
2022 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2023 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002024 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002025}
2026
Jooyung Han75568392020-03-20 04:29:24 +09002027func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002028 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002029 apex {
2030 name: "myapex",
2031 key: "myapex.key",
2032 native_shared_libs: ["libx"],
2033 min_sdk_version: "29",
2034 }
2035
2036 apex_key {
2037 name: "myapex.key",
2038 public_key: "testkey.avbpubkey",
2039 private_key: "testkey.pem",
2040 }
2041
2042 cc_library {
2043 name: "libx",
2044 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002045 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002046 }
Jooyung Han75568392020-03-20 04:29:24 +09002047 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002048
2049 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002050 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002051 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002052 // note that platform variant is not.
2053 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002054 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002055}
2056
Jooyung Han749dc692020-04-15 11:03:39 +09002057func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2058 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002059 apex {
2060 name: "myapex",
2061 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002062 native_shared_libs: ["mylib"],
2063 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002064 }
2065
2066 apex_key {
2067 name: "myapex.key",
2068 public_key: "testkey.avbpubkey",
2069 private_key: "testkey.pem",
2070 }
Jooyung Han749dc692020-04-15 11:03:39 +09002071
2072 cc_library {
2073 name: "mylib",
2074 srcs: ["mylib.cpp"],
2075 system_shared_libs: [],
2076 stl: "none",
2077 apex_available: [
2078 "myapex",
2079 ],
2080 min_sdk_version: "30",
2081 }
2082 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002083
2084 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2085 apex {
2086 name: "myapex",
2087 key: "myapex.key",
2088 native_shared_libs: ["libfoo.ffi"],
2089 min_sdk_version: "29",
2090 }
2091
2092 apex_key {
2093 name: "myapex.key",
2094 public_key: "testkey.avbpubkey",
2095 private_key: "testkey.pem",
2096 }
2097
2098 rust_ffi_shared {
2099 name: "libfoo.ffi",
2100 srcs: ["foo.rs"],
2101 crate_name: "foo",
2102 apex_available: [
2103 "myapex",
2104 ],
2105 min_sdk_version: "30",
2106 }
2107 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002108
2109 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2110 apex {
2111 name: "myapex",
2112 key: "myapex.key",
2113 java_libs: ["libfoo"],
2114 min_sdk_version: "29",
2115 }
2116
2117 apex_key {
2118 name: "myapex.key",
2119 public_key: "testkey.avbpubkey",
2120 private_key: "testkey.pem",
2121 }
2122
2123 java_import {
2124 name: "libfoo",
2125 jars: ["libfoo.jar"],
2126 apex_available: [
2127 "myapex",
2128 ],
2129 min_sdk_version: "30",
2130 }
2131 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002132}
2133
2134func TestApexMinSdkVersion_Okay(t *testing.T) {
2135 testApex(t, `
2136 apex {
2137 name: "myapex",
2138 key: "myapex.key",
2139 native_shared_libs: ["libfoo"],
2140 java_libs: ["libbar"],
2141 min_sdk_version: "29",
2142 }
2143
2144 apex_key {
2145 name: "myapex.key",
2146 public_key: "testkey.avbpubkey",
2147 private_key: "testkey.pem",
2148 }
2149
2150 cc_library {
2151 name: "libfoo",
2152 srcs: ["mylib.cpp"],
2153 shared_libs: ["libfoo_dep"],
2154 apex_available: ["myapex"],
2155 min_sdk_version: "29",
2156 }
2157
2158 cc_library {
2159 name: "libfoo_dep",
2160 srcs: ["mylib.cpp"],
2161 apex_available: ["myapex"],
2162 min_sdk_version: "29",
2163 }
2164
2165 java_library {
2166 name: "libbar",
2167 sdk_version: "current",
2168 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002169 static_libs: [
2170 "libbar_dep",
2171 "libbar_import_dep",
2172 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002173 apex_available: ["myapex"],
2174 min_sdk_version: "29",
2175 }
2176
2177 java_library {
2178 name: "libbar_dep",
2179 sdk_version: "current",
2180 srcs: ["a.java"],
2181 apex_available: ["myapex"],
2182 min_sdk_version: "29",
2183 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002184
2185 java_import {
2186 name: "libbar_import_dep",
2187 jars: ["libbar.jar"],
2188 apex_available: ["myapex"],
2189 min_sdk_version: "29",
2190 }
Jooyung Han03b51852020-02-26 22:45:42 +09002191 `)
2192}
2193
Colin Cross8ca61c12022-10-06 21:00:14 -07002194func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2195 // Tests that an apex dependency with min_sdk_version higher than the
2196 // min_sdk_version of the apex is allowed as long as the dependency's
2197 // min_sdk_version is less than or equal to the api level that the
2198 // architecture was introduced in. In this case, arm64 didn't exist
2199 // until api level 21, so the arm64 code will never need to run on
2200 // an api level 20 device, even if other architectures of the apex
2201 // will.
2202 testApex(t, `
2203 apex {
2204 name: "myapex",
2205 key: "myapex.key",
2206 native_shared_libs: ["libfoo"],
2207 min_sdk_version: "20",
2208 }
2209
2210 apex_key {
2211 name: "myapex.key",
2212 public_key: "testkey.avbpubkey",
2213 private_key: "testkey.pem",
2214 }
2215
2216 cc_library {
2217 name: "libfoo",
2218 srcs: ["mylib.cpp"],
2219 apex_available: ["myapex"],
2220 min_sdk_version: "21",
2221 stl: "none",
2222 }
2223 `)
2224}
2225
Artur Satayev8cf899a2020-04-15 17:29:42 +01002226func TestJavaStableSdkVersion(t *testing.T) {
2227 testCases := []struct {
2228 name string
2229 expectedError string
2230 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002231 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002232 }{
2233 {
2234 name: "Non-updatable apex with non-stable dep",
2235 bp: `
2236 apex {
2237 name: "myapex",
2238 java_libs: ["myjar"],
2239 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002240 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002241 }
2242 apex_key {
2243 name: "myapex.key",
2244 public_key: "testkey.avbpubkey",
2245 private_key: "testkey.pem",
2246 }
2247 java_library {
2248 name: "myjar",
2249 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002250 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002251 apex_available: ["myapex"],
2252 }
2253 `,
2254 },
2255 {
2256 name: "Updatable apex with stable dep",
2257 bp: `
2258 apex {
2259 name: "myapex",
2260 java_libs: ["myjar"],
2261 key: "myapex.key",
2262 updatable: true,
2263 min_sdk_version: "29",
2264 }
2265 apex_key {
2266 name: "myapex.key",
2267 public_key: "testkey.avbpubkey",
2268 private_key: "testkey.pem",
2269 }
2270 java_library {
2271 name: "myjar",
2272 srcs: ["foo/bar/MyClass.java"],
2273 sdk_version: "current",
2274 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002275 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002276 }
2277 `,
2278 },
2279 {
2280 name: "Updatable apex with non-stable dep",
2281 expectedError: "cannot depend on \"myjar\"",
2282 bp: `
2283 apex {
2284 name: "myapex",
2285 java_libs: ["myjar"],
2286 key: "myapex.key",
2287 updatable: true,
2288 }
2289 apex_key {
2290 name: "myapex.key",
2291 public_key: "testkey.avbpubkey",
2292 private_key: "testkey.pem",
2293 }
2294 java_library {
2295 name: "myjar",
2296 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002297 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002298 apex_available: ["myapex"],
2299 }
2300 `,
2301 },
2302 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002303 name: "Updatable apex with non-stable legacy core platform dep",
2304 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2305 bp: `
2306 apex {
2307 name: "myapex",
2308 java_libs: ["myjar-uses-legacy"],
2309 key: "myapex.key",
2310 updatable: true,
2311 }
2312 apex_key {
2313 name: "myapex.key",
2314 public_key: "testkey.avbpubkey",
2315 private_key: "testkey.pem",
2316 }
2317 java_library {
2318 name: "myjar-uses-legacy",
2319 srcs: ["foo/bar/MyClass.java"],
2320 sdk_version: "core_platform",
2321 apex_available: ["myapex"],
2322 }
2323 `,
2324 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2325 },
2326 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002327 name: "Updatable apex with non-stable transitive dep",
2328 // This is not actually detecting that the transitive dependency is unstable, rather it is
2329 // detecting that the transitive dependency is building against a wider API surface than the
2330 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002331 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002332 bp: `
2333 apex {
2334 name: "myapex",
2335 java_libs: ["myjar"],
2336 key: "myapex.key",
2337 updatable: true,
2338 }
2339 apex_key {
2340 name: "myapex.key",
2341 public_key: "testkey.avbpubkey",
2342 private_key: "testkey.pem",
2343 }
2344 java_library {
2345 name: "myjar",
2346 srcs: ["foo/bar/MyClass.java"],
2347 sdk_version: "current",
2348 apex_available: ["myapex"],
2349 static_libs: ["transitive-jar"],
2350 }
2351 java_library {
2352 name: "transitive-jar",
2353 srcs: ["foo/bar/MyClass.java"],
2354 sdk_version: "core_platform",
2355 apex_available: ["myapex"],
2356 }
2357 `,
2358 },
2359 }
2360
2361 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002362 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2363 continue
2364 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002365 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002366 errorHandler := android.FixtureExpectsNoErrors
2367 if test.expectedError != "" {
2368 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002369 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002370 android.GroupFixturePreparers(
2371 java.PrepareForTestWithJavaDefaultModules,
2372 PrepareForTestWithApexBuildComponents,
2373 prepareForTestWithMyapex,
2374 android.OptionalFixturePreparer(test.preparer),
2375 ).
2376 ExtendWithErrorHandler(errorHandler).
2377 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002378 })
2379 }
2380}
2381
Jooyung Han749dc692020-04-15 11:03:39 +09002382func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2383 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2384 apex {
2385 name: "myapex",
2386 key: "myapex.key",
2387 native_shared_libs: ["mylib"],
2388 min_sdk_version: "29",
2389 }
2390
2391 apex_key {
2392 name: "myapex.key",
2393 public_key: "testkey.avbpubkey",
2394 private_key: "testkey.pem",
2395 }
2396
2397 cc_library {
2398 name: "mylib",
2399 srcs: ["mylib.cpp"],
2400 shared_libs: ["mylib2"],
2401 system_shared_libs: [],
2402 stl: "none",
2403 apex_available: [
2404 "myapex",
2405 ],
2406 min_sdk_version: "29",
2407 }
2408
2409 // indirect part of the apex
2410 cc_library {
2411 name: "mylib2",
2412 srcs: ["mylib.cpp"],
2413 system_shared_libs: [],
2414 stl: "none",
2415 apex_available: [
2416 "myapex",
2417 ],
2418 min_sdk_version: "30",
2419 }
2420 `)
2421}
2422
2423func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2424 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2425 apex {
2426 name: "myapex",
2427 key: "myapex.key",
2428 apps: ["AppFoo"],
2429 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002430 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002431 }
2432
2433 apex_key {
2434 name: "myapex.key",
2435 public_key: "testkey.avbpubkey",
2436 private_key: "testkey.pem",
2437 }
2438
2439 android_app {
2440 name: "AppFoo",
2441 srcs: ["foo/bar/MyClass.java"],
2442 sdk_version: "current",
2443 min_sdk_version: "29",
2444 system_modules: "none",
2445 stl: "none",
2446 static_libs: ["bar"],
2447 apex_available: [ "myapex" ],
2448 }
2449
2450 java_library {
2451 name: "bar",
2452 sdk_version: "current",
2453 srcs: ["a.java"],
2454 apex_available: [ "myapex" ],
2455 }
2456 `)
2457}
2458
2459func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002460 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002461 apex {
2462 name: "myapex",
2463 key: "myapex.key",
2464 native_shared_libs: ["mylib"],
2465 min_sdk_version: "29",
2466 }
2467
2468 apex_key {
2469 name: "myapex.key",
2470 public_key: "testkey.avbpubkey",
2471 private_key: "testkey.pem",
2472 }
2473
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002474 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002475 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2476 cc_library {
2477 name: "mylib",
2478 srcs: ["mylib.cpp"],
2479 shared_libs: ["mylib2"],
2480 system_shared_libs: [],
2481 stl: "none",
2482 apex_available: ["myapex", "otherapex"],
2483 min_sdk_version: "29",
2484 }
2485
2486 cc_library {
2487 name: "mylib2",
2488 srcs: ["mylib.cpp"],
2489 system_shared_libs: [],
2490 stl: "none",
2491 apex_available: ["otherapex"],
2492 stubs: { versions: ["29", "30"] },
2493 min_sdk_version: "30",
2494 }
2495
2496 apex {
2497 name: "otherapex",
2498 key: "myapex.key",
2499 native_shared_libs: ["mylib", "mylib2"],
2500 min_sdk_version: "30",
2501 }
2502 `)
2503 expectLink := func(from, from_variant, to, to_variant string) {
2504 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2505 libFlags := ld.Args["libFlags"]
2506 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2507 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002508 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002509 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002510}
2511
Jooyung Haned124c32021-01-26 11:43:46 +09002512func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002513 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2514 func(variables android.FixtureProductVariables) {
2515 variables.Platform_sdk_codename = proptools.StringPtr("S")
2516 variables.Platform_version_active_codenames = []string{"S"}
2517 },
2518 )
Jooyung Haned124c32021-01-26 11:43:46 +09002519 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2520 apex {
2521 name: "myapex",
2522 key: "myapex.key",
2523 native_shared_libs: ["libfoo"],
2524 min_sdk_version: "S",
2525 }
2526 apex_key {
2527 name: "myapex.key",
2528 public_key: "testkey.avbpubkey",
2529 private_key: "testkey.pem",
2530 }
2531 cc_library {
2532 name: "libfoo",
2533 shared_libs: ["libbar"],
2534 apex_available: ["myapex"],
2535 min_sdk_version: "29",
2536 }
2537 cc_library {
2538 name: "libbar",
2539 apex_available: ["myapex"],
2540 }
2541 `, withSAsActiveCodeNames)
2542}
2543
2544func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002545 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2546 variables.Platform_sdk_codename = proptools.StringPtr("S")
2547 variables.Platform_version_active_codenames = []string{"S", "T"}
2548 })
Colin Cross1c460562021-02-16 17:55:47 -08002549 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002550 apex {
2551 name: "myapex",
2552 key: "myapex.key",
2553 native_shared_libs: ["libfoo"],
2554 min_sdk_version: "S",
2555 }
2556 apex_key {
2557 name: "myapex.key",
2558 public_key: "testkey.avbpubkey",
2559 private_key: "testkey.pem",
2560 }
2561 cc_library {
2562 name: "libfoo",
2563 shared_libs: ["libbar"],
2564 apex_available: ["myapex"],
2565 min_sdk_version: "S",
2566 }
2567 cc_library {
2568 name: "libbar",
2569 stubs: {
2570 symbol_file: "libbar.map.txt",
2571 versions: ["30", "S", "T"],
2572 },
2573 }
2574 `, withSAsActiveCodeNames)
2575
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002576 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002577 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2578 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002579 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002580}
2581
Jiyong Park7c2ee712018-12-07 00:42:25 +09002582func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002583 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002584 apex {
2585 name: "myapex",
2586 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002587 native_shared_libs: ["mylib"],
2588 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002589 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002590 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002591 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002592 }
2593
2594 apex_key {
2595 name: "myapex.key",
2596 public_key: "testkey.avbpubkey",
2597 private_key: "testkey.pem",
2598 }
2599
2600 prebuilt_etc {
2601 name: "myetc",
2602 src: "myprebuilt",
2603 sub_dir: "foo/bar",
2604 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002605
2606 cc_library {
2607 name: "mylib",
2608 srcs: ["mylib.cpp"],
2609 relative_install_path: "foo/bar",
2610 system_shared_libs: [],
2611 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002612 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002613 }
2614
2615 cc_binary {
2616 name: "mybin",
2617 srcs: ["mylib.cpp"],
2618 relative_install_path: "foo/bar",
2619 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002620 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002621 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002622 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002623 `)
2624
Sundong Ahnabb64432019-10-22 13:58:29 +09002625 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002626 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002627
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002628 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002629 ensureContains(t, cmd, "/etc ")
2630 ensureContains(t, cmd, "/etc/foo ")
2631 ensureContains(t, cmd, "/etc/foo/bar ")
2632 ensureContains(t, cmd, "/lib64 ")
2633 ensureContains(t, cmd, "/lib64/foo ")
2634 ensureContains(t, cmd, "/lib64/foo/bar ")
2635 ensureContains(t, cmd, "/lib ")
2636 ensureContains(t, cmd, "/lib/foo ")
2637 ensureContains(t, cmd, "/lib/foo/bar ")
2638 ensureContains(t, cmd, "/bin ")
2639 ensureContains(t, cmd, "/bin/foo ")
2640 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002641}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002642
Jooyung Han35155c42020-02-06 17:33:20 +09002643func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002644 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002645 apex {
2646 name: "myapex",
2647 key: "myapex.key",
2648 multilib: {
2649 both: {
2650 native_shared_libs: ["mylib"],
2651 binaries: ["mybin"],
2652 },
2653 },
2654 compile_multilib: "both",
2655 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002656 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002657 }
2658
2659 apex_key {
2660 name: "myapex.key",
2661 public_key: "testkey.avbpubkey",
2662 private_key: "testkey.pem",
2663 }
2664
2665 cc_library {
2666 name: "mylib",
2667 relative_install_path: "foo/bar",
2668 system_shared_libs: [],
2669 stl: "none",
2670 apex_available: [ "myapex" ],
2671 native_bridge_supported: true,
2672 }
2673
2674 cc_binary {
2675 name: "mybin",
2676 relative_install_path: "foo/bar",
2677 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002678 stl: "none",
2679 apex_available: [ "myapex" ],
2680 native_bridge_supported: true,
2681 compile_multilib: "both", // default is "first" for binary
2682 multilib: {
2683 lib64: {
2684 suffix: "64",
2685 },
2686 },
2687 }
2688 `, withNativeBridgeEnabled)
2689 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2690 "bin/foo/bar/mybin",
2691 "bin/foo/bar/mybin64",
2692 "bin/arm/foo/bar/mybin",
2693 "bin/arm64/foo/bar/mybin64",
2694 "lib/foo/bar/mylib.so",
2695 "lib/arm/foo/bar/mylib.so",
2696 "lib64/foo/bar/mylib.so",
2697 "lib64/arm64/foo/bar/mylib.so",
2698 })
2699}
2700
Jooyung Han85d61762020-06-24 23:50:26 +09002701func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002702 result := android.GroupFixturePreparers(
2703 prepareForApexTest,
2704 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2705 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002706 apex {
2707 name: "myapex",
2708 key: "myapex.key",
2709 binaries: ["mybin"],
2710 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002711 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002712 }
2713 apex_key {
2714 name: "myapex.key",
2715 public_key: "testkey.avbpubkey",
2716 private_key: "testkey.pem",
2717 }
2718 cc_binary {
2719 name: "mybin",
2720 vendor: true,
2721 shared_libs: ["libfoo"],
2722 }
2723 cc_library {
2724 name: "libfoo",
2725 proprietary: true,
2726 }
2727 `)
2728
Colin Crossc68db4b2021-11-11 18:59:15 -08002729 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002730 "bin/mybin",
2731 "lib64/libfoo.so",
2732 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2733 "lib64/libc++.so",
2734 })
2735
Colin Crossc68db4b2021-11-11 18:59:15 -08002736 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2737 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002738 name := apexBundle.BaseModuleName()
2739 prefix := "TARGET_"
2740 var builder strings.Builder
2741 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002742 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002743 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002744 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002745
Colin Crossc68db4b2021-11-11 18:59:15 -08002746 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002747 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2748 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002749}
2750
Jooyung Hanc5a96762022-02-04 11:54:50 +09002751func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2752 testApexError(t, `Trying to include a VNDK library`, `
2753 apex {
2754 name: "myapex",
2755 key: "myapex.key",
2756 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2757 vendor: true,
2758 use_vndk_as_stable: true,
2759 updatable: false,
2760 }
2761 apex_key {
2762 name: "myapex.key",
2763 public_key: "testkey.avbpubkey",
2764 private_key: "testkey.pem",
2765 }`)
2766}
2767
Jooyung Handf78e212020-07-22 15:54:47 +09002768func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002769 // myapex myapex2
2770 // | |
2771 // mybin ------. mybin2
2772 // \ \ / |
2773 // (stable) .---\--------` |
2774 // \ / \ |
2775 // \ / \ /
2776 // libvndk libvendor
2777 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002778 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002779 apex {
2780 name: "myapex",
2781 key: "myapex.key",
2782 binaries: ["mybin"],
2783 vendor: true,
2784 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002785 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002786 }
2787 apex_key {
2788 name: "myapex.key",
2789 public_key: "testkey.avbpubkey",
2790 private_key: "testkey.pem",
2791 }
2792 cc_binary {
2793 name: "mybin",
2794 vendor: true,
2795 shared_libs: ["libvndk", "libvendor"],
2796 }
2797 cc_library {
2798 name: "libvndk",
2799 vndk: {
2800 enabled: true,
2801 },
2802 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002803 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002804 }
2805 cc_library {
2806 name: "libvendor",
2807 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002808 stl: "none",
2809 }
2810 apex {
2811 name: "myapex2",
2812 key: "myapex.key",
2813 binaries: ["mybin2"],
2814 vendor: true,
2815 use_vndk_as_stable: false,
2816 updatable: false,
2817 }
2818 cc_binary {
2819 name: "mybin2",
2820 vendor: true,
2821 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002822 }
2823 `)
2824
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002825 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002826
Jooyung Han91f92032022-02-04 12:36:33 +09002827 for _, tc := range []struct {
2828 name string
2829 apexName string
2830 moduleName string
2831 moduleVariant string
2832 libs []string
2833 contents []string
2834 requireVndkNamespace bool
2835 }{
2836 {
2837 name: "use_vndk_as_stable",
2838 apexName: "myapex",
2839 moduleName: "mybin",
2840 moduleVariant: vendorVariant + "_apex10000",
2841 libs: []string{
2842 // should link with vendor variants of VNDK libs(libvndk/libc++)
2843 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2844 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2845 // unstable Vendor libs as APEX variant
2846 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2847 },
2848 contents: []string{
2849 "bin/mybin",
2850 "lib64/libvendor.so",
2851 // VNDK libs (libvndk/libc++) are not included
2852 },
2853 requireVndkNamespace: true,
2854 },
2855 {
2856 name: "!use_vndk_as_stable",
2857 apexName: "myapex2",
2858 moduleName: "mybin2",
2859 moduleVariant: vendorVariant + "_myapex2",
2860 libs: []string{
2861 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2862 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2863 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2864 // unstable vendor libs have "merged" APEX variants
2865 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2866 },
2867 contents: []string{
2868 "bin/mybin2",
2869 "lib64/libvendor.so",
2870 // VNDK libs are included as well
2871 "lib64/libvndk.so",
2872 "lib64/libc++.so",
2873 },
2874 requireVndkNamespace: false,
2875 },
2876 } {
2877 t.Run(tc.name, func(t *testing.T) {
2878 // Check linked libs
2879 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2880 libs := names(ldRule.Args["libFlags"])
2881 for _, lib := range tc.libs {
2882 ensureListContains(t, libs, lib)
2883 }
2884 // Check apex contents
2885 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002886
Jooyung Han91f92032022-02-04 12:36:33 +09002887 // Check "requireNativeLibs"
2888 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2889 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2890 if tc.requireVndkNamespace {
2891 ensureListContains(t, requireNativeLibs, ":vndk")
2892 } else {
2893 ensureListNotContains(t, requireNativeLibs, ":vndk")
2894 }
2895 })
2896 }
Jooyung Handf78e212020-07-22 15:54:47 +09002897}
2898
Justin Yun13decfb2021-03-08 19:25:55 +09002899func TestProductVariant(t *testing.T) {
2900 ctx := testApex(t, `
2901 apex {
2902 name: "myapex",
2903 key: "myapex.key",
2904 updatable: false,
2905 product_specific: true,
2906 binaries: ["foo"],
2907 }
2908
2909 apex_key {
2910 name: "myapex.key",
2911 public_key: "testkey.avbpubkey",
2912 private_key: "testkey.pem",
2913 }
2914
2915 cc_binary {
2916 name: "foo",
2917 product_available: true,
2918 apex_available: ["myapex"],
2919 srcs: ["foo.cpp"],
2920 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002921 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2922 variables.ProductVndkVersion = proptools.StringPtr("current")
2923 }),
2924 )
Justin Yun13decfb2021-03-08 19:25:55 +09002925
2926 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002927 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002928 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2929 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2930 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2931 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2932}
2933
Jooyung Han8e5685d2020-09-21 11:02:57 +09002934func TestApex_withPrebuiltFirmware(t *testing.T) {
2935 testCases := []struct {
2936 name string
2937 additionalProp string
2938 }{
2939 {"system apex with prebuilt_firmware", ""},
2940 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2941 }
2942 for _, tc := range testCases {
2943 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002944 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002945 apex {
2946 name: "myapex",
2947 key: "myapex.key",
2948 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002949 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002950 `+tc.additionalProp+`
2951 }
2952 apex_key {
2953 name: "myapex.key",
2954 public_key: "testkey.avbpubkey",
2955 private_key: "testkey.pem",
2956 }
2957 prebuilt_firmware {
2958 name: "myfirmware",
2959 src: "myfirmware.bin",
2960 filename_from_src: true,
2961 `+tc.additionalProp+`
2962 }
2963 `)
2964 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2965 "etc/firmware/myfirmware.bin",
2966 })
2967 })
2968 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002969}
2970
Jooyung Hanefb184e2020-06-25 17:14:25 +09002971func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002972 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002973 apex {
2974 name: "myapex",
2975 key: "myapex.key",
2976 vendor: true,
2977 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002978 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002979 }
2980
2981 apex_key {
2982 name: "myapex.key",
2983 public_key: "testkey.avbpubkey",
2984 private_key: "testkey.pem",
2985 }
2986
2987 cc_library {
2988 name: "mylib",
2989 vendor_available: true,
2990 }
2991 `)
2992
2993 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002994 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002995 name := apexBundle.BaseModuleName()
2996 prefix := "TARGET_"
2997 var builder strings.Builder
2998 data.Custom(&builder, name, prefix, "", data)
2999 androidMk := builder.String()
3000 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
3001}
3002
Jooyung Han2ed99d02020-06-24 23:26:26 +09003003func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003004 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003005 apex {
3006 name: "myapex",
3007 key: "myapex.key",
3008 vintf_fragments: ["fragment.xml"],
3009 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003010 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003011 }
3012 apex_key {
3013 name: "myapex.key",
3014 public_key: "testkey.avbpubkey",
3015 private_key: "testkey.pem",
3016 }
3017 cc_binary {
3018 name: "mybin",
3019 }
3020 `)
3021
3022 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003023 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003024 name := apexBundle.BaseModuleName()
3025 prefix := "TARGET_"
3026 var builder strings.Builder
3027 data.Custom(&builder, name, prefix, "", data)
3028 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003029 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003030 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003031}
3032
Jiyong Park16e91a02018-12-20 18:18:08 +09003033func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003034 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003035 apex {
3036 name: "myapex",
3037 key: "myapex.key",
3038 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003039 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003040 }
3041
3042 apex_key {
3043 name: "myapex.key",
3044 public_key: "testkey.avbpubkey",
3045 private_key: "testkey.pem",
3046 }
3047
3048 cc_library {
3049 name: "mylib",
3050 srcs: ["mylib.cpp"],
3051 system_shared_libs: [],
3052 stl: "none",
3053 stubs: {
3054 versions: ["1", "2", "3"],
3055 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003056 apex_available: [
3057 "//apex_available:platform",
3058 "myapex",
3059 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003060 }
3061
3062 cc_binary {
3063 name: "not_in_apex",
3064 srcs: ["mylib.cpp"],
3065 static_libs: ["mylib"],
3066 static_executable: true,
3067 system_shared_libs: [],
3068 stl: "none",
3069 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003070 `)
3071
Colin Cross7113d202019-11-20 16:39:12 -08003072 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003073
3074 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003075 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003076}
Jiyong Park9335a262018-12-24 11:31:58 +09003077
3078func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003079 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003080 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003081 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003082 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003083 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003084 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003085 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003086 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003087 }
3088
3089 cc_library {
3090 name: "mylib",
3091 srcs: ["mylib.cpp"],
3092 system_shared_libs: [],
3093 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003094 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003095 }
3096
3097 apex_key {
3098 name: "myapex.key",
3099 public_key: "testkey.avbpubkey",
3100 private_key: "testkey.pem",
3101 }
3102
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003103 android_app_certificate {
3104 name: "myapex.certificate",
3105 certificate: "testkey",
3106 }
3107
3108 android_app_certificate {
3109 name: "myapex.certificate.override",
3110 certificate: "testkey.override",
3111 }
3112
Jiyong Park9335a262018-12-24 11:31:58 +09003113 `)
3114
3115 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003116 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003117
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003118 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3119 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003120 "vendor/foo/devkeys/testkey.avbpubkey")
3121 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003122 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3123 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003124 "vendor/foo/devkeys/testkey.pem")
3125 }
3126
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003127 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003128 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003129 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003130 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003131 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003132 }
3133}
Jiyong Park58e364a2019-01-19 19:24:06 +09003134
Jooyung Hanf121a652019-12-17 14:30:11 +09003135func TestCertificate(t *testing.T) {
3136 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003137 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003138 apex {
3139 name: "myapex",
3140 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003141 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003142 }
3143 apex_key {
3144 name: "myapex.key",
3145 public_key: "testkey.avbpubkey",
3146 private_key: "testkey.pem",
3147 }`)
3148 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3149 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3150 if actual := rule.Args["certificates"]; actual != expected {
3151 t.Errorf("certificates should be %q, not %q", expected, actual)
3152 }
3153 })
3154 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003155 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003156 apex {
3157 name: "myapex_keytest",
3158 key: "myapex.key",
3159 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003160 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003161 }
3162 apex_key {
3163 name: "myapex.key",
3164 public_key: "testkey.avbpubkey",
3165 private_key: "testkey.pem",
3166 }
3167 android_app_certificate {
3168 name: "myapex.certificate.override",
3169 certificate: "testkey.override",
3170 }`)
3171 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3172 expected := "testkey.override.x509.pem testkey.override.pk8"
3173 if actual := rule.Args["certificates"]; actual != expected {
3174 t.Errorf("certificates should be %q, not %q", expected, actual)
3175 }
3176 })
3177 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003178 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003179 apex {
3180 name: "myapex",
3181 key: "myapex.key",
3182 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003183 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003184 }
3185 apex_key {
3186 name: "myapex.key",
3187 public_key: "testkey.avbpubkey",
3188 private_key: "testkey.pem",
3189 }
3190 android_app_certificate {
3191 name: "myapex.certificate",
3192 certificate: "testkey",
3193 }`)
3194 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3195 expected := "testkey.x509.pem testkey.pk8"
3196 if actual := rule.Args["certificates"]; actual != expected {
3197 t.Errorf("certificates should be %q, not %q", expected, actual)
3198 }
3199 })
3200 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003201 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003202 apex {
3203 name: "myapex_keytest",
3204 key: "myapex.key",
3205 file_contexts: ":myapex-file_contexts",
3206 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003207 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003208 }
3209 apex_key {
3210 name: "myapex.key",
3211 public_key: "testkey.avbpubkey",
3212 private_key: "testkey.pem",
3213 }
3214 android_app_certificate {
3215 name: "myapex.certificate.override",
3216 certificate: "testkey.override",
3217 }`)
3218 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3219 expected := "testkey.override.x509.pem testkey.override.pk8"
3220 if actual := rule.Args["certificates"]; actual != expected {
3221 t.Errorf("certificates should be %q, not %q", expected, actual)
3222 }
3223 })
3224 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003225 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003226 apex {
3227 name: "myapex",
3228 key: "myapex.key",
3229 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003230 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003231 }
3232 apex_key {
3233 name: "myapex.key",
3234 public_key: "testkey.avbpubkey",
3235 private_key: "testkey.pem",
3236 }`)
3237 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3238 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3239 if actual := rule.Args["certificates"]; actual != expected {
3240 t.Errorf("certificates should be %q, not %q", expected, actual)
3241 }
3242 })
3243 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003244 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003245 apex {
3246 name: "myapex_keytest",
3247 key: "myapex.key",
3248 file_contexts: ":myapex-file_contexts",
3249 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003250 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003251 }
3252 apex_key {
3253 name: "myapex.key",
3254 public_key: "testkey.avbpubkey",
3255 private_key: "testkey.pem",
3256 }
3257 android_app_certificate {
3258 name: "myapex.certificate.override",
3259 certificate: "testkey.override",
3260 }`)
3261 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3262 expected := "testkey.override.x509.pem testkey.override.pk8"
3263 if actual := rule.Args["certificates"]; actual != expected {
3264 t.Errorf("certificates should be %q, not %q", expected, actual)
3265 }
3266 })
3267}
3268
Jiyong Park58e364a2019-01-19 19:24:06 +09003269func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003270 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003271 apex {
3272 name: "myapex",
3273 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003274 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003275 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003276 }
3277
3278 apex {
3279 name: "otherapex",
3280 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003281 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003282 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003283 }
3284
3285 apex_key {
3286 name: "myapex.key",
3287 public_key: "testkey.avbpubkey",
3288 private_key: "testkey.pem",
3289 }
3290
3291 cc_library {
3292 name: "mylib",
3293 srcs: ["mylib.cpp"],
3294 system_shared_libs: [],
3295 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003296 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003297 "myapex",
3298 "otherapex",
3299 ],
Jooyung Han24282772020-03-21 23:20:55 +09003300 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003301 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003302 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003303 cc_library {
3304 name: "mylib2",
3305 srcs: ["mylib.cpp"],
3306 system_shared_libs: [],
3307 stl: "none",
3308 apex_available: [
3309 "myapex",
3310 "otherapex",
3311 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003312 static_libs: ["mylib3"],
3313 recovery_available: true,
3314 min_sdk_version: "29",
3315 }
3316 cc_library {
3317 name: "mylib3",
3318 srcs: ["mylib.cpp"],
3319 system_shared_libs: [],
3320 stl: "none",
3321 apex_available: [
3322 "myapex",
3323 "otherapex",
3324 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003325 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003326 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003327 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003328 `)
3329
Jooyung Hanc87a0592020-03-02 17:44:33 +09003330 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003331 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003332 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003333 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003334
Jooyung Hanccce2f22020-03-07 03:45:53 +09003335 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003336 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003337 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003338 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003339
Jooyung Hanccce2f22020-03-07 03:45:53 +09003340 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003341 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003342 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003343 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003344
Colin Crossaede88c2020-08-11 12:17:01 -07003345 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3346 // each variant defines additional macros to distinguish which apex variant it is built for
3347
3348 // non-APEX variant does not have __ANDROID_APEX__ defined
3349 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3350 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3351
Dan Albertb19953d2020-11-17 15:29:36 -08003352 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003353 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3354 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003355 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003356
Jooyung Hanc87a0592020-03-02 17:44:33 +09003357 // non-APEX variant does not have __ANDROID_APEX__ defined
3358 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3359 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3360
Dan Albertb19953d2020-11-17 15:29:36 -08003361 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003362 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003363 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003364 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003365}
Jiyong Park7e636d02019-01-28 16:16:54 +09003366
3367func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003368 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003369 apex {
3370 name: "myapex",
3371 key: "myapex.key",
3372 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003373 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003374 }
3375
3376 apex_key {
3377 name: "myapex.key",
3378 public_key: "testkey.avbpubkey",
3379 private_key: "testkey.pem",
3380 }
3381
3382 cc_library_headers {
3383 name: "mylib_headers",
3384 export_include_dirs: ["my_include"],
3385 system_shared_libs: [],
3386 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003387 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003388 }
3389
3390 cc_library {
3391 name: "mylib",
3392 srcs: ["mylib.cpp"],
3393 system_shared_libs: [],
3394 stl: "none",
3395 header_libs: ["mylib_headers"],
3396 export_header_lib_headers: ["mylib_headers"],
3397 stubs: {
3398 versions: ["1", "2", "3"],
3399 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003400 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003401 }
3402
3403 cc_library {
3404 name: "otherlib",
3405 srcs: ["mylib.cpp"],
3406 system_shared_libs: [],
3407 stl: "none",
3408 shared_libs: ["mylib"],
3409 }
3410 `)
3411
Colin Cross7113d202019-11-20 16:39:12 -08003412 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003413
3414 // Ensure that the include path of the header lib is exported to 'otherlib'
3415 ensureContains(t, cFlags, "-Imy_include")
3416}
Alex Light9670d332019-01-29 18:07:33 -08003417
Jiyong Park7cd10e32020-01-14 09:22:18 +09003418type fileInApex struct {
3419 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003420 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003421 isLink bool
3422}
3423
Jooyung Hana57af4a2020-01-23 05:36:59 +00003424func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003425 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003426 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003427 copyCmds := apexRule.Args["copy_commands"]
3428 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003429 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003430 for _, cmd := range strings.Split(copyCmds, "&&") {
3431 cmd = strings.TrimSpace(cmd)
3432 if cmd == "" {
3433 continue
3434 }
3435 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003436 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003437 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003438 switch terms[0] {
3439 case "mkdir":
3440 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003441 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003442 t.Fatal("copyCmds contains invalid cp command", cmd)
3443 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003444 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003445 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003446 isLink = false
3447 case "ln":
3448 if len(terms) != 3 && len(terms) != 4 {
3449 // ln LINK TARGET or ln -s LINK TARGET
3450 t.Fatal("copyCmds contains invalid ln command", cmd)
3451 }
3452 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003453 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003454 isLink = true
3455 default:
3456 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3457 }
3458 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003459 index := strings.Index(dst, imageApexDir)
3460 if index == -1 {
3461 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3462 }
3463 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003464 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003465 }
3466 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003467 return ret
3468}
3469
Jooyung Hana57af4a2020-01-23 05:36:59 +00003470func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3471 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003472 var failed bool
3473 var surplus []string
3474 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003475 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003476 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003477 for _, expected := range files {
3478 if matched, _ := path.Match(expected, file.path); matched {
3479 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003480 mactchFound = true
3481 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003482 }
3483 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003484 if !mactchFound {
3485 surplus = append(surplus, file.path)
3486 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003487 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003488
Jooyung Han31c470b2019-10-18 16:26:59 +09003489 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003490 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003491 t.Log("surplus files", surplus)
3492 failed = true
3493 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003494
3495 if len(files) > len(filesMatched) {
3496 var missing []string
3497 for _, expected := range files {
3498 if !filesMatched[expected] {
3499 missing = append(missing, expected)
3500 }
3501 }
3502 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003503 t.Log("missing files", missing)
3504 failed = true
3505 }
3506 if failed {
3507 t.Fail()
3508 }
3509}
3510
Jooyung Han344d5432019-08-23 11:17:39 +09003511func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003512 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003513 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003514 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003515 "etc/llndk.libraries.29.txt",
3516 "etc/vndkcore.libraries.29.txt",
3517 "etc/vndksp.libraries.29.txt",
3518 "etc/vndkprivate.libraries.29.txt",
3519 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003520 }
3521 testCases := []struct {
3522 vndkVersion string
3523 expectedFiles []string
3524 }{
3525 {
3526 vndkVersion: "current",
3527 expectedFiles: append(commonFiles,
3528 "lib/libvndk.so",
3529 "lib/libvndksp.so",
3530 "lib64/libvndk.so",
3531 "lib64/libvndksp.so"),
3532 },
3533 {
3534 vndkVersion: "",
3535 expectedFiles: append(commonFiles,
3536 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3537 "lib/libvndksp.so",
3538 "lib64/libvndksp.so"),
3539 },
3540 }
3541 for _, tc := range testCases {
3542 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3543 ctx := testApex(t, `
3544 apex_vndk {
3545 name: "com.android.vndk.current",
3546 key: "com.android.vndk.current.key",
3547 updatable: false,
3548 }
3549
3550 apex_key {
3551 name: "com.android.vndk.current.key",
3552 public_key: "testkey.avbpubkey",
3553 private_key: "testkey.pem",
3554 }
3555
3556 cc_library {
3557 name: "libvndk",
3558 srcs: ["mylib.cpp"],
3559 vendor_available: true,
3560 product_available: true,
3561 vndk: {
3562 enabled: true,
3563 },
3564 system_shared_libs: [],
3565 stl: "none",
3566 apex_available: [ "com.android.vndk.current" ],
3567 }
3568
3569 cc_library {
3570 name: "libvndksp",
3571 srcs: ["mylib.cpp"],
3572 vendor_available: true,
3573 product_available: true,
3574 vndk: {
3575 enabled: true,
3576 support_system_process: true,
3577 },
3578 system_shared_libs: [],
3579 stl: "none",
3580 apex_available: [ "com.android.vndk.current" ],
3581 }
3582
3583 // VNDK-Ext should not cause any problems
3584
3585 cc_library {
3586 name: "libvndk.ext",
3587 srcs: ["mylib2.cpp"],
3588 vendor: true,
3589 vndk: {
3590 enabled: true,
3591 extends: "libvndk",
3592 },
3593 system_shared_libs: [],
3594 stl: "none",
3595 }
3596
3597 cc_library {
3598 name: "libvndksp.ext",
3599 srcs: ["mylib2.cpp"],
3600 vendor: true,
3601 vndk: {
3602 enabled: true,
3603 support_system_process: true,
3604 extends: "libvndksp",
3605 },
3606 system_shared_libs: [],
3607 stl: "none",
3608 }
3609 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3610 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3611 }))
3612 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3613 })
3614 }
Jooyung Han344d5432019-08-23 11:17:39 +09003615}
3616
3617func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003618 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003619 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003620 name: "com.android.vndk.current",
3621 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003622 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003623 }
3624
3625 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003626 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003627 public_key: "testkey.avbpubkey",
3628 private_key: "testkey.pem",
3629 }
3630
3631 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003632 name: "libvndk",
3633 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003634 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003635 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003636 vndk: {
3637 enabled: true,
3638 },
3639 system_shared_libs: [],
3640 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003641 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003642 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003643
3644 cc_prebuilt_library_shared {
3645 name: "libvndk.arm",
3646 srcs: ["libvndk.arm.so"],
3647 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003648 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003649 vndk: {
3650 enabled: true,
3651 },
3652 enabled: false,
3653 arch: {
3654 arm: {
3655 enabled: true,
3656 },
3657 },
3658 system_shared_libs: [],
3659 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003660 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003661 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003662 `+vndkLibrariesTxtFiles("current"),
3663 withFiles(map[string][]byte{
3664 "libvndk.so": nil,
3665 "libvndk.arm.so": nil,
3666 }))
Colin Cross2807f002021-03-02 10:15:29 -08003667 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003668 "lib/libvndk.so",
3669 "lib/libvndk.arm.so",
3670 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003671 "lib/libc++.so",
3672 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003673 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003674 })
Jooyung Han344d5432019-08-23 11:17:39 +09003675}
3676
Jooyung Han39edb6c2019-11-06 16:53:07 +09003677func vndkLibrariesTxtFiles(vers ...string) (result string) {
3678 for _, v := range vers {
3679 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003680 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003681 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003682 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003683 name: "` + txt + `.libraries.txt",
3684 }
3685 `
3686 }
3687 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003688 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003689 result += `
3690 prebuilt_etc {
3691 name: "` + txt + `.libraries.` + v + `.txt",
3692 src: "dummy.txt",
3693 }
3694 `
3695 }
3696 }
3697 }
3698 return
3699}
3700
Jooyung Han344d5432019-08-23 11:17:39 +09003701func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003702 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003703 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003704 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003705 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003706 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003707 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003708 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003709 }
3710
3711 apex_key {
3712 name: "myapex.key",
3713 public_key: "testkey.avbpubkey",
3714 private_key: "testkey.pem",
3715 }
3716
Jooyung Han31c470b2019-10-18 16:26:59 +09003717 vndk_prebuilt_shared {
3718 name: "libvndk27",
3719 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003720 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003721 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003722 vndk: {
3723 enabled: true,
3724 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003725 target_arch: "arm64",
3726 arch: {
3727 arm: {
3728 srcs: ["libvndk27_arm.so"],
3729 },
3730 arm64: {
3731 srcs: ["libvndk27_arm64.so"],
3732 },
3733 },
Colin Cross2807f002021-03-02 10:15:29 -08003734 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003735 }
3736
3737 vndk_prebuilt_shared {
3738 name: "libvndk27",
3739 version: "27",
3740 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003741 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003742 vndk: {
3743 enabled: true,
3744 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003745 target_arch: "x86_64",
3746 arch: {
3747 x86: {
3748 srcs: ["libvndk27_x86.so"],
3749 },
3750 x86_64: {
3751 srcs: ["libvndk27_x86_64.so"],
3752 },
3753 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003754 }
3755 `+vndkLibrariesTxtFiles("27"),
3756 withFiles(map[string][]byte{
3757 "libvndk27_arm.so": nil,
3758 "libvndk27_arm64.so": nil,
3759 "libvndk27_x86.so": nil,
3760 "libvndk27_x86_64.so": nil,
3761 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003762
Colin Cross2807f002021-03-02 10:15:29 -08003763 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003764 "lib/libvndk27_arm.so",
3765 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003766 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003767 })
Jooyung Han344d5432019-08-23 11:17:39 +09003768}
3769
Jooyung Han90eee022019-10-01 20:02:42 +09003770func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003771 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003772 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003773 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003774 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003775 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003776 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003777 }
3778 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003779 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003780 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003781 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003782 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003783 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003784 }
3785 apex_key {
3786 name: "myapex.key",
3787 public_key: "testkey.avbpubkey",
3788 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003789 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003790
3791 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003792 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003793 actual := proptools.String(bundle.properties.Apex_name)
3794 if !reflect.DeepEqual(actual, expected) {
3795 t.Errorf("Got '%v', expected '%v'", actual, expected)
3796 }
3797 }
3798
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003799 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003800 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003801}
3802
Jooyung Han344d5432019-08-23 11:17:39 +09003803func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003804 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003805 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003806 name: "com.android.vndk.current",
3807 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003808 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003809 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003810 }
3811
3812 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003813 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003814 public_key: "testkey.avbpubkey",
3815 private_key: "testkey.pem",
3816 }
3817
3818 cc_library {
3819 name: "libvndk",
3820 srcs: ["mylib.cpp"],
3821 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003822 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003823 native_bridge_supported: true,
3824 host_supported: true,
3825 vndk: {
3826 enabled: true,
3827 },
3828 system_shared_libs: [],
3829 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003830 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003831 }
Colin Cross2807f002021-03-02 10:15:29 -08003832 `+vndkLibrariesTxtFiles("current"),
3833 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003834
Colin Cross2807f002021-03-02 10:15:29 -08003835 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003836 "lib/libvndk.so",
3837 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003838 "lib/libc++.so",
3839 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003840 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003841 })
Jooyung Han344d5432019-08-23 11:17:39 +09003842}
3843
3844func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003845 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003846 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003847 name: "com.android.vndk.current",
3848 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003849 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003850 native_bridge_supported: true,
3851 }
3852
3853 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003854 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003855 public_key: "testkey.avbpubkey",
3856 private_key: "testkey.pem",
3857 }
3858
3859 cc_library {
3860 name: "libvndk",
3861 srcs: ["mylib.cpp"],
3862 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003863 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003864 native_bridge_supported: true,
3865 host_supported: true,
3866 vndk: {
3867 enabled: true,
3868 },
3869 system_shared_libs: [],
3870 stl: "none",
3871 }
3872 `)
3873}
3874
Jooyung Han31c470b2019-10-18 16:26:59 +09003875func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003876 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003877 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003878 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003879 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003880 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003881 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003882 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003883 }
3884
3885 apex_key {
3886 name: "myapex.key",
3887 public_key: "testkey.avbpubkey",
3888 private_key: "testkey.pem",
3889 }
3890
3891 vndk_prebuilt_shared {
3892 name: "libvndk27",
3893 version: "27",
3894 target_arch: "arm",
3895 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003896 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003897 vndk: {
3898 enabled: true,
3899 },
3900 arch: {
3901 arm: {
3902 srcs: ["libvndk27.so"],
3903 }
3904 },
3905 }
3906
3907 vndk_prebuilt_shared {
3908 name: "libvndk27",
3909 version: "27",
3910 target_arch: "arm",
3911 binder32bit: true,
3912 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003913 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003914 vndk: {
3915 enabled: true,
3916 },
3917 arch: {
3918 arm: {
3919 srcs: ["libvndk27binder32.so"],
3920 }
3921 },
Colin Cross2807f002021-03-02 10:15:29 -08003922 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003923 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003924 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003925 withFiles(map[string][]byte{
3926 "libvndk27.so": nil,
3927 "libvndk27binder32.so": nil,
3928 }),
3929 withBinder32bit,
3930 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003931 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003932 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3933 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003934 },
3935 }),
3936 )
3937
Colin Cross2807f002021-03-02 10:15:29 -08003938 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003939 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003940 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003941 })
3942}
3943
Jooyung Han45a96772020-06-15 14:59:42 +09003944func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003945 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003946 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003947 name: "com.android.vndk.current",
3948 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003949 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003950 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003951 }
3952
3953 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003954 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003955 public_key: "testkey.avbpubkey",
3956 private_key: "testkey.pem",
3957 }
3958
3959 cc_library {
3960 name: "libz",
3961 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003962 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003963 vndk: {
3964 enabled: true,
3965 },
3966 stubs: {
3967 symbol_file: "libz.map.txt",
3968 versions: ["30"],
3969 }
3970 }
3971 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3972 "libz.map.txt": nil,
3973 }))
3974
Colin Cross2807f002021-03-02 10:15:29 -08003975 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003976 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3977 ensureListEmpty(t, provideNativeLibs)
3978}
3979
Jooyung Hane1633032019-08-01 17:41:43 +09003980func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003981 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003982 apex {
3983 name: "myapex_nodep",
3984 key: "myapex.key",
3985 native_shared_libs: ["lib_nodep"],
3986 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003987 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003988 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003989 }
3990
3991 apex {
3992 name: "myapex_dep",
3993 key: "myapex.key",
3994 native_shared_libs: ["lib_dep"],
3995 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003996 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003997 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003998 }
3999
4000 apex {
4001 name: "myapex_provider",
4002 key: "myapex.key",
4003 native_shared_libs: ["libfoo"],
4004 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004005 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004006 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004007 }
4008
4009 apex {
4010 name: "myapex_selfcontained",
4011 key: "myapex.key",
4012 native_shared_libs: ["lib_dep", "libfoo"],
4013 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004014 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004015 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004016 }
4017
4018 apex_key {
4019 name: "myapex.key",
4020 public_key: "testkey.avbpubkey",
4021 private_key: "testkey.pem",
4022 }
4023
4024 cc_library {
4025 name: "lib_nodep",
4026 srcs: ["mylib.cpp"],
4027 system_shared_libs: [],
4028 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004029 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004030 }
4031
4032 cc_library {
4033 name: "lib_dep",
4034 srcs: ["mylib.cpp"],
4035 shared_libs: ["libfoo"],
4036 system_shared_libs: [],
4037 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004038 apex_available: [
4039 "myapex_dep",
4040 "myapex_provider",
4041 "myapex_selfcontained",
4042 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004043 }
4044
4045 cc_library {
4046 name: "libfoo",
4047 srcs: ["mytest.cpp"],
4048 stubs: {
4049 versions: ["1"],
4050 },
4051 system_shared_libs: [],
4052 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004053 apex_available: [
4054 "myapex_provider",
4055 "myapex_selfcontained",
4056 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004057 }
4058 `)
4059
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004060 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004061 var provideNativeLibs, requireNativeLibs []string
4062
Sundong Ahnabb64432019-10-22 13:58:29 +09004063 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004064 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4065 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004066 ensureListEmpty(t, provideNativeLibs)
4067 ensureListEmpty(t, requireNativeLibs)
4068
Sundong Ahnabb64432019-10-22 13:58:29 +09004069 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004070 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4071 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004072 ensureListEmpty(t, provideNativeLibs)
4073 ensureListContains(t, requireNativeLibs, "libfoo.so")
4074
Sundong Ahnabb64432019-10-22 13:58:29 +09004075 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004076 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4077 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004078 ensureListContains(t, provideNativeLibs, "libfoo.so")
4079 ensureListEmpty(t, requireNativeLibs)
4080
Sundong Ahnabb64432019-10-22 13:58:29 +09004081 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004082 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4083 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004084 ensureListContains(t, provideNativeLibs, "libfoo.so")
4085 ensureListEmpty(t, requireNativeLibs)
4086}
4087
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004088func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004089 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004090 apex {
4091 name: "myapex",
4092 key: "myapex.key",
4093 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004094 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004095 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004096 }
4097
4098 apex_key {
4099 name: "myapex.key",
4100 public_key: "testkey.avbpubkey",
4101 private_key: "testkey.pem",
4102 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004103
4104 cc_library {
4105 name: "mylib",
4106 srcs: ["mylib.cpp"],
4107 system_shared_libs: [],
4108 stl: "none",
4109 apex_available: [
4110 "//apex_available:platform",
4111 "myapex",
4112 ],
4113 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004114 `)
4115
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004116 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004117 apexManifestRule := module.Rule("apexManifestRule")
4118 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4119 apexRule := module.Rule("apexRule")
4120 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004121
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004122 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004123 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004124 name := apexBundle.BaseModuleName()
4125 prefix := "TARGET_"
4126 var builder strings.Builder
4127 data.Custom(&builder, name, prefix, "", data)
4128 androidMk := builder.String()
Prerana Patilb1896c82022-11-09 18:14:34 +00004129 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Parkdb334862020-02-05 17:19:28 +09004130 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004131}
4132
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004133func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4134 ctx := testApex(t, `
4135 apex {
4136 name: "myapex",
4137 key: "myapex.key",
4138 apex_name: "com.android.myapex",
4139 native_shared_libs: ["mylib"],
4140 updatable: false,
4141 }
4142
4143 apex_key {
4144 name: "myapex.key",
4145 public_key: "testkey.avbpubkey",
4146 private_key: "testkey.pem",
4147 }
4148
4149 cc_library {
4150 name: "mylib",
4151 srcs: ["mylib.cpp"],
4152 system_shared_libs: [],
4153 stl: "none",
4154 apex_available: [
4155 "//apex_available:platform",
4156 "myapex",
4157 ],
4158 }
4159 `, android.FixtureMergeEnv(map[string]string{
4160 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4161 }))
4162
4163 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
4164 apexManifestRule := module.Rule("apexManifestRule")
4165 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4166}
4167
Vinh Tran8f5310f2022-10-07 18:16:47 -04004168func TestCompileMultilibProp(t *testing.T) {
4169 testCases := []struct {
4170 compileMultiLibProp string
4171 containedLibs []string
4172 notContainedLibs []string
4173 }{
4174 {
4175 containedLibs: []string{
4176 "image.apex/lib64/mylib.so",
4177 "image.apex/lib/mylib.so",
4178 },
4179 compileMultiLibProp: `compile_multilib: "both",`,
4180 },
4181 {
4182 containedLibs: []string{"image.apex/lib64/mylib.so"},
4183 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4184 compileMultiLibProp: `compile_multilib: "first",`,
4185 },
4186 {
4187 containedLibs: []string{"image.apex/lib64/mylib.so"},
4188 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4189 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4190 },
4191 {
4192 containedLibs: []string{"image.apex/lib64/mylib.so"},
4193 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4194 compileMultiLibProp: `compile_multilib: "64",`,
4195 },
4196 {
4197 containedLibs: []string{"image.apex/lib/mylib.so"},
4198 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4199 compileMultiLibProp: `compile_multilib: "32",`,
4200 },
4201 }
4202 for _, testCase := range testCases {
4203 ctx := testApex(t, fmt.Sprintf(`
4204 apex {
4205 name: "myapex",
4206 key: "myapex.key",
4207 %s
4208 native_shared_libs: ["mylib"],
4209 updatable: false,
4210 }
4211 apex_key {
4212 name: "myapex.key",
4213 public_key: "testkey.avbpubkey",
4214 private_key: "testkey.pem",
4215 }
4216 cc_library {
4217 name: "mylib",
4218 srcs: ["mylib.cpp"],
4219 apex_available: [
4220 "//apex_available:platform",
4221 "myapex",
4222 ],
4223 }
4224 `, testCase.compileMultiLibProp),
4225 )
4226 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4227 apexRule := module.Rule("apexRule")
4228 copyCmds := apexRule.Args["copy_commands"]
4229 for _, containedLib := range testCase.containedLibs {
4230 ensureContains(t, copyCmds, containedLib)
4231 }
4232 for _, notContainedLib := range testCase.notContainedLibs {
4233 ensureNotContains(t, copyCmds, notContainedLib)
4234 }
4235 }
4236}
4237
Alex Light0851b882019-02-07 13:20:53 -08004238func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004239 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004240 apex {
4241 name: "myapex",
4242 key: "myapex.key",
4243 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004244 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004245 }
4246
4247 apex_key {
4248 name: "myapex.key",
4249 public_key: "testkey.avbpubkey",
4250 private_key: "testkey.pem",
4251 }
4252
4253 cc_library {
4254 name: "mylib_common",
4255 srcs: ["mylib.cpp"],
4256 system_shared_libs: [],
4257 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004258 apex_available: [
4259 "//apex_available:platform",
4260 "myapex",
4261 ],
Alex Light0851b882019-02-07 13:20:53 -08004262 }
4263 `)
4264
Sundong Ahnabb64432019-10-22 13:58:29 +09004265 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004266 apexRule := module.Rule("apexRule")
4267 copyCmds := apexRule.Args["copy_commands"]
4268
4269 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4270 t.Log("Apex was a test apex!")
4271 t.Fail()
4272 }
4273 // Ensure that main rule creates an output
4274 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4275
4276 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004277 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004278
4279 // Ensure that both direct and indirect deps are copied into apex
4280 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4281
Colin Cross7113d202019-11-20 16:39:12 -08004282 // Ensure that the platform variant ends with _shared
4283 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004284
Colin Cross56a83212020-09-15 18:30:11 -07004285 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004286 t.Log("Found mylib_common not in any apex!")
4287 t.Fail()
4288 }
4289}
4290
4291func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004292 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004293 apex_test {
4294 name: "myapex",
4295 key: "myapex.key",
4296 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004297 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004298 }
4299
4300 apex_key {
4301 name: "myapex.key",
4302 public_key: "testkey.avbpubkey",
4303 private_key: "testkey.pem",
4304 }
4305
4306 cc_library {
4307 name: "mylib_common_test",
4308 srcs: ["mylib.cpp"],
4309 system_shared_libs: [],
4310 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004311 // TODO: remove //apex_available:platform
4312 apex_available: [
4313 "//apex_available:platform",
4314 "myapex",
4315 ],
Alex Light0851b882019-02-07 13:20:53 -08004316 }
4317 `)
4318
Sundong Ahnabb64432019-10-22 13:58:29 +09004319 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004320 apexRule := module.Rule("apexRule")
4321 copyCmds := apexRule.Args["copy_commands"]
4322
4323 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4324 t.Log("Apex was not a test apex!")
4325 t.Fail()
4326 }
4327 // Ensure that main rule creates an output
4328 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4329
4330 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004331 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004332
4333 // Ensure that both direct and indirect deps are copied into apex
4334 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4335
Colin Cross7113d202019-11-20 16:39:12 -08004336 // Ensure that the platform variant ends with _shared
4337 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004338}
4339
Alex Light9670d332019-01-29 18:07:33 -08004340func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004341 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004342 apex {
4343 name: "myapex",
4344 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004345 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004346 multilib: {
4347 first: {
4348 native_shared_libs: ["mylib_common"],
4349 }
4350 },
4351 target: {
4352 android: {
4353 multilib: {
4354 first: {
4355 native_shared_libs: ["mylib"],
4356 }
4357 }
4358 },
4359 host: {
4360 multilib: {
4361 first: {
4362 native_shared_libs: ["mylib2"],
4363 }
4364 }
4365 }
4366 }
4367 }
4368
4369 apex_key {
4370 name: "myapex.key",
4371 public_key: "testkey.avbpubkey",
4372 private_key: "testkey.pem",
4373 }
4374
4375 cc_library {
4376 name: "mylib",
4377 srcs: ["mylib.cpp"],
4378 system_shared_libs: [],
4379 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004380 // TODO: remove //apex_available:platform
4381 apex_available: [
4382 "//apex_available:platform",
4383 "myapex",
4384 ],
Alex Light9670d332019-01-29 18:07:33 -08004385 }
4386
4387 cc_library {
4388 name: "mylib_common",
4389 srcs: ["mylib.cpp"],
4390 system_shared_libs: [],
4391 stl: "none",
4392 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004393 // TODO: remove //apex_available:platform
4394 apex_available: [
4395 "//apex_available:platform",
4396 "myapex",
4397 ],
Alex Light9670d332019-01-29 18:07:33 -08004398 }
4399
4400 cc_library {
4401 name: "mylib2",
4402 srcs: ["mylib.cpp"],
4403 system_shared_libs: [],
4404 stl: "none",
4405 compile_multilib: "first",
4406 }
4407 `)
4408
Sundong Ahnabb64432019-10-22 13:58:29 +09004409 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004410 copyCmds := apexRule.Args["copy_commands"]
4411
4412 // Ensure that main rule creates an output
4413 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4414
4415 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004416 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4417 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4418 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004419
4420 // Ensure that both direct and indirect deps are copied into apex
4421 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4422 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4423 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4424
Colin Cross7113d202019-11-20 16:39:12 -08004425 // Ensure that the platform variant ends with _shared
4426 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4427 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4428 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004429}
Jiyong Park04480cf2019-02-06 00:16:29 +09004430
Jiyong Park59140302020-12-14 18:44:04 +09004431func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004432 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004433 apex {
4434 name: "myapex",
4435 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004436 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004437 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004438 arch: {
4439 arm64: {
4440 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004441 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004442 },
4443 x86_64: {
4444 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004445 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004446 },
4447 }
4448 }
4449
4450 apex_key {
4451 name: "myapex.key",
4452 public_key: "testkey.avbpubkey",
4453 private_key: "testkey.pem",
4454 }
4455
4456 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004457 name: "mylib.generic",
4458 srcs: ["mylib.cpp"],
4459 system_shared_libs: [],
4460 stl: "none",
4461 // TODO: remove //apex_available:platform
4462 apex_available: [
4463 "//apex_available:platform",
4464 "myapex",
4465 ],
4466 }
4467
4468 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004469 name: "mylib.arm64",
4470 srcs: ["mylib.cpp"],
4471 system_shared_libs: [],
4472 stl: "none",
4473 // TODO: remove //apex_available:platform
4474 apex_available: [
4475 "//apex_available:platform",
4476 "myapex",
4477 ],
4478 }
4479
4480 cc_library {
4481 name: "mylib.x64",
4482 srcs: ["mylib.cpp"],
4483 system_shared_libs: [],
4484 stl: "none",
4485 // TODO: remove //apex_available:platform
4486 apex_available: [
4487 "//apex_available:platform",
4488 "myapex",
4489 ],
4490 }
4491 `)
4492
4493 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4494 copyCmds := apexRule.Args["copy_commands"]
4495
4496 // Ensure that apex variant is created for the direct dep
4497 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004498 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004499 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4500
4501 // Ensure that both direct and indirect deps are copied into apex
4502 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4503 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4504}
4505
Jiyong Park04480cf2019-02-06 00:16:29 +09004506func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004507 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004508 apex {
4509 name: "myapex",
4510 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004511 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004512 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004513 }
4514
4515 apex_key {
4516 name: "myapex.key",
4517 public_key: "testkey.avbpubkey",
4518 private_key: "testkey.pem",
4519 }
4520
4521 sh_binary {
4522 name: "myscript",
4523 src: "mylib.cpp",
4524 filename: "myscript.sh",
4525 sub_dir: "script",
4526 }
4527 `)
4528
Sundong Ahnabb64432019-10-22 13:58:29 +09004529 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004530 copyCmds := apexRule.Args["copy_commands"]
4531
4532 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4533}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004534
Jooyung Han91df2082019-11-20 01:49:42 +09004535func TestApexInVariousPartition(t *testing.T) {
4536 testcases := []struct {
4537 propName, parition, flattenedPartition string
4538 }{
4539 {"", "system", "system_ext"},
4540 {"product_specific: true", "product", "product"},
4541 {"soc_specific: true", "vendor", "vendor"},
4542 {"proprietary: true", "vendor", "vendor"},
4543 {"vendor: true", "vendor", "vendor"},
4544 {"system_ext_specific: true", "system_ext", "system_ext"},
4545 }
4546 for _, tc := range testcases {
4547 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004548 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004549 apex {
4550 name: "myapex",
4551 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004552 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004553 `+tc.propName+`
4554 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004555
Jooyung Han91df2082019-11-20 01:49:42 +09004556 apex_key {
4557 name: "myapex.key",
4558 public_key: "testkey.avbpubkey",
4559 private_key: "testkey.pem",
4560 }
4561 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004562
Jooyung Han91df2082019-11-20 01:49:42 +09004563 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004564 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4565 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004566 if actual != expected {
4567 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4568 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004569
Jooyung Han91df2082019-11-20 01:49:42 +09004570 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004571 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4572 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004573 if actual != expected {
4574 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4575 }
4576 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004577 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004578}
Jiyong Park67882562019-03-21 01:11:21 +09004579
Jooyung Han580eb4f2020-06-24 19:33:06 +09004580func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004581 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004582 apex {
4583 name: "myapex",
4584 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004585 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004586 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004587
Jooyung Han580eb4f2020-06-24 19:33:06 +09004588 apex_key {
4589 name: "myapex.key",
4590 public_key: "testkey.avbpubkey",
4591 private_key: "testkey.pem",
4592 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004593 `)
4594 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004595 rule := module.Output("file_contexts")
4596 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4597}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004598
Jooyung Han580eb4f2020-06-24 19:33:06 +09004599func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004600 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004601 apex {
4602 name: "myapex",
4603 key: "myapex.key",
4604 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004605 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004606 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004607
Jooyung Han580eb4f2020-06-24 19:33:06 +09004608 apex_key {
4609 name: "myapex.key",
4610 public_key: "testkey.avbpubkey",
4611 private_key: "testkey.pem",
4612 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004613 `, withFiles(map[string][]byte{
4614 "my_own_file_contexts": nil,
4615 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004616}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004617
Jooyung Han580eb4f2020-06-24 19:33:06 +09004618func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004619 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004620 apex {
4621 name: "myapex",
4622 key: "myapex.key",
4623 product_specific: true,
4624 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004625 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004626 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004627
Jooyung Han580eb4f2020-06-24 19:33:06 +09004628 apex_key {
4629 name: "myapex.key",
4630 public_key: "testkey.avbpubkey",
4631 private_key: "testkey.pem",
4632 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004633 `)
4634
Colin Cross1c460562021-02-16 17:55:47 -08004635 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004636 apex {
4637 name: "myapex",
4638 key: "myapex.key",
4639 product_specific: true,
4640 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004641 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004642 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004643
Jooyung Han580eb4f2020-06-24 19:33:06 +09004644 apex_key {
4645 name: "myapex.key",
4646 public_key: "testkey.avbpubkey",
4647 private_key: "testkey.pem",
4648 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004649 `, withFiles(map[string][]byte{
4650 "product_specific_file_contexts": nil,
4651 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004652 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4653 rule := module.Output("file_contexts")
4654 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4655}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004656
Jooyung Han580eb4f2020-06-24 19:33:06 +09004657func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004658 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004659 apex {
4660 name: "myapex",
4661 key: "myapex.key",
4662 product_specific: true,
4663 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004664 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004665 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004666
Jooyung Han580eb4f2020-06-24 19:33:06 +09004667 apex_key {
4668 name: "myapex.key",
4669 public_key: "testkey.avbpubkey",
4670 private_key: "testkey.pem",
4671 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004672
Jooyung Han580eb4f2020-06-24 19:33:06 +09004673 filegroup {
4674 name: "my-file-contexts",
4675 srcs: ["product_specific_file_contexts"],
4676 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004677 `, withFiles(map[string][]byte{
4678 "product_specific_file_contexts": nil,
4679 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004680 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4681 rule := module.Output("file_contexts")
4682 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004683}
4684
Jiyong Park67882562019-03-21 01:11:21 +09004685func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004686 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004687 apex_key {
4688 name: "myapex.key",
4689 public_key: ":my.avbpubkey",
4690 private_key: ":my.pem",
4691 product_specific: true,
4692 }
4693
4694 filegroup {
4695 name: "my.avbpubkey",
4696 srcs: ["testkey2.avbpubkey"],
4697 }
4698
4699 filegroup {
4700 name: "my.pem",
4701 srcs: ["testkey2.pem"],
4702 }
4703 `)
4704
4705 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4706 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004707 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004708 if actual_pubkey != expected_pubkey {
4709 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4710 }
4711 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004712 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004713 if actual_privkey != expected_privkey {
4714 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4715 }
4716}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004717
4718func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004719 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004720 prebuilt_apex {
4721 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004722 arch: {
4723 arm64: {
4724 src: "myapex-arm64.apex",
4725 },
4726 arm: {
4727 src: "myapex-arm.apex",
4728 },
4729 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004730 }
4731 `)
4732
Wei Li340ee8e2022-03-18 17:33:24 -07004733 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4734 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004735
Jiyong Parkc95714e2019-03-29 14:23:10 +09004736 expectedInput := "myapex-arm64.apex"
4737 if prebuilt.inputApex.String() != expectedInput {
4738 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4739 }
Wei Li340ee8e2022-03-18 17:33:24 -07004740 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4741 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4742 rule := testingModule.Rule("genProvenanceMetaData")
4743 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4744 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4745 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4746 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004747}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004748
Paul Duffinc0609c62021-03-01 17:27:16 +00004749func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004750 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004751 prebuilt_apex {
4752 name: "myapex",
4753 }
4754 `)
4755}
4756
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004757func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004758 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004759 prebuilt_apex {
4760 name: "myapex",
4761 src: "myapex-arm.apex",
4762 filename: "notmyapex.apex",
4763 }
4764 `)
4765
Wei Li340ee8e2022-03-18 17:33:24 -07004766 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4767 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004768
4769 expected := "notmyapex.apex"
4770 if p.installFilename != expected {
4771 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4772 }
Wei Li340ee8e2022-03-18 17:33:24 -07004773 rule := testingModule.Rule("genProvenanceMetaData")
4774 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4775 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4776 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4777 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004778}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004779
Samiul Islam7c02e262021-09-08 17:48:28 +01004780func TestApexSetFilenameOverride(t *testing.T) {
4781 testApex(t, `
4782 apex_set {
4783 name: "com.company.android.myapex",
4784 apex_name: "com.android.myapex",
4785 set: "company-myapex.apks",
4786 filename: "com.company.android.myapex.apex"
4787 }
4788 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4789
4790 testApex(t, `
4791 apex_set {
4792 name: "com.company.android.myapex",
4793 apex_name: "com.android.myapex",
4794 set: "company-myapex.apks",
4795 filename: "com.company.android.myapex.capex"
4796 }
4797 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4798
4799 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4800 apex_set {
4801 name: "com.company.android.myapex",
4802 apex_name: "com.android.myapex",
4803 set: "company-myapex.apks",
4804 filename: "some-random-suffix"
4805 }
4806 `)
4807}
4808
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004809func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004810 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004811 prebuilt_apex {
4812 name: "myapex.prebuilt",
4813 src: "myapex-arm.apex",
4814 overrides: [
4815 "myapex",
4816 ],
4817 }
4818 `)
4819
Wei Li340ee8e2022-03-18 17:33:24 -07004820 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4821 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004822
4823 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004824 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004825 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004826 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004827 }
Wei Li340ee8e2022-03-18 17:33:24 -07004828 rule := testingModule.Rule("genProvenanceMetaData")
4829 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4830 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4831 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4832 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004833}
4834
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004835func TestPrebuiltApexName(t *testing.T) {
4836 testApex(t, `
4837 prebuilt_apex {
4838 name: "com.company.android.myapex",
4839 apex_name: "com.android.myapex",
4840 src: "company-myapex-arm.apex",
4841 }
4842 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4843
4844 testApex(t, `
4845 apex_set {
4846 name: "com.company.android.myapex",
4847 apex_name: "com.android.myapex",
4848 set: "company-myapex.apks",
4849 }
4850 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4851}
4852
4853func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4854 _ = android.GroupFixturePreparers(
4855 java.PrepareForTestWithJavaDefaultModules,
4856 PrepareForTestWithApexBuildComponents,
4857 android.FixtureWithRootAndroidBp(`
4858 platform_bootclasspath {
4859 name: "platform-bootclasspath",
4860 fragments: [
4861 {
4862 apex: "com.android.art",
4863 module: "art-bootclasspath-fragment",
4864 },
4865 ],
4866 }
4867
4868 prebuilt_apex {
4869 name: "com.company.android.art",
4870 apex_name: "com.android.art",
4871 src: "com.company.android.art-arm.apex",
4872 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4873 }
4874
4875 prebuilt_bootclasspath_fragment {
4876 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004877 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004878 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004879 hidden_api: {
4880 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4881 metadata: "my-bootclasspath-fragment/metadata.csv",
4882 index: "my-bootclasspath-fragment/index.csv",
4883 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4884 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4885 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004886 }
4887
4888 java_import {
4889 name: "core-oj",
4890 jars: ["prebuilt.jar"],
4891 }
4892 `),
4893 ).RunTest(t)
4894}
4895
Paul Duffin092153d2021-01-26 11:42:39 +00004896// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4897// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004898func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004899 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004900
Paul Duffin89886cb2021-02-05 16:44:03 +00004901 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004902 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004903 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004904 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004905 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004906 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004907 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4908 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4909 android.NormalizePathForTesting(dexJarBuildPath))
4910 }
4911
4912 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004913 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004914 // Make sure the import has been given the correct path to the dex jar.
4915 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4916 dexJarBuildPath := p.DexJarInstallPath()
4917 stem := android.RemoveOptionalPrebuiltPrefix(name)
4918 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4919 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4920 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004921 }
4922
Paul Duffin39853512021-02-26 11:09:39 +00004923 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004924 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004925 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004926 android.AssertArrayString(t, "Check if there is no source variant",
4927 []string{"android_common"},
4928 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004929 }
4930
4931 t.Run("prebuilt only", func(t *testing.T) {
4932 bp := `
4933 prebuilt_apex {
4934 name: "myapex",
4935 arch: {
4936 arm64: {
4937 src: "myapex-arm64.apex",
4938 },
4939 arm: {
4940 src: "myapex-arm.apex",
4941 },
4942 },
Paul Duffin39853512021-02-26 11:09:39 +00004943 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004944 }
4945
4946 java_import {
4947 name: "libfoo",
4948 jars: ["libfoo.jar"],
4949 }
Paul Duffin39853512021-02-26 11:09:39 +00004950
4951 java_sdk_library_import {
4952 name: "libbar",
4953 public: {
4954 jars: ["libbar.jar"],
4955 },
4956 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004957 `
4958
4959 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4960 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4961
Martin Stjernholm44825602021-09-17 01:44:12 +01004962 deapexerName := deapexerModuleName("myapex")
4963 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4964
Paul Duffinf6932af2021-02-26 18:21:56 +00004965 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004966 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004967 rule := deapexer.Rule("deapexer")
4968 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4969 t.Errorf("expected: %q, found: %q", expected, actual)
4970 }
4971
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004972 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004973 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004974 rule = prebuiltApex.Rule("android/soong/android.Cp")
4975 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4976 t.Errorf("expected: %q, found: %q", expected, actual)
4977 }
4978
Paul Duffin89886cb2021-02-05 16:44:03 +00004979 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004980 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004981
4982 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004983 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004984 })
4985
4986 t.Run("prebuilt with source preferred", func(t *testing.T) {
4987
4988 bp := `
4989 prebuilt_apex {
4990 name: "myapex",
4991 arch: {
4992 arm64: {
4993 src: "myapex-arm64.apex",
4994 },
4995 arm: {
4996 src: "myapex-arm.apex",
4997 },
4998 },
Paul Duffin39853512021-02-26 11:09:39 +00004999 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005000 }
5001
5002 java_import {
5003 name: "libfoo",
5004 jars: ["libfoo.jar"],
5005 }
5006
5007 java_library {
5008 name: "libfoo",
5009 }
Paul Duffin39853512021-02-26 11:09:39 +00005010
5011 java_sdk_library_import {
5012 name: "libbar",
5013 public: {
5014 jars: ["libbar.jar"],
5015 },
5016 }
5017
5018 java_sdk_library {
5019 name: "libbar",
5020 srcs: ["foo/bar/MyClass.java"],
5021 unsafe_ignore_missing_latest_api: true,
5022 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005023 `
5024
5025 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5026 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5027
Paul Duffin89886cb2021-02-05 16:44:03 +00005028 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005029 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005030 ensureNoSourceVariant(t, ctx, "libfoo")
5031
5032 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005033 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005034 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005035 })
5036
5037 t.Run("prebuilt preferred with source", func(t *testing.T) {
5038 bp := `
5039 prebuilt_apex {
5040 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005041 arch: {
5042 arm64: {
5043 src: "myapex-arm64.apex",
5044 },
5045 arm: {
5046 src: "myapex-arm.apex",
5047 },
5048 },
Paul Duffin39853512021-02-26 11:09:39 +00005049 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005050 }
5051
5052 java_import {
5053 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005054 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005055 jars: ["libfoo.jar"],
5056 }
5057
5058 java_library {
5059 name: "libfoo",
5060 }
Paul Duffin39853512021-02-26 11:09:39 +00005061
5062 java_sdk_library_import {
5063 name: "libbar",
5064 prefer: true,
5065 public: {
5066 jars: ["libbar.jar"],
5067 },
5068 }
5069
5070 java_sdk_library {
5071 name: "libbar",
5072 srcs: ["foo/bar/MyClass.java"],
5073 unsafe_ignore_missing_latest_api: true,
5074 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005075 `
5076
5077 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5078 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5079
Paul Duffin89886cb2021-02-05 16:44:03 +00005080 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005081 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005082 ensureNoSourceVariant(t, ctx, "libfoo")
5083
5084 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005085 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005086 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005087 })
5088}
5089
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005090func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005091 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005092 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005093 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5094 // is disabled.
5095 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5096 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005097
Paul Duffin37856732021-02-26 14:24:15 +00005098 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5099 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005100 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005101 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005102 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005103 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005104 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005105 foundLibfooJar = true
5106 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005107 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005108 }
5109 }
5110 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005111 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 +00005112 }
5113 }
5114
Paul Duffin40a3f652021-07-19 13:11:24 +01005115 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005116 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005117 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005118 var rule android.TestingBuildParams
5119
5120 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5121 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005122 }
5123
Paul Duffin40a3f652021-07-19 13:11:24 +01005124 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5125 t.Helper()
5126 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5127 var rule android.TestingBuildParams
5128
5129 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5130 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5131 }
5132
Paul Duffin89f570a2021-06-16 01:42:33 +01005133 fragment := java.ApexVariantReference{
5134 Apex: proptools.StringPtr("myapex"),
5135 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5136 }
5137
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005138 t.Run("prebuilt only", func(t *testing.T) {
5139 bp := `
5140 prebuilt_apex {
5141 name: "myapex",
5142 arch: {
5143 arm64: {
5144 src: "myapex-arm64.apex",
5145 },
5146 arm: {
5147 src: "myapex-arm.apex",
5148 },
5149 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005150 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5151 }
5152
5153 prebuilt_bootclasspath_fragment {
5154 name: "my-bootclasspath-fragment",
5155 contents: ["libfoo", "libbar"],
5156 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005157 hidden_api: {
5158 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5159 metadata: "my-bootclasspath-fragment/metadata.csv",
5160 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005161 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5162 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5163 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005164 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005165 }
5166
5167 java_import {
5168 name: "libfoo",
5169 jars: ["libfoo.jar"],
5170 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005171 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005172 }
Paul Duffin37856732021-02-26 14:24:15 +00005173
5174 java_sdk_library_import {
5175 name: "libbar",
5176 public: {
5177 jars: ["libbar.jar"],
5178 },
5179 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005180 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005181 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005182 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005183 `
5184
Paul Duffin89f570a2021-06-16 01:42:33 +01005185 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005186 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5187 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005188
Paul Duffin537ea3d2021-05-14 10:38:00 +01005189 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005190 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005191 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005192 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005193 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5194 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005195 })
5196
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005197 t.Run("apex_set only", func(t *testing.T) {
5198 bp := `
5199 apex_set {
5200 name: "myapex",
5201 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005202 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5203 }
5204
5205 prebuilt_bootclasspath_fragment {
5206 name: "my-bootclasspath-fragment",
5207 contents: ["libfoo", "libbar"],
5208 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005209 hidden_api: {
5210 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5211 metadata: "my-bootclasspath-fragment/metadata.csv",
5212 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005213 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5214 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5215 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005216 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005217 }
5218
5219 java_import {
5220 name: "libfoo",
5221 jars: ["libfoo.jar"],
5222 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005223 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005224 }
5225
5226 java_sdk_library_import {
5227 name: "libbar",
5228 public: {
5229 jars: ["libbar.jar"],
5230 },
5231 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005232 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005233 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005234 }
5235 `
5236
Paul Duffin89f570a2021-06-16 01:42:33 +01005237 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005238 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5239 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5240
Paul Duffin537ea3d2021-05-14 10:38:00 +01005241 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005242 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005243 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005244 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005245 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5246 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005247 })
5248
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005249 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5250 bp := `
5251 prebuilt_apex {
5252 name: "myapex",
5253 arch: {
5254 arm64: {
5255 src: "myapex-arm64.apex",
5256 },
5257 arm: {
5258 src: "myapex-arm.apex",
5259 },
5260 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005261 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5262 }
5263
5264 prebuilt_bootclasspath_fragment {
5265 name: "my-bootclasspath-fragment",
5266 contents: ["libfoo", "libbar"],
5267 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005268 hidden_api: {
5269 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5270 metadata: "my-bootclasspath-fragment/metadata.csv",
5271 index: "my-bootclasspath-fragment/index.csv",
5272 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5273 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5274 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005275 }
5276
5277 java_import {
5278 name: "libfoo",
5279 jars: ["libfoo.jar"],
5280 apex_available: ["myapex"],
5281 }
5282
5283 java_library {
5284 name: "libfoo",
5285 srcs: ["foo/bar/MyClass.java"],
5286 apex_available: ["myapex"],
5287 }
Paul Duffin37856732021-02-26 14:24:15 +00005288
5289 java_sdk_library_import {
5290 name: "libbar",
5291 public: {
5292 jars: ["libbar.jar"],
5293 },
5294 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005295 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005296 }
5297
5298 java_sdk_library {
5299 name: "libbar",
5300 srcs: ["foo/bar/MyClass.java"],
5301 unsafe_ignore_missing_latest_api: true,
5302 apex_available: ["myapex"],
5303 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005304 `
5305
5306 // In this test the source (java_library) libfoo is active since the
5307 // prebuilt (java_import) defaults to prefer:false. However the
5308 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5309 // find the dex boot jar in it. We either need to disable the source libfoo
5310 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005311 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005312 // dexbootjar check is skipped if AllowMissingDependencies is true
5313 preparerAllowMissingDeps := android.GroupFixturePreparers(
5314 preparer,
5315 android.PrepareForTestWithAllowMissingDependencies,
5316 )
5317 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005318 })
5319
5320 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5321 bp := `
5322 prebuilt_apex {
5323 name: "myapex",
5324 arch: {
5325 arm64: {
5326 src: "myapex-arm64.apex",
5327 },
5328 arm: {
5329 src: "myapex-arm.apex",
5330 },
5331 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005332 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5333 }
5334
5335 prebuilt_bootclasspath_fragment {
5336 name: "my-bootclasspath-fragment",
5337 contents: ["libfoo", "libbar"],
5338 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005339 hidden_api: {
5340 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5341 metadata: "my-bootclasspath-fragment/metadata.csv",
5342 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005343 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5344 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5345 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005346 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005347 }
5348
5349 java_import {
5350 name: "libfoo",
5351 prefer: true,
5352 jars: ["libfoo.jar"],
5353 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005354 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005355 }
5356
5357 java_library {
5358 name: "libfoo",
5359 srcs: ["foo/bar/MyClass.java"],
5360 apex_available: ["myapex"],
5361 }
Paul Duffin37856732021-02-26 14:24:15 +00005362
5363 java_sdk_library_import {
5364 name: "libbar",
5365 prefer: true,
5366 public: {
5367 jars: ["libbar.jar"],
5368 },
5369 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005370 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005371 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005372 }
5373
5374 java_sdk_library {
5375 name: "libbar",
5376 srcs: ["foo/bar/MyClass.java"],
5377 unsafe_ignore_missing_latest_api: true,
5378 apex_available: ["myapex"],
5379 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005380 `
5381
Paul Duffin89f570a2021-06-16 01:42:33 +01005382 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005383 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5384 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005385
Paul Duffin537ea3d2021-05-14 10:38:00 +01005386 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005387 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005388 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005389 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005390 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5391 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005392 })
5393
5394 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5395 bp := `
5396 apex {
5397 name: "myapex",
5398 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005399 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005400 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005401 }
5402
5403 apex_key {
5404 name: "myapex.key",
5405 public_key: "testkey.avbpubkey",
5406 private_key: "testkey.pem",
5407 }
5408
5409 prebuilt_apex {
5410 name: "myapex",
5411 arch: {
5412 arm64: {
5413 src: "myapex-arm64.apex",
5414 },
5415 arm: {
5416 src: "myapex-arm.apex",
5417 },
5418 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005419 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5420 }
5421
5422 prebuilt_bootclasspath_fragment {
5423 name: "my-bootclasspath-fragment",
5424 contents: ["libfoo", "libbar"],
5425 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005426 hidden_api: {
5427 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5428 metadata: "my-bootclasspath-fragment/metadata.csv",
5429 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005430 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5431 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5432 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005433 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005434 }
5435
5436 java_import {
5437 name: "libfoo",
5438 jars: ["libfoo.jar"],
5439 apex_available: ["myapex"],
5440 }
5441
5442 java_library {
5443 name: "libfoo",
5444 srcs: ["foo/bar/MyClass.java"],
5445 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005446 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005447 }
Paul Duffin37856732021-02-26 14:24:15 +00005448
5449 java_sdk_library_import {
5450 name: "libbar",
5451 public: {
5452 jars: ["libbar.jar"],
5453 },
5454 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005455 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005456 }
5457
5458 java_sdk_library {
5459 name: "libbar",
5460 srcs: ["foo/bar/MyClass.java"],
5461 unsafe_ignore_missing_latest_api: true,
5462 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005463 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005464 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 `
5466
Paul Duffin89f570a2021-06-16 01:42:33 +01005467 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005468 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5469 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005470
Paul Duffin537ea3d2021-05-14 10:38:00 +01005471 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005472 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005473 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005474 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005475 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5476 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005477 })
5478
5479 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5480 bp := `
5481 apex {
5482 name: "myapex",
5483 enabled: false,
5484 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005485 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005486 }
5487
5488 apex_key {
5489 name: "myapex.key",
5490 public_key: "testkey.avbpubkey",
5491 private_key: "testkey.pem",
5492 }
5493
5494 prebuilt_apex {
5495 name: "myapex",
5496 arch: {
5497 arm64: {
5498 src: "myapex-arm64.apex",
5499 },
5500 arm: {
5501 src: "myapex-arm.apex",
5502 },
5503 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005504 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5505 }
5506
5507 prebuilt_bootclasspath_fragment {
5508 name: "my-bootclasspath-fragment",
5509 contents: ["libfoo", "libbar"],
5510 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005511 hidden_api: {
5512 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5513 metadata: "my-bootclasspath-fragment/metadata.csv",
5514 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005515 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5516 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5517 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005518 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005519 }
5520
5521 java_import {
5522 name: "libfoo",
5523 prefer: true,
5524 jars: ["libfoo.jar"],
5525 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005526 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005527 }
5528
5529 java_library {
5530 name: "libfoo",
5531 srcs: ["foo/bar/MyClass.java"],
5532 apex_available: ["myapex"],
5533 }
Paul Duffin37856732021-02-26 14:24:15 +00005534
5535 java_sdk_library_import {
5536 name: "libbar",
5537 prefer: true,
5538 public: {
5539 jars: ["libbar.jar"],
5540 },
5541 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005542 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005543 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005544 }
5545
5546 java_sdk_library {
5547 name: "libbar",
5548 srcs: ["foo/bar/MyClass.java"],
5549 unsafe_ignore_missing_latest_api: true,
5550 apex_available: ["myapex"],
5551 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005552 `
5553
Paul Duffin89f570a2021-06-16 01:42:33 +01005554 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005555 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5556 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005557
Paul Duffin537ea3d2021-05-14 10:38:00 +01005558 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005559 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005560 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005561 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005562 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5563 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005564 })
5565}
5566
Roland Levillain630846d2019-06-26 12:48:34 +01005567func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005568 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005569 apex_test {
5570 name: "myapex",
5571 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005572 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005573 tests: [
5574 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005575 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005576 ],
5577 }
5578
5579 apex_key {
5580 name: "myapex.key",
5581 public_key: "testkey.avbpubkey",
5582 private_key: "testkey.pem",
5583 }
5584
Liz Kammer1c14a212020-05-12 15:26:55 -07005585 filegroup {
5586 name: "fg",
5587 srcs: [
5588 "baz",
5589 "bar/baz"
5590 ],
5591 }
5592
Roland Levillain630846d2019-06-26 12:48:34 +01005593 cc_test {
5594 name: "mytest",
5595 gtest: false,
5596 srcs: ["mytest.cpp"],
5597 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005598 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005599 system_shared_libs: [],
5600 static_executable: true,
5601 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005602 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005603 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005604
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005605 cc_library {
5606 name: "mylib",
5607 srcs: ["mylib.cpp"],
5608 system_shared_libs: [],
5609 stl: "none",
5610 }
5611
Liz Kammer5bd365f2020-05-27 15:15:11 -07005612 filegroup {
5613 name: "fg2",
5614 srcs: [
5615 "testdata/baz"
5616 ],
5617 }
5618
Roland Levillain9b5fde92019-06-28 15:41:19 +01005619 cc_test {
5620 name: "mytests",
5621 gtest: false,
5622 srcs: [
5623 "mytest1.cpp",
5624 "mytest2.cpp",
5625 "mytest3.cpp",
5626 ],
5627 test_per_src: true,
5628 relative_install_path: "test",
5629 system_shared_libs: [],
5630 static_executable: true,
5631 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005632 data: [
5633 ":fg",
5634 ":fg2",
5635 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005636 }
Roland Levillain630846d2019-06-26 12:48:34 +01005637 `)
5638
Sundong Ahnabb64432019-10-22 13:58:29 +09005639 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005640 copyCmds := apexRule.Args["copy_commands"]
5641
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005642 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005643 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005644 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005645
Liz Kammer1c14a212020-05-12 15:26:55 -07005646 //Ensure that test data are copied into apex.
5647 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5648 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5649
Roland Levillain9b5fde92019-06-28 15:41:19 +01005650 // Ensure that test deps built with `test_per_src` are copied into apex.
5651 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5652 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5653 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005654
5655 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005656 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005657 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005658 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005659 prefix := "TARGET_"
5660 var builder strings.Builder
5661 data.Custom(&builder, name, prefix, "", data)
5662 androidMk := builder.String()
Prerana Patilb1896c82022-11-09 18:14:34 +00005663 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5664 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5665 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5666 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5667 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5668 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005669 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005670
5671 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005672 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005673 data.Custom(&builder, name, prefix, "", data)
5674 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005675 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5676 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005677}
5678
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005679func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005680 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005681 apex {
5682 name: "myapex",
5683 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005684 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005685 }
5686 apex_key {
5687 name: "myapex.key",
5688 public_key: "testkey.avbpubkey",
5689 private_key: "testkey.pem",
5690 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005691 `,
5692 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5693 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5694 }),
5695 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005696 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005697 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005698 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005699 var builder strings.Builder
5700 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5701 androidMk := builder.String()
5702 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5703}
5704
Jooyung Hand48f3c32019-08-23 11:18:57 +09005705func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5706 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5707 apex {
5708 name: "myapex",
5709 key: "myapex.key",
5710 native_shared_libs: ["libfoo"],
5711 }
5712
5713 apex_key {
5714 name: "myapex.key",
5715 public_key: "testkey.avbpubkey",
5716 private_key: "testkey.pem",
5717 }
5718
5719 cc_library {
5720 name: "libfoo",
5721 stl: "none",
5722 system_shared_libs: [],
5723 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005724 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005725 }
5726 `)
5727 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5728 apex {
5729 name: "myapex",
5730 key: "myapex.key",
5731 java_libs: ["myjar"],
5732 }
5733
5734 apex_key {
5735 name: "myapex.key",
5736 public_key: "testkey.avbpubkey",
5737 private_key: "testkey.pem",
5738 }
5739
5740 java_library {
5741 name: "myjar",
5742 srcs: ["foo/bar/MyClass.java"],
5743 sdk_version: "none",
5744 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005745 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005746 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005747 }
5748 `)
5749}
5750
Bill Peckhama41a6962021-01-11 10:58:54 -08005751func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005752 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005753 apex {
5754 name: "myapex",
5755 key: "myapex.key",
5756 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005757 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005758 }
5759
5760 apex_key {
5761 name: "myapex.key",
5762 public_key: "testkey.avbpubkey",
5763 private_key: "testkey.pem",
5764 }
5765
5766 java_import {
5767 name: "myjavaimport",
5768 apex_available: ["myapex"],
5769 jars: ["my.jar"],
5770 compile_dex: true,
5771 }
5772 `)
5773
5774 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5775 apexRule := module.Rule("apexRule")
5776 copyCmds := apexRule.Args["copy_commands"]
5777 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5778}
5779
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005780func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005781 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005782 apex {
5783 name: "myapex",
5784 key: "myapex.key",
5785 apps: [
5786 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005787 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005788 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005789 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005790 }
5791
5792 apex_key {
5793 name: "myapex.key",
5794 public_key: "testkey.avbpubkey",
5795 private_key: "testkey.pem",
5796 }
5797
5798 android_app {
5799 name: "AppFoo",
5800 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005801 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005802 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005803 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005804 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005805 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005806 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005807
5808 android_app {
5809 name: "AppFooPriv",
5810 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005811 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005812 system_modules: "none",
5813 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005814 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005815 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005816 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005817
5818 cc_library_shared {
5819 name: "libjni",
5820 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005821 shared_libs: ["libfoo"],
5822 stl: "none",
5823 system_shared_libs: [],
5824 apex_available: [ "myapex" ],
5825 sdk_version: "current",
5826 }
5827
5828 cc_library_shared {
5829 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005830 stl: "none",
5831 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005832 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005833 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005834 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005835 `)
5836
Sundong Ahnabb64432019-10-22 13:58:29 +09005837 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005838 apexRule := module.Rule("apexRule")
5839 copyCmds := apexRule.Args["copy_commands"]
5840
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005841 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5842 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005843
Colin Crossaede88c2020-08-11 12:17:01 -07005844 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005845 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005846 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005847 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005848 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005849 // JNI libraries including transitive deps are
5850 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005851 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005852 // ... embedded inside APK (jnilibs.zip)
5853 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5854 // ... and not directly inside the APEX
5855 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5856 }
Dario Frenicde2a032019-10-27 00:29:22 +01005857}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005858
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005859func TestApexWithAppImportBuildId(t *testing.T) {
5860 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5861 for _, id := range invalidBuildIds {
5862 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5863 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5864 variables.BuildId = proptools.StringPtr(id)
5865 })
5866 testApexError(t, message, `apex {
5867 name: "myapex",
5868 key: "myapex.key",
5869 apps: ["AppFooPrebuilt"],
5870 updatable: false,
5871 }
5872
5873 apex_key {
5874 name: "myapex.key",
5875 public_key: "testkey.avbpubkey",
5876 private_key: "testkey.pem",
5877 }
5878
5879 android_app_import {
5880 name: "AppFooPrebuilt",
5881 apk: "PrebuiltAppFoo.apk",
5882 presigned: true,
5883 apex_available: ["myapex"],
5884 }
5885 `, fixture)
5886 }
5887}
5888
Dario Frenicde2a032019-10-27 00:29:22 +01005889func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005890 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005891 apex {
5892 name: "myapex",
5893 key: "myapex.key",
5894 apps: [
5895 "AppFooPrebuilt",
5896 "AppFooPrivPrebuilt",
5897 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005898 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005899 }
5900
5901 apex_key {
5902 name: "myapex.key",
5903 public_key: "testkey.avbpubkey",
5904 private_key: "testkey.pem",
5905 }
5906
5907 android_app_import {
5908 name: "AppFooPrebuilt",
5909 apk: "PrebuiltAppFoo.apk",
5910 presigned: true,
5911 dex_preopt: {
5912 enabled: false,
5913 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005914 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005915 }
5916
5917 android_app_import {
5918 name: "AppFooPrivPrebuilt",
5919 apk: "PrebuiltAppFooPriv.apk",
5920 privileged: true,
5921 presigned: true,
5922 dex_preopt: {
5923 enabled: false,
5924 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005925 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005926 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005927 }
5928 `)
5929
Sundong Ahnabb64432019-10-22 13:58:29 +09005930 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005931 apexRule := module.Rule("apexRule")
5932 copyCmds := apexRule.Args["copy_commands"]
5933
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005934 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5935 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005936}
5937
5938func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005939 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005940 apex {
5941 name: "myapex",
5942 key: "myapex.key",
5943 apps: [
5944 "AppFoo",
5945 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005946 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005947 }
5948
5949 apex_key {
5950 name: "myapex.key",
5951 public_key: "testkey.avbpubkey",
5952 private_key: "testkey.pem",
5953 }
5954
5955 android_app {
5956 name: "AppFoo",
5957 srcs: ["foo/bar/MyClass.java"],
5958 sdk_version: "none",
5959 system_modules: "none",
5960 apex_available: [ "myapex" ],
5961 }
5962
5963 android_app_import {
5964 name: "AppFoo",
5965 apk: "AppFooPrebuilt.apk",
5966 filename: "AppFooPrebuilt.apk",
5967 presigned: true,
5968 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005969 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005970 }
5971 `, withFiles(map[string][]byte{
5972 "AppFooPrebuilt.apk": nil,
5973 }))
5974
5975 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005976 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005977 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005978}
5979
Dario Freni6f3937c2019-12-20 22:58:03 +00005980func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005981 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005982 apex {
5983 name: "myapex",
5984 key: "myapex.key",
5985 apps: [
5986 "TesterHelpAppFoo",
5987 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005988 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005989 }
5990
5991 apex_key {
5992 name: "myapex.key",
5993 public_key: "testkey.avbpubkey",
5994 private_key: "testkey.pem",
5995 }
5996
5997 android_test_helper_app {
5998 name: "TesterHelpAppFoo",
5999 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006000 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006001 }
6002
6003 `)
6004
6005 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6006 apexRule := module.Rule("apexRule")
6007 copyCmds := apexRule.Args["copy_commands"]
6008
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006009 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006010}
6011
Jooyung Han18020ea2019-11-13 10:50:48 +09006012func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6013 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006014 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006015 apex {
6016 name: "myapex",
6017 key: "myapex.key",
6018 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006019 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006020 }
6021
6022 apex_key {
6023 name: "myapex.key",
6024 public_key: "testkey.avbpubkey",
6025 private_key: "testkey.pem",
6026 }
6027
6028 apex {
6029 name: "otherapex",
6030 key: "myapex.key",
6031 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006032 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006033 }
6034
6035 cc_defaults {
6036 name: "libfoo-defaults",
6037 apex_available: ["otherapex"],
6038 }
6039
6040 cc_library {
6041 name: "libfoo",
6042 defaults: ["libfoo-defaults"],
6043 stl: "none",
6044 system_shared_libs: [],
6045 }`)
6046}
6047
Paul Duffine52e66f2020-03-30 17:54:29 +01006048func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006049 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006050 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006051 apex {
6052 name: "myapex",
6053 key: "myapex.key",
6054 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006055 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006056 }
6057
6058 apex_key {
6059 name: "myapex.key",
6060 public_key: "testkey.avbpubkey",
6061 private_key: "testkey.pem",
6062 }
6063
6064 apex {
6065 name: "otherapex",
6066 key: "otherapex.key",
6067 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006068 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006069 }
6070
6071 apex_key {
6072 name: "otherapex.key",
6073 public_key: "testkey.avbpubkey",
6074 private_key: "testkey.pem",
6075 }
6076
6077 cc_library {
6078 name: "libfoo",
6079 stl: "none",
6080 system_shared_libs: [],
6081 apex_available: ["otherapex"],
6082 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006083}
Jiyong Park127b40b2019-09-30 16:04:35 +09006084
Paul Duffine52e66f2020-03-30 17:54:29 +01006085func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006086 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006087 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006088.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006089.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006090.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006091.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006092.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006093.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006094 apex {
6095 name: "myapex",
6096 key: "myapex.key",
6097 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006098 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006099 }
6100
6101 apex_key {
6102 name: "myapex.key",
6103 public_key: "testkey.avbpubkey",
6104 private_key: "testkey.pem",
6105 }
6106
Jiyong Park127b40b2019-09-30 16:04:35 +09006107 cc_library {
6108 name: "libfoo",
6109 stl: "none",
6110 shared_libs: ["libbar"],
6111 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006112 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006113 }
6114
6115 cc_library {
6116 name: "libbar",
6117 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006118 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006119 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006120 apex_available: ["myapex"],
6121 }
6122
6123 cc_library {
6124 name: "libbaz",
6125 stl: "none",
6126 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006127 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006128}
Jiyong Park127b40b2019-09-30 16:04:35 +09006129
Paul Duffine52e66f2020-03-30 17:54:29 +01006130func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006131 testApexError(t, "\"otherapex\" is not a valid module name", `
6132 apex {
6133 name: "myapex",
6134 key: "myapex.key",
6135 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006136 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006137 }
6138
6139 apex_key {
6140 name: "myapex.key",
6141 public_key: "testkey.avbpubkey",
6142 private_key: "testkey.pem",
6143 }
6144
6145 cc_library {
6146 name: "libfoo",
6147 stl: "none",
6148 system_shared_libs: [],
6149 apex_available: ["otherapex"],
6150 }`)
6151
Paul Duffine52e66f2020-03-30 17:54:29 +01006152 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006153 apex {
6154 name: "myapex",
6155 key: "myapex.key",
6156 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006157 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006158 }
6159
6160 apex_key {
6161 name: "myapex.key",
6162 public_key: "testkey.avbpubkey",
6163 private_key: "testkey.pem",
6164 }
6165
6166 cc_library {
6167 name: "libfoo",
6168 stl: "none",
6169 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006170 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006171 apex_available: ["myapex"],
6172 }
6173
6174 cc_library {
6175 name: "libbar",
6176 stl: "none",
6177 system_shared_libs: [],
6178 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006179 }
6180
6181 cc_library {
6182 name: "libbaz",
6183 stl: "none",
6184 system_shared_libs: [],
6185 stubs: {
6186 versions: ["10", "20", "30"],
6187 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006188 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006189}
Jiyong Park127b40b2019-09-30 16:04:35 +09006190
Jiyong Park89e850a2020-04-07 16:37:39 +09006191func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006192 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006193 apex {
6194 name: "myapex",
6195 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006196 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006197 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006198 }
6199
6200 apex_key {
6201 name: "myapex.key",
6202 public_key: "testkey.avbpubkey",
6203 private_key: "testkey.pem",
6204 }
6205
6206 cc_library {
6207 name: "libfoo",
6208 stl: "none",
6209 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006210 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006211 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006212 }
6213
6214 cc_library {
6215 name: "libfoo2",
6216 stl: "none",
6217 system_shared_libs: [],
6218 shared_libs: ["libbaz"],
6219 apex_available: ["//apex_available:platform"],
6220 }
6221
6222 cc_library {
6223 name: "libbar",
6224 stl: "none",
6225 system_shared_libs: [],
6226 apex_available: ["myapex"],
6227 }
6228
6229 cc_library {
6230 name: "libbaz",
6231 stl: "none",
6232 system_shared_libs: [],
6233 apex_available: ["myapex"],
6234 stubs: {
6235 versions: ["1"],
6236 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006237 }`)
6238
Jiyong Park89e850a2020-04-07 16:37:39 +09006239 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6240 // because it depends on libbar which isn't available to platform
6241 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6242 if libfoo.NotAvailableForPlatform() != true {
6243 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6244 }
6245
6246 // libfoo2 however can be available to platform because it depends on libbaz which provides
6247 // stubs
6248 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6249 if libfoo2.NotAvailableForPlatform() == true {
6250 t.Errorf("%q should be available to platform", libfoo2.String())
6251 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006252}
Jiyong Parka90ca002019-10-07 15:47:24 +09006253
Paul Duffine52e66f2020-03-30 17:54:29 +01006254func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006255 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006256 apex {
6257 name: "myapex",
6258 key: "myapex.key",
6259 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006260 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006261 }
6262
6263 apex_key {
6264 name: "myapex.key",
6265 public_key: "testkey.avbpubkey",
6266 private_key: "testkey.pem",
6267 }
6268
6269 cc_library {
6270 name: "libfoo",
6271 stl: "none",
6272 system_shared_libs: [],
6273 apex_available: ["myapex"],
6274 static: {
6275 apex_available: ["//apex_available:platform"],
6276 },
6277 }`)
6278
Jiyong Park89e850a2020-04-07 16:37:39 +09006279 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6280 if libfooShared.NotAvailableForPlatform() != true {
6281 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6282 }
6283 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6284 if libfooStatic.NotAvailableForPlatform() != false {
6285 t.Errorf("%q should be available to platform", libfooStatic.String())
6286 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006287}
6288
Jiyong Park5d790c32019-11-15 18:40:32 +09006289func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006290 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006291 apex {
6292 name: "myapex",
6293 key: "myapex.key",
6294 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006295 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006296 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006297 bootclasspath_fragments: ["mybootclasspath_fragment"],
6298 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6299 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006300 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006301 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006302 }
6303
6304 override_apex {
6305 name: "override_myapex",
6306 base: "myapex",
6307 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006308 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006309 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006310 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6311 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6312 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006313 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006314 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006315 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006316 key: "mynewapex.key",
6317 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006318 }
6319
6320 apex_key {
6321 name: "myapex.key",
6322 public_key: "testkey.avbpubkey",
6323 private_key: "testkey.pem",
6324 }
6325
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006326 apex_key {
6327 name: "mynewapex.key",
6328 public_key: "testkey2.avbpubkey",
6329 private_key: "testkey2.pem",
6330 }
6331
6332 android_app_certificate {
6333 name: "myapex.certificate",
6334 certificate: "testkey",
6335 }
6336
Jiyong Park5d790c32019-11-15 18:40:32 +09006337 android_app {
6338 name: "app",
6339 srcs: ["foo/bar/MyClass.java"],
6340 package_name: "foo",
6341 sdk_version: "none",
6342 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006343 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006344 }
6345
6346 override_android_app {
6347 name: "override_app",
6348 base: "app",
6349 package_name: "bar",
6350 }
markchien7c803b82021-08-26 22:10:06 +08006351
6352 bpf {
6353 name: "bpf",
6354 srcs: ["bpf.c"],
6355 }
6356
6357 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006358 name: "overrideBpf",
6359 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006360 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006361
6362 prebuilt_etc {
6363 name: "myetc",
6364 src: "myprebuilt",
6365 }
6366
6367 prebuilt_etc {
6368 name: "override_myetc",
6369 src: "override_myprebuilt",
6370 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006371
6372 java_library {
6373 name: "bcplib",
6374 srcs: ["a.java"],
6375 compile_dex: true,
6376 apex_available: ["myapex"],
6377 permitted_packages: ["bcp.lib"],
6378 }
6379
6380 bootclasspath_fragment {
6381 name: "mybootclasspath_fragment",
6382 contents: ["bcplib"],
6383 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006384 hidden_api: {
6385 split_packages: ["*"],
6386 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006387 }
6388
6389 java_library {
6390 name: "override_bcplib",
6391 srcs: ["a.java"],
6392 compile_dex: true,
6393 apex_available: ["myapex"],
6394 permitted_packages: ["override.bcp.lib"],
6395 }
6396
6397 bootclasspath_fragment {
6398 name: "override_bootclasspath_fragment",
6399 contents: ["override_bcplib"],
6400 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006401 hidden_api: {
6402 split_packages: ["*"],
6403 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006404 }
6405
6406 java_library {
6407 name: "systemserverlib",
6408 srcs: ["a.java"],
6409 apex_available: ["myapex"],
6410 }
6411
6412 systemserverclasspath_fragment {
6413 name: "mysystemserverclasspath_fragment",
6414 standalone_contents: ["systemserverlib"],
6415 apex_available: ["myapex"],
6416 }
6417
6418 java_library {
6419 name: "override_systemserverlib",
6420 srcs: ["a.java"],
6421 apex_available: ["myapex"],
6422 }
6423
6424 systemserverclasspath_fragment {
6425 name: "override_systemserverclasspath_fragment",
6426 standalone_contents: ["override_systemserverlib"],
6427 apex_available: ["myapex"],
6428 }
6429
6430 java_library {
6431 name: "myjava_library",
6432 srcs: ["a.java"],
6433 compile_dex: true,
6434 apex_available: ["myapex"],
6435 }
6436
6437 java_library {
6438 name: "override_java_library",
6439 srcs: ["a.java"],
6440 compile_dex: true,
6441 apex_available: ["myapex"],
6442 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006443 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006444
Jiyong Park317645e2019-12-05 13:20:58 +09006445 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6446 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6447 if originalVariant.GetOverriddenBy() != "" {
6448 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6449 }
6450 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6451 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6452 }
6453
Jiyong Park5d790c32019-11-15 18:40:32 +09006454 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6455 apexRule := module.Rule("apexRule")
6456 copyCmds := apexRule.Args["copy_commands"]
6457
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006458 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6459 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006460
markchien7c803b82021-08-26 22:10:06 +08006461 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006462 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006463
Daniel Norman5a3ce132021-08-26 15:44:43 -07006464 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6465 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6466
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006467 apexBundle := module.Module().(*apexBundle)
6468 name := apexBundle.Name()
6469 if name != "override_myapex" {
6470 t.Errorf("name should be \"override_myapex\", but was %q", name)
6471 }
6472
Baligh Uddin004d7172020-02-19 21:29:28 -08006473 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6474 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6475 }
6476
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006477 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6478 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6479 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6480 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6481 android.AssertArrayString(t, "Java_libs does not match",
6482 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6483
Jiyong Park20bacab2020-03-03 11:45:41 +09006484 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006485 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006486 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6487
6488 signApkRule := module.Rule("signapk")
6489 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006490
Colin Crossaa255532020-07-03 13:18:24 -07006491 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006492 var builder strings.Builder
6493 data.Custom(&builder, name, "TARGET_", "", data)
6494 androidMk := builder.String()
Prerana Patilb1896c82022-11-09 18:14:34 +00006495 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6496 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6497 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
6498 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6499 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6500 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006501 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006502 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006503 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006504 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006505 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006506 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006507 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6508 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6509 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006510 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006511}
6512
Albert Martineefabcf2022-03-21 20:11:16 +00006513func TestMinSdkVersionOverride(t *testing.T) {
6514 // Override from 29 to 31
6515 minSdkOverride31 := "31"
6516 ctx := testApex(t, `
6517 apex {
6518 name: "myapex",
6519 key: "myapex.key",
6520 native_shared_libs: ["mylib"],
6521 updatable: true,
6522 min_sdk_version: "29"
6523 }
6524
6525 override_apex {
6526 name: "override_myapex",
6527 base: "myapex",
6528 logging_parent: "com.foo.bar",
6529 package_name: "test.overridden.package"
6530 }
6531
6532 apex_key {
6533 name: "myapex.key",
6534 public_key: "testkey.avbpubkey",
6535 private_key: "testkey.pem",
6536 }
6537
6538 cc_library {
6539 name: "mylib",
6540 srcs: ["mylib.cpp"],
6541 runtime_libs: ["libbar"],
6542 system_shared_libs: [],
6543 stl: "none",
6544 apex_available: [ "myapex" ],
6545 min_sdk_version: "apex_inherit"
6546 }
6547
6548 cc_library {
6549 name: "libbar",
6550 srcs: ["mylib.cpp"],
6551 system_shared_libs: [],
6552 stl: "none",
6553 apex_available: [ "myapex" ],
6554 min_sdk_version: "apex_inherit"
6555 }
6556
6557 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6558
6559 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6560 copyCmds := apexRule.Args["copy_commands"]
6561
6562 // Ensure that direct non-stubs dep is always included
6563 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6564
6565 // Ensure that runtime_libs dep in included
6566 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6567
6568 // Ensure libraries target overridden min_sdk_version value
6569 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6570}
6571
6572func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6573 // Attempt to override from 31 to 29, should be a NOOP
6574 minSdkOverride29 := "29"
6575 ctx := testApex(t, `
6576 apex {
6577 name: "myapex",
6578 key: "myapex.key",
6579 native_shared_libs: ["mylib"],
6580 updatable: true,
6581 min_sdk_version: "31"
6582 }
6583
6584 override_apex {
6585 name: "override_myapex",
6586 base: "myapex",
6587 logging_parent: "com.foo.bar",
6588 package_name: "test.overridden.package"
6589 }
6590
6591 apex_key {
6592 name: "myapex.key",
6593 public_key: "testkey.avbpubkey",
6594 private_key: "testkey.pem",
6595 }
6596
6597 cc_library {
6598 name: "mylib",
6599 srcs: ["mylib.cpp"],
6600 runtime_libs: ["libbar"],
6601 system_shared_libs: [],
6602 stl: "none",
6603 apex_available: [ "myapex" ],
6604 min_sdk_version: "apex_inherit"
6605 }
6606
6607 cc_library {
6608 name: "libbar",
6609 srcs: ["mylib.cpp"],
6610 system_shared_libs: [],
6611 stl: "none",
6612 apex_available: [ "myapex" ],
6613 min_sdk_version: "apex_inherit"
6614 }
6615
6616 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6617
6618 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6619 copyCmds := apexRule.Args["copy_commands"]
6620
6621 // Ensure that direct non-stubs dep is always included
6622 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6623
6624 // Ensure that runtime_libs dep in included
6625 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6626
6627 // Ensure libraries target the original min_sdk_version value rather than the overridden
6628 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6629}
6630
Jooyung Han214bf372019-11-12 13:03:50 +09006631func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006632 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006633 apex {
6634 name: "myapex",
6635 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006636 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006637 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006638 }
6639
6640 apex_key {
6641 name: "myapex.key",
6642 public_key: "testkey.avbpubkey",
6643 private_key: "testkey.pem",
6644 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006645
6646 cc_library {
6647 name: "mylib",
6648 srcs: ["mylib.cpp"],
6649 stl: "libc++",
6650 system_shared_libs: [],
6651 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006652 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006653 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006654 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006655
6656 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6657 args := module.Rule("apexRule").Args
6658 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006659 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006660
6661 // The copies of the libraries in the apex should have one more dependency than
6662 // the ones outside the apex, namely the unwinder. Ideally we should check
6663 // the dependency names directly here but for some reason the names are blank in
6664 // this test.
6665 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006666 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006667 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6668 if len(apexImplicits) != len(nonApexImplicits)+1 {
6669 t.Errorf("%q missing unwinder dep", lib)
6670 }
6671 }
Jooyung Han214bf372019-11-12 13:03:50 +09006672}
6673
Paul Duffine05480a2021-03-08 15:07:14 +00006674var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006675 "api/current.txt": nil,
6676 "api/removed.txt": nil,
6677 "api/system-current.txt": nil,
6678 "api/system-removed.txt": nil,
6679 "api/test-current.txt": nil,
6680 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006681
Anton Hanssondff2c782020-12-21 17:10:01 +00006682 "100/public/api/foo.txt": nil,
6683 "100/public/api/foo-removed.txt": nil,
6684 "100/system/api/foo.txt": nil,
6685 "100/system/api/foo-removed.txt": nil,
6686
Paul Duffineedc5d52020-06-12 17:46:39 +01006687 // For java_sdk_library_import
6688 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006689}
6690
Jooyung Han58f26ab2019-12-18 15:34:32 +09006691func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006692 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006693 apex {
6694 name: "myapex",
6695 key: "myapex.key",
6696 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006697 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006698 }
6699
6700 apex_key {
6701 name: "myapex.key",
6702 public_key: "testkey.avbpubkey",
6703 private_key: "testkey.pem",
6704 }
6705
6706 java_sdk_library {
6707 name: "foo",
6708 srcs: ["a.java"],
6709 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006710 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006711 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006712
6713 prebuilt_apis {
6714 name: "sdk",
6715 api_dirs: ["100"],
6716 }
Paul Duffin9b879592020-05-26 13:21:35 +01006717 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006718
6719 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006720 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006721 "javalib/foo.jar",
6722 "etc/permissions/foo.xml",
6723 })
6724 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006725 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006726 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 +09006727}
6728
Paul Duffin9b879592020-05-26 13:21:35 +01006729func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006730 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006731 apex {
6732 name: "myapex",
6733 key: "myapex.key",
6734 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006735 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006736 }
6737
6738 apex_key {
6739 name: "myapex.key",
6740 public_key: "testkey.avbpubkey",
6741 private_key: "testkey.pem",
6742 }
6743
6744 java_sdk_library {
6745 name: "foo",
6746 srcs: ["a.java"],
6747 api_packages: ["foo"],
6748 apex_available: ["myapex"],
6749 sdk_version: "none",
6750 system_modules: "none",
6751 }
6752
6753 java_library {
6754 name: "bar",
6755 srcs: ["a.java"],
6756 libs: ["foo"],
6757 apex_available: ["myapex"],
6758 sdk_version: "none",
6759 system_modules: "none",
6760 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006761
6762 prebuilt_apis {
6763 name: "sdk",
6764 api_dirs: ["100"],
6765 }
Paul Duffin9b879592020-05-26 13:21:35 +01006766 `, withFiles(filesForSdkLibrary))
6767
6768 // java_sdk_library installs both impl jar and permission XML
6769 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6770 "javalib/bar.jar",
6771 "javalib/foo.jar",
6772 "etc/permissions/foo.xml",
6773 })
6774
6775 // The bar library should depend on the implementation jar.
6776 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006777 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006778 t.Errorf("expected %q, found %#q", expected, actual)
6779 }
6780}
6781
6782func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006783 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006784 apex {
6785 name: "myapex",
6786 key: "myapex.key",
6787 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006788 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006789 }
6790
6791 apex_key {
6792 name: "myapex.key",
6793 public_key: "testkey.avbpubkey",
6794 private_key: "testkey.pem",
6795 }
6796
6797 java_sdk_library {
6798 name: "foo",
6799 srcs: ["a.java"],
6800 api_packages: ["foo"],
6801 apex_available: ["myapex"],
6802 sdk_version: "none",
6803 system_modules: "none",
6804 }
6805
6806 java_library {
6807 name: "bar",
6808 srcs: ["a.java"],
6809 libs: ["foo"],
6810 sdk_version: "none",
6811 system_modules: "none",
6812 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006813
6814 prebuilt_apis {
6815 name: "sdk",
6816 api_dirs: ["100"],
6817 }
Paul Duffin9b879592020-05-26 13:21:35 +01006818 `, withFiles(filesForSdkLibrary))
6819
6820 // java_sdk_library installs both impl jar and permission XML
6821 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6822 "javalib/foo.jar",
6823 "etc/permissions/foo.xml",
6824 })
6825
6826 // The bar library should depend on the stubs jar.
6827 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006828 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006829 t.Errorf("expected %q, found %#q", expected, actual)
6830 }
6831}
6832
Paul Duffineedc5d52020-06-12 17:46:39 +01006833func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006834 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006835 prebuilt_apis {
6836 name: "sdk",
6837 api_dirs: ["100"],
6838 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006839 withFiles(map[string][]byte{
6840 "apex/a.java": nil,
6841 "apex/apex_manifest.json": nil,
6842 "apex/Android.bp": []byte(`
6843 package {
6844 default_visibility: ["//visibility:private"],
6845 }
6846
6847 apex {
6848 name: "myapex",
6849 key: "myapex.key",
6850 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006851 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006852 }
6853
6854 apex_key {
6855 name: "myapex.key",
6856 public_key: "testkey.avbpubkey",
6857 private_key: "testkey.pem",
6858 }
6859
6860 java_library {
6861 name: "bar",
6862 srcs: ["a.java"],
6863 libs: ["foo"],
6864 apex_available: ["myapex"],
6865 sdk_version: "none",
6866 system_modules: "none",
6867 }
6868`),
6869 "source/a.java": nil,
6870 "source/api/current.txt": nil,
6871 "source/api/removed.txt": nil,
6872 "source/Android.bp": []byte(`
6873 package {
6874 default_visibility: ["//visibility:private"],
6875 }
6876
6877 java_sdk_library {
6878 name: "foo",
6879 visibility: ["//apex"],
6880 srcs: ["a.java"],
6881 api_packages: ["foo"],
6882 apex_available: ["myapex"],
6883 sdk_version: "none",
6884 system_modules: "none",
6885 public: {
6886 enabled: true,
6887 },
6888 }
6889`),
6890 "prebuilt/a.jar": nil,
6891 "prebuilt/Android.bp": []byte(`
6892 package {
6893 default_visibility: ["//visibility:private"],
6894 }
6895
6896 java_sdk_library_import {
6897 name: "foo",
6898 visibility: ["//apex", "//source"],
6899 apex_available: ["myapex"],
6900 prefer: true,
6901 public: {
6902 jars: ["a.jar"],
6903 },
6904 }
6905`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006906 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006907 )
6908
6909 // java_sdk_library installs both impl jar and permission XML
6910 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6911 "javalib/bar.jar",
6912 "javalib/foo.jar",
6913 "etc/permissions/foo.xml",
6914 })
6915
6916 // The bar library should depend on the implementation jar.
6917 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006918 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006919 t.Errorf("expected %q, found %#q", expected, actual)
6920 }
6921}
6922
6923func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6924 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6925 apex {
6926 name: "myapex",
6927 key: "myapex.key",
6928 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006929 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006930 }
6931
6932 apex_key {
6933 name: "myapex.key",
6934 public_key: "testkey.avbpubkey",
6935 private_key: "testkey.pem",
6936 }
6937
6938 java_sdk_library_import {
6939 name: "foo",
6940 apex_available: ["myapex"],
6941 prefer: true,
6942 public: {
6943 jars: ["a.jar"],
6944 },
6945 }
6946
6947 `, withFiles(filesForSdkLibrary))
6948}
6949
atrost6e126252020-01-27 17:01:16 +00006950func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006951 result := android.GroupFixturePreparers(
6952 prepareForApexTest,
6953 java.PrepareForTestWithPlatformCompatConfig,
6954 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006955 apex {
6956 name: "myapex",
6957 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006958 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006959 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006960 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006961 }
6962
6963 apex_key {
6964 name: "myapex.key",
6965 public_key: "testkey.avbpubkey",
6966 private_key: "testkey.pem",
6967 }
6968
6969 platform_compat_config {
6970 name: "myjar-platform-compat-config",
6971 src: ":myjar",
6972 }
6973
6974 java_library {
6975 name: "myjar",
6976 srcs: ["foo/bar/MyClass.java"],
6977 sdk_version: "none",
6978 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006979 apex_available: [ "myapex" ],
6980 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006981
6982 // Make sure that a preferred prebuilt does not affect the apex contents.
6983 prebuilt_platform_compat_config {
6984 name: "myjar-platform-compat-config",
6985 metadata: "compat-config/metadata.xml",
6986 prefer: true,
6987 }
atrost6e126252020-01-27 17:01:16 +00006988 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006989 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006990 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6991 "etc/compatconfig/myjar-platform-compat-config.xml",
6992 "javalib/myjar.jar",
6993 })
6994}
6995
Jiyong Park479321d2019-12-16 11:47:12 +09006996func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6997 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6998 apex {
6999 name: "myapex",
7000 key: "myapex.key",
7001 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007002 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007003 }
7004
7005 apex_key {
7006 name: "myapex.key",
7007 public_key: "testkey.avbpubkey",
7008 private_key: "testkey.pem",
7009 }
7010
7011 java_library {
7012 name: "myjar",
7013 srcs: ["foo/bar/MyClass.java"],
7014 sdk_version: "none",
7015 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007016 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007017 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007018 }
7019 `)
7020}
7021
Jiyong Park7afd1072019-12-30 16:56:33 +09007022func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007023 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007024 apex {
7025 name: "myapex",
7026 key: "myapex.key",
7027 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007028 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007029 }
7030
7031 apex_key {
7032 name: "myapex.key",
7033 public_key: "testkey.avbpubkey",
7034 private_key: "testkey.pem",
7035 }
7036
7037 cc_library {
7038 name: "mylib",
7039 srcs: ["mylib.cpp"],
7040 system_shared_libs: [],
7041 stl: "none",
7042 required: ["a", "b"],
7043 host_required: ["c", "d"],
7044 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007045 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007046 }
7047 `)
7048
7049 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007050 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007051 name := apexBundle.BaseModuleName()
7052 prefix := "TARGET_"
7053 var builder strings.Builder
7054 data.Custom(&builder, name, prefix, "", data)
7055 androidMk := builder.String()
7056 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
7057 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
7058 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
7059}
7060
Jiyong Park7cd10e32020-01-14 09:22:18 +09007061func TestSymlinksFromApexToSystem(t *testing.T) {
7062 bp := `
7063 apex {
7064 name: "myapex",
7065 key: "myapex.key",
7066 native_shared_libs: ["mylib"],
7067 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007068 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007069 }
7070
Jiyong Park9d677202020-02-19 16:29:35 +09007071 apex {
7072 name: "myapex.updatable",
7073 key: "myapex.key",
7074 native_shared_libs: ["mylib"],
7075 java_libs: ["myjar"],
7076 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007077 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007078 }
7079
Jiyong Park7cd10e32020-01-14 09:22:18 +09007080 apex_key {
7081 name: "myapex.key",
7082 public_key: "testkey.avbpubkey",
7083 private_key: "testkey.pem",
7084 }
7085
7086 cc_library {
7087 name: "mylib",
7088 srcs: ["mylib.cpp"],
7089 shared_libs: ["myotherlib"],
7090 system_shared_libs: [],
7091 stl: "none",
7092 apex_available: [
7093 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007094 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007095 "//apex_available:platform",
7096 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007097 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007098 }
7099
7100 cc_library {
7101 name: "myotherlib",
7102 srcs: ["mylib.cpp"],
7103 system_shared_libs: [],
7104 stl: "none",
7105 apex_available: [
7106 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007107 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007108 "//apex_available:platform",
7109 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007110 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007111 }
7112
7113 java_library {
7114 name: "myjar",
7115 srcs: ["foo/bar/MyClass.java"],
7116 sdk_version: "none",
7117 system_modules: "none",
7118 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007119 apex_available: [
7120 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007121 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007122 "//apex_available:platform",
7123 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007124 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007125 }
7126
7127 java_library {
7128 name: "myotherjar",
7129 srcs: ["foo/bar/MyClass.java"],
7130 sdk_version: "none",
7131 system_modules: "none",
7132 apex_available: [
7133 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007134 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007135 "//apex_available:platform",
7136 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007137 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007138 }
7139 `
7140
7141 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7142 for _, f := range files {
7143 if f.path == file {
7144 if f.isLink {
7145 t.Errorf("%q is not a real file", file)
7146 }
7147 return
7148 }
7149 }
7150 t.Errorf("%q is not found", file)
7151 }
7152
7153 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7154 for _, f := range files {
7155 if f.path == file {
7156 if !f.isLink {
7157 t.Errorf("%q is not a symlink", file)
7158 }
7159 return
7160 }
7161 }
7162 t.Errorf("%q is not found", file)
7163 }
7164
Jiyong Park9d677202020-02-19 16:29:35 +09007165 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7166 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007167 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007168 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007169 ensureRealfileExists(t, files, "javalib/myjar.jar")
7170 ensureRealfileExists(t, files, "lib64/mylib.so")
7171 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7172
Jiyong Park9d677202020-02-19 16:29:35 +09007173 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7174 ensureRealfileExists(t, files, "javalib/myjar.jar")
7175 ensureRealfileExists(t, files, "lib64/mylib.so")
7176 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7177
7178 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007179 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007180 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007181 ensureRealfileExists(t, files, "javalib/myjar.jar")
7182 ensureRealfileExists(t, files, "lib64/mylib.so")
7183 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007184
7185 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7186 ensureRealfileExists(t, files, "javalib/myjar.jar")
7187 ensureRealfileExists(t, files, "lib64/mylib.so")
7188 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007189}
7190
Yo Chiange8128052020-07-23 20:09:18 +08007191func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007192 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007193 apex {
7194 name: "myapex",
7195 key: "myapex.key",
7196 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007197 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007198 }
7199
7200 apex_key {
7201 name: "myapex.key",
7202 public_key: "testkey.avbpubkey",
7203 private_key: "testkey.pem",
7204 }
7205
7206 cc_library_shared {
7207 name: "mylib",
7208 srcs: ["mylib.cpp"],
7209 shared_libs: ["myotherlib"],
7210 system_shared_libs: [],
7211 stl: "none",
7212 apex_available: [
7213 "myapex",
7214 "//apex_available:platform",
7215 ],
7216 }
7217
7218 cc_prebuilt_library_shared {
7219 name: "myotherlib",
7220 srcs: ["prebuilt.so"],
7221 system_shared_libs: [],
7222 stl: "none",
7223 apex_available: [
7224 "myapex",
7225 "//apex_available:platform",
7226 ],
7227 }
7228 `)
7229
Prerana Patilb1896c82022-11-09 18:14:34 +00007230 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007231 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007232 var builder strings.Builder
7233 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7234 androidMk := builder.String()
7235 // `myotherlib` is added to `myapex` as symlink
Prerana Patilb1896c82022-11-09 18:14:34 +00007236 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007237 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7238 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7239 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Prerana Patilb1896c82022-11-09 18:14:34 +00007240 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex:64 myotherlib:64 apex_manifest.pb.myapex apex_pubkey.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007241}
7242
Jooyung Han643adc42020-02-27 13:50:06 +09007243func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007244 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007245 apex {
7246 name: "myapex",
7247 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007248 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007249 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007250 }
7251
7252 apex_key {
7253 name: "myapex.key",
7254 public_key: "testkey.avbpubkey",
7255 private_key: "testkey.pem",
7256 }
7257
7258 cc_library {
7259 name: "mylib",
7260 srcs: ["mylib.cpp"],
7261 shared_libs: ["mylib2"],
7262 system_shared_libs: [],
7263 stl: "none",
7264 apex_available: [ "myapex" ],
7265 }
7266
7267 cc_library {
7268 name: "mylib2",
7269 srcs: ["mylib.cpp"],
7270 system_shared_libs: [],
7271 stl: "none",
7272 apex_available: [ "myapex" ],
7273 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007274
7275 rust_ffi_shared {
7276 name: "libfoo.rust",
7277 crate_name: "foo",
7278 srcs: ["foo.rs"],
7279 shared_libs: ["libfoo.shared_from_rust"],
7280 prefer_rlib: true,
7281 apex_available: ["myapex"],
7282 }
7283
7284 cc_library_shared {
7285 name: "libfoo.shared_from_rust",
7286 srcs: ["mylib.cpp"],
7287 system_shared_libs: [],
7288 stl: "none",
7289 stubs: {
7290 versions: ["10", "11", "12"],
7291 },
7292 }
7293
Jooyung Han643adc42020-02-27 13:50:06 +09007294 `)
7295
7296 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7297 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007298 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007299 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7300 "lib64/mylib.so",
7301 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007302 "lib64/libfoo.rust.so",
7303 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7304 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007305 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007306
7307 // b/220397949
7308 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007309}
7310
Jooyung Han49f67012020-04-17 13:43:10 +09007311func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007312 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007313 apex {
7314 name: "myapex",
7315 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007316 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007317 }
7318 apex_key {
7319 name: "myapex.key",
7320 public_key: "testkey.avbpubkey",
7321 private_key: "testkey.pem",
7322 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007323 `,
7324 android.FixtureModifyConfig(func(config android.Config) {
7325 delete(config.Targets, android.Android)
7326 config.AndroidCommonTarget = android.Target{}
7327 }),
7328 )
Jooyung Han49f67012020-04-17 13:43:10 +09007329
7330 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7331 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7332 }
7333}
7334
Jiyong Parkbd159612020-02-28 15:22:21 +09007335func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007336 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007337 apex {
7338 name: "myapex",
7339 key: "myapex.key",
7340 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007341 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007342 }
7343
7344 apex_key {
7345 name: "myapex.key",
7346 public_key: "testkey.avbpubkey",
7347 private_key: "testkey.pem",
7348 }
7349
7350 android_app {
7351 name: "AppFoo",
7352 srcs: ["foo/bar/MyClass.java"],
7353 sdk_version: "none",
7354 system_modules: "none",
7355 apex_available: [ "myapex" ],
7356 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007357 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007358
Colin Crosscf371cc2020-11-13 11:48:42 -08007359 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007360 content := bundleConfigRule.Args["content"]
7361
7362 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007363 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 +09007364}
7365
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007366func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007367 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007368 apex {
7369 name: "myapex",
7370 key: "myapex.key",
7371 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007372 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007373 }
7374
7375 apex_key {
7376 name: "myapex.key",
7377 public_key: "testkey.avbpubkey",
7378 private_key: "testkey.pem",
7379 }
7380
7381 android_app_set {
7382 name: "AppSet",
7383 set: "AppSet.apks",
7384 }`)
7385 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007386 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007387 content := bundleConfigRule.Args["content"]
7388 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7389 s := mod.Rule("apexRule").Args["copy_commands"]
7390 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007391 if len(copyCmds) != 4 {
7392 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007393 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007394 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7395 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007396 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7397 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007398
7399 // Ensure that canned_fs_config has an entry for the app set zip file
7400 generateFsRule := mod.Rule("generateFsConfig")
7401 cmd := generateFsRule.RuleParams.Command
7402 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007403}
7404
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007405func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007406 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007407 apex_set {
7408 name: "myapex",
7409 filename: "foo_v2.apex",
7410 sanitized: {
7411 none: { set: "myapex.apks", },
7412 hwaddress: { set: "myapex.hwasan.apks", },
7413 },
Paul Duffin24704672021-04-06 16:09:30 +01007414 }
7415 `
7416 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007417
Paul Duffin24704672021-04-06 16:09:30 +01007418 // Check that the extractor produces the correct output file from the correct input file.
7419 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007420
Paul Duffin24704672021-04-06 16:09:30 +01007421 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7422 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007423
Paul Duffin24704672021-04-06 16:09:30 +01007424 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7425
7426 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007427 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7428 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007429
7430 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007431}
7432
Pranav Guptaeba03b02022-09-27 00:27:08 +00007433func TestApexSetApksModuleAssignment(t *testing.T) {
7434 ctx := testApex(t, `
7435 apex_set {
7436 name: "myapex",
7437 set: ":myapex_apks_file",
7438 }
7439
7440 filegroup {
7441 name: "myapex_apks_file",
7442 srcs: ["myapex.apks"],
7443 }
7444 `)
7445
7446 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7447
7448 // Check that the extractor produces the correct apks file from the input module
7449 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7450 extractedApex := m.Output(extractorOutput)
7451
7452 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7453}
7454
Paul Duffin89f570a2021-06-16 01:42:33 +01007455func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007456 t.Helper()
7457
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007458 bp := `
7459 java_library {
7460 name: "some-updatable-apex-lib",
7461 srcs: ["a.java"],
7462 sdk_version: "current",
7463 apex_available: [
7464 "some-updatable-apex",
7465 ],
satayevabcd5972021-08-06 17:49:46 +01007466 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007467 }
7468
7469 java_library {
7470 name: "some-non-updatable-apex-lib",
7471 srcs: ["a.java"],
7472 apex_available: [
7473 "some-non-updatable-apex",
7474 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007475 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007476 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007477 }
7478
7479 bootclasspath_fragment {
7480 name: "some-non-updatable-fragment",
7481 contents: ["some-non-updatable-apex-lib"],
7482 apex_available: [
7483 "some-non-updatable-apex",
7484 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007485 hidden_api: {
7486 split_packages: ["*"],
7487 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007488 }
7489
7490 java_library {
7491 name: "some-platform-lib",
7492 srcs: ["a.java"],
7493 sdk_version: "current",
7494 installable: true,
7495 }
7496
7497 java_library {
7498 name: "some-art-lib",
7499 srcs: ["a.java"],
7500 sdk_version: "current",
7501 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007502 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007503 ],
7504 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007505 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007506 }
7507
7508 apex {
7509 name: "some-updatable-apex",
7510 key: "some-updatable-apex.key",
7511 java_libs: ["some-updatable-apex-lib"],
7512 updatable: true,
7513 min_sdk_version: "current",
7514 }
7515
7516 apex {
7517 name: "some-non-updatable-apex",
7518 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007519 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007520 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007521 }
7522
7523 apex_key {
7524 name: "some-updatable-apex.key",
7525 }
7526
7527 apex_key {
7528 name: "some-non-updatable-apex.key",
7529 }
7530
7531 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007532 name: "com.android.art.debug",
7533 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007534 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007535 updatable: true,
7536 min_sdk_version: "current",
7537 }
7538
Paul Duffinf23bc472021-04-27 12:42:20 +01007539 bootclasspath_fragment {
7540 name: "art-bootclasspath-fragment",
7541 image_name: "art",
7542 contents: ["some-art-lib"],
7543 apex_available: [
7544 "com.android.art.debug",
7545 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007546 hidden_api: {
7547 split_packages: ["*"],
7548 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007549 }
7550
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007551 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007552 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007553 }
7554
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007555 filegroup {
7556 name: "some-updatable-apex-file_contexts",
7557 srcs: [
7558 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7559 ],
7560 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007561
7562 filegroup {
7563 name: "some-non-updatable-apex-file_contexts",
7564 srcs: [
7565 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7566 ],
7567 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007568 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007569
Paul Duffin89f570a2021-06-16 01:42:33 +01007570 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007571}
7572
Paul Duffin89f570a2021-06-16 01:42:33 +01007573func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007574 t.Helper()
7575
Paul Duffin55607122021-03-30 23:32:51 +01007576 fs := android.MockFS{
7577 "a.java": nil,
7578 "a.jar": nil,
7579 "apex_manifest.json": nil,
7580 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007581 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007582 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7583 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7584 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007585 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007586 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007587
Paul Duffin55607122021-03-30 23:32:51 +01007588 errorHandler := android.FixtureExpectsNoErrors
7589 if errmsg != "" {
7590 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007591 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007592
Paul Duffin55607122021-03-30 23:32:51 +01007593 result := android.GroupFixturePreparers(
7594 cc.PrepareForTestWithCcDefaultModules,
7595 java.PrepareForTestWithHiddenApiBuildComponents,
7596 java.PrepareForTestWithJavaDefaultModules,
7597 java.PrepareForTestWithJavaSdkLibraryFiles,
7598 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007599 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007600 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007601 android.FixtureModifyMockFS(func(fs android.MockFS) {
7602 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7603 insert := ""
7604 for _, fragment := range fragments {
7605 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7606 }
7607 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7608 platform_bootclasspath {
7609 name: "platform-bootclasspath",
7610 fragments: [
7611 %s
7612 ],
7613 }
7614 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007615 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007616 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007617 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007618 ).
7619 ExtendWithErrorHandler(errorHandler).
7620 RunTestWithBp(t, bp)
7621
7622 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007623}
7624
Paul Duffin5556c5f2022-06-09 17:32:21 +00007625func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007626 preparers := android.GroupFixturePreparers(
7627 java.PrepareForTestWithJavaDefaultModules,
7628 PrepareForTestWithApexBuildComponents,
7629 ).
7630 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7631 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7632
7633 bpBase := `
7634 apex_set {
7635 name: "com.android.myapex",
7636 installable: true,
7637 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7638 set: "myapex.apks",
7639 }
7640
7641 apex_set {
7642 name: "com.mycompany.android.myapex",
7643 apex_name: "com.android.myapex",
7644 installable: true,
7645 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7646 set: "company-myapex.apks",
7647 }
7648
7649 prebuilt_bootclasspath_fragment {
7650 name: "my-bootclasspath-fragment",
7651 apex_available: ["com.android.myapex"],
7652 %s
7653 }
7654 `
7655
7656 t.Run("java_import", func(t *testing.T) {
7657 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7658 java_import {
7659 name: "libfoo",
7660 jars: ["libfoo.jar"],
7661 apex_available: ["com.android.myapex"],
7662 }
7663 `)
7664 })
7665
7666 t.Run("java_sdk_library_import", func(t *testing.T) {
7667 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7668 java_sdk_library_import {
7669 name: "libfoo",
7670 public: {
7671 jars: ["libbar.jar"],
7672 },
7673 apex_available: ["com.android.myapex"],
7674 }
7675 `)
7676 })
7677
7678 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7679 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7680 image_name: "art",
7681 contents: ["libfoo"],
7682 `)+`
7683 java_sdk_library_import {
7684 name: "libfoo",
7685 public: {
7686 jars: ["libbar.jar"],
7687 },
7688 apex_available: ["com.android.myapex"],
7689 }
7690 `)
7691 })
7692}
7693
Paul Duffin5556c5f2022-06-09 17:32:21 +00007694func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7695 preparers := android.GroupFixturePreparers(
7696 java.PrepareForTestWithJavaDefaultModules,
7697 PrepareForTestWithApexBuildComponents,
7698 )
7699
7700 bpBase := `
7701 apex_set {
7702 name: "com.android.myapex",
7703 installable: true,
7704 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7705 set: "myapex.apks",
7706 }
7707
7708 apex_set {
7709 name: "com.android.myapex_compressed",
7710 apex_name: "com.android.myapex",
7711 installable: true,
7712 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7713 set: "myapex_compressed.apks",
7714 }
7715
7716 prebuilt_bootclasspath_fragment {
7717 name: "my-bootclasspath-fragment",
7718 apex_available: [
7719 "com.android.myapex",
7720 "com.android.myapex_compressed",
7721 ],
7722 hidden_api: {
7723 annotation_flags: "annotation-flags.csv",
7724 metadata: "metadata.csv",
7725 index: "index.csv",
7726 signature_patterns: "signature_patterns.csv",
7727 },
7728 %s
7729 }
7730 `
7731
7732 t.Run("java_import", func(t *testing.T) {
7733 result := preparers.RunTestWithBp(t,
7734 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7735 java_import {
7736 name: "libfoo",
7737 jars: ["libfoo.jar"],
7738 apex_available: [
7739 "com.android.myapex",
7740 "com.android.myapex_compressed",
7741 ],
7742 }
7743 `)
7744
7745 module := result.Module("libfoo", "android_common_com.android.myapex")
7746 usesLibraryDep := module.(java.UsesLibraryDependency)
7747 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7748 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7749 usesLibraryDep.DexJarBuildPath().Path())
7750 })
7751
7752 t.Run("java_sdk_library_import", func(t *testing.T) {
7753 result := preparers.RunTestWithBp(t,
7754 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7755 java_sdk_library_import {
7756 name: "libfoo",
7757 public: {
7758 jars: ["libbar.jar"],
7759 },
7760 apex_available: [
7761 "com.android.myapex",
7762 "com.android.myapex_compressed",
7763 ],
7764 compile_dex: true,
7765 }
7766 `)
7767
7768 module := result.Module("libfoo", "android_common_com.android.myapex")
7769 usesLibraryDep := module.(java.UsesLibraryDependency)
7770 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7771 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7772 usesLibraryDep.DexJarBuildPath().Path())
7773 })
7774
7775 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7776 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7777 image_name: "art",
7778 contents: ["libfoo"],
7779 `)+`
7780 java_sdk_library_import {
7781 name: "libfoo",
7782 public: {
7783 jars: ["libbar.jar"],
7784 },
7785 apex_available: [
7786 "com.android.myapex",
7787 "com.android.myapex_compressed",
7788 ],
7789 compile_dex: true,
7790 }
7791 `)
7792 })
7793}
7794
Jooyung Han548640b2020-04-27 12:10:30 +09007795func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7796 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7797 apex {
7798 name: "myapex",
7799 key: "myapex.key",
7800 updatable: true,
7801 }
7802
7803 apex_key {
7804 name: "myapex.key",
7805 public_key: "testkey.avbpubkey",
7806 private_key: "testkey.pem",
7807 }
7808 `)
7809}
7810
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007811func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7812 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7813 apex {
7814 name: "myapex",
7815 key: "myapex.key",
7816 }
7817
7818 apex_key {
7819 name: "myapex.key",
7820 public_key: "testkey.avbpubkey",
7821 private_key: "testkey.pem",
7822 }
7823 `)
7824}
7825
Daniel Norman69109112021-12-02 12:52:42 -08007826func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7827 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7828 apex {
7829 name: "myapex",
7830 key: "myapex.key",
7831 updatable: true,
7832 soc_specific: true,
7833 }
7834
7835 apex_key {
7836 name: "myapex.key",
7837 public_key: "testkey.avbpubkey",
7838 private_key: "testkey.pem",
7839 }
7840 `)
7841}
7842
satayevb98371c2021-06-15 16:49:50 +01007843func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7844 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7845 apex {
7846 name: "myapex",
7847 key: "myapex.key",
7848 systemserverclasspath_fragments: [
7849 "mysystemserverclasspathfragment",
7850 ],
7851 min_sdk_version: "29",
7852 updatable: true,
7853 }
7854
7855 apex_key {
7856 name: "myapex.key",
7857 public_key: "testkey.avbpubkey",
7858 private_key: "testkey.pem",
7859 }
7860
7861 java_library {
7862 name: "foo",
7863 srcs: ["b.java"],
7864 min_sdk_version: "29",
7865 installable: true,
7866 apex_available: [
7867 "myapex",
7868 ],
7869 }
7870
7871 systemserverclasspath_fragment {
7872 name: "mysystemserverclasspathfragment",
7873 generate_classpaths_proto: false,
7874 contents: [
7875 "foo",
7876 ],
7877 apex_available: [
7878 "myapex",
7879 ],
7880 }
satayevabcd5972021-08-06 17:49:46 +01007881 `,
7882 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7883 )
satayevb98371c2021-06-15 16:49:50 +01007884}
7885
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007886func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007887 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7888 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7889 // modules to be included in the BootJars.
7890 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7891 return android.GroupFixturePreparers(
7892 dexpreopt.FixtureSetBootJars(bootJars...),
7893 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7894 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7895 }),
7896 )
7897 }
7898
7899 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7900 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7901 // specified in the ArtApexJars configuration.
7902 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7903 return android.GroupFixturePreparers(
7904 dexpreopt.FixtureSetArtBootJars(bootJars...),
7905 dexpreopt.FixtureSetBootJars(bootJars...),
7906 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7907 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7908 }),
7909 )
7910 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007911
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007912 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007913 preparer := android.GroupFixturePreparers(
7914 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7915 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7916 )
7917 fragments := []java.ApexVariantReference{
7918 {
7919 Apex: proptools.StringPtr("com.android.art.debug"),
7920 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7921 },
7922 {
7923 Apex: proptools.StringPtr("some-non-updatable-apex"),
7924 Module: proptools.StringPtr("some-non-updatable-fragment"),
7925 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007926 }
satayevabcd5972021-08-06 17:49:46 +01007927 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007928 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007929
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007930 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007931 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7932 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007933 preparer := android.GroupFixturePreparers(
7934 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7935 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7936 )
Paul Duffin60264a02021-04-12 20:02:36 +01007937 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007938 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007939
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007940 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007941 err := `ArtApexJars expects this to be in apex "some-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01007942 // Update the dexpreopt ArtApexJars directly.
7943 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7944 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007945 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007946
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007947 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007948 err := `ArtApexJars expects this to be in apex "some-non-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01007949 // Update the dexpreopt ArtApexJars directly.
7950 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7951 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007952 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007953
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007954 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007955 err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the framework boot image`
satayevabcd5972021-08-06 17:49:46 +01007956 preparer := android.GroupFixturePreparers(
7957 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7958 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7959 )
Paul Duffin60264a02021-04-12 20:02:36 +01007960 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007961 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007962
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007963 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007964 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007965 fragment := java.ApexVariantReference{
7966 Apex: proptools.StringPtr("some-non-updatable-apex"),
7967 Module: proptools.StringPtr("some-non-updatable-fragment"),
7968 }
7969 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007970 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007971
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007972 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007973 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007974 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7975 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007976 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007977
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007978 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007979 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007980 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7981 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007982 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007983
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007984 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007985 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007986 // Update the dexpreopt ArtApexJars directly.
7987 preparer := prepareSetArtJars("platform:some-platform-lib")
7988 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007989 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007990
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007991 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007992 preparer := android.GroupFixturePreparers(
7993 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7994 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7995 )
7996 fragments := []java.ApexVariantReference{
7997 {
7998 Apex: proptools.StringPtr("some-non-updatable-apex"),
7999 Module: proptools.StringPtr("some-non-updatable-fragment"),
8000 },
8001 }
8002 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008003 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008004}
8005
8006func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008007 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008008 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008009 fragment := java.ApexVariantReference{
8010 Apex: proptools.StringPtr("myapex"),
8011 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8012 }
8013
Paul Duffin064b70c2020-11-02 17:32:38 +00008014 testDexpreoptWithApexes(t, `
8015 prebuilt_apex {
8016 name: "myapex" ,
8017 arch: {
8018 arm64: {
8019 src: "myapex-arm64.apex",
8020 },
8021 arm: {
8022 src: "myapex-arm.apex",
8023 },
8024 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008025 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8026 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008027
Paul Duffin89f570a2021-06-16 01:42:33 +01008028 prebuilt_bootclasspath_fragment {
8029 name: "my-bootclasspath-fragment",
8030 contents: ["libfoo"],
8031 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008032 hidden_api: {
8033 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8034 metadata: "my-bootclasspath-fragment/metadata.csv",
8035 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008036 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8037 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8038 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008039 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008040 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008041
Paul Duffin89f570a2021-06-16 01:42:33 +01008042 java_import {
8043 name: "libfoo",
8044 jars: ["libfoo.jar"],
8045 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008046 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008047 }
8048 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008049 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008050}
8051
Spandan Dasf14e2542021-11-12 00:01:37 +00008052func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008053 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008054 bp += `
8055 apex_key {
8056 name: "myapex.key",
8057 public_key: "testkey.avbpubkey",
8058 private_key: "testkey.pem",
8059 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008060 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008061 "lib1/src/A.java": nil,
8062 "lib2/src/B.java": nil,
8063 "system/sepolicy/apex/myapex-file_contexts": nil,
8064 }
8065
Paul Duffin45338f02021-03-30 23:07:52 +01008066 errorHandler := android.FixtureExpectsNoErrors
8067 if errmsg != "" {
8068 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008069 }
Colin Crossae8600b2020-10-29 17:09:13 -07008070
Paul Duffin45338f02021-03-30 23:07:52 +01008071 android.GroupFixturePreparers(
8072 android.PrepareForTestWithAndroidBuildComponents,
8073 java.PrepareForTestWithJavaBuildComponents,
8074 PrepareForTestWithApexBuildComponents,
8075 android.PrepareForTestWithNeverallowRules(rules),
8076 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008077 apexBootJars := make([]string, 0, len(bootJars))
8078 for _, apexBootJar := range bootJars {
8079 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008080 }
satayevd604b212021-07-21 14:23:52 +01008081 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008082 }),
8083 fs.AddToFixture(),
8084 ).
8085 ExtendWithErrorHandler(errorHandler).
8086 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008087}
8088
8089func TestApexPermittedPackagesRules(t *testing.T) {
8090 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008091 name string
8092 expectedError string
8093 bp string
8094 bootJars []string
8095 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008096 }{
8097
8098 {
8099 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8100 expectedError: "",
8101 bp: `
8102 java_library {
8103 name: "bcp_lib1",
8104 srcs: ["lib1/src/*.java"],
8105 permitted_packages: ["foo.bar"],
8106 apex_available: ["myapex"],
8107 sdk_version: "none",
8108 system_modules: "none",
8109 }
8110 java_library {
8111 name: "nonbcp_lib2",
8112 srcs: ["lib2/src/*.java"],
8113 apex_available: ["myapex"],
8114 permitted_packages: ["a.b"],
8115 sdk_version: "none",
8116 system_modules: "none",
8117 }
8118 apex {
8119 name: "myapex",
8120 key: "myapex.key",
8121 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008122 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008123 }`,
8124 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008125 bcpPermittedPackages: map[string][]string{
8126 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008127 "foo.bar",
8128 },
8129 },
8130 },
8131 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008132 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008133 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 +01008134 bp: `
8135 java_library {
8136 name: "bcp_lib1",
8137 srcs: ["lib1/src/*.java"],
8138 apex_available: ["myapex"],
8139 permitted_packages: ["foo.bar"],
8140 sdk_version: "none",
8141 system_modules: "none",
8142 }
8143 java_library {
8144 name: "bcp_lib2",
8145 srcs: ["lib2/src/*.java"],
8146 apex_available: ["myapex"],
8147 permitted_packages: ["foo.bar", "bar.baz"],
8148 sdk_version: "none",
8149 system_modules: "none",
8150 }
8151 apex {
8152 name: "myapex",
8153 key: "myapex.key",
8154 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008155 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008156 }
8157 `,
8158 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008159 bcpPermittedPackages: map[string][]string{
8160 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008161 "foo.bar",
8162 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008163 "bcp_lib2": []string{
8164 "foo.bar",
8165 },
8166 },
8167 },
8168 {
8169 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8170 expectedError: "",
8171 bp: `
8172 java_library {
8173 name: "bcp_lib_restricted",
8174 srcs: ["lib1/src/*.java"],
8175 apex_available: ["myapex"],
8176 permitted_packages: ["foo.bar"],
8177 sdk_version: "none",
8178 min_sdk_version: "29",
8179 system_modules: "none",
8180 }
8181 java_library {
8182 name: "bcp_lib_unrestricted",
8183 srcs: ["lib2/src/*.java"],
8184 apex_available: ["myapex"],
8185 permitted_packages: ["foo.bar", "bar.baz"],
8186 sdk_version: "none",
8187 min_sdk_version: "29",
8188 system_modules: "none",
8189 }
8190 apex {
8191 name: "myapex",
8192 key: "myapex.key",
8193 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8194 updatable: true,
8195 min_sdk_version: "29",
8196 }
8197 `,
8198 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8199 bcpPermittedPackages: map[string][]string{
8200 "bcp_lib1_non_updateable": []string{
8201 "foo.bar",
8202 },
8203 // 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 +01008204 },
8205 },
8206 }
8207 for _, tc := range testcases {
8208 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008209 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8210 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008211 })
8212 }
8213}
8214
Jiyong Park62304bb2020-04-13 16:19:48 +09008215func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008216 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008217 apex {
8218 name: "myapex",
8219 key: "myapex.key",
8220 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008221 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008222 }
8223
8224 apex_key {
8225 name: "myapex.key",
8226 public_key: "testkey.avbpubkey",
8227 private_key: "testkey.pem",
8228 }
8229
8230 cc_library {
8231 name: "mylib",
8232 srcs: ["mylib.cpp"],
8233 system_shared_libs: [],
8234 stl: "none",
8235 stubs: {
8236 versions: ["1"],
8237 },
8238 apex_available: ["myapex"],
8239 }
8240
8241 cc_library {
8242 name: "myprivlib",
8243 srcs: ["mylib.cpp"],
8244 system_shared_libs: [],
8245 stl: "none",
8246 apex_available: ["myapex"],
8247 }
8248
8249
8250 cc_test {
8251 name: "mytest",
8252 gtest: false,
8253 srcs: ["mylib.cpp"],
8254 system_shared_libs: [],
8255 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008256 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008257 test_for: ["myapex"]
8258 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008259
8260 cc_library {
8261 name: "mytestlib",
8262 srcs: ["mylib.cpp"],
8263 system_shared_libs: [],
8264 shared_libs: ["mylib", "myprivlib"],
8265 stl: "none",
8266 test_for: ["myapex"],
8267 }
8268
8269 cc_benchmark {
8270 name: "mybench",
8271 srcs: ["mylib.cpp"],
8272 system_shared_libs: [],
8273 shared_libs: ["mylib", "myprivlib"],
8274 stl: "none",
8275 test_for: ["myapex"],
8276 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008277 `)
8278
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008279 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008280 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008281 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8282 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8283 }
8284
8285 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008286 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008287 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8288 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8289 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8290}
Jiyong Park46a512f2020-12-04 18:02:13 +09008291
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008292func TestIndirectTestFor(t *testing.T) {
8293 ctx := testApex(t, `
8294 apex {
8295 name: "myapex",
8296 key: "myapex.key",
8297 native_shared_libs: ["mylib", "myprivlib"],
8298 updatable: false,
8299 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008300
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008301 apex_key {
8302 name: "myapex.key",
8303 public_key: "testkey.avbpubkey",
8304 private_key: "testkey.pem",
8305 }
8306
8307 cc_library {
8308 name: "mylib",
8309 srcs: ["mylib.cpp"],
8310 system_shared_libs: [],
8311 stl: "none",
8312 stubs: {
8313 versions: ["1"],
8314 },
8315 apex_available: ["myapex"],
8316 }
8317
8318 cc_library {
8319 name: "myprivlib",
8320 srcs: ["mylib.cpp"],
8321 system_shared_libs: [],
8322 stl: "none",
8323 shared_libs: ["mylib"],
8324 apex_available: ["myapex"],
8325 }
8326
8327 cc_library {
8328 name: "mytestlib",
8329 srcs: ["mylib.cpp"],
8330 system_shared_libs: [],
8331 shared_libs: ["myprivlib"],
8332 stl: "none",
8333 test_for: ["myapex"],
8334 }
8335 `)
8336
8337 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008338 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008339 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8340 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8341 }
8342
8343 // The platform variant of mytestlib links to the platform variant of the
8344 // internal myprivlib.
8345 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8346
8347 // The platform variant of myprivlib links to the platform variant of mylib
8348 // and bypasses its stubs.
8349 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 +09008350}
8351
Martin Stjernholmec009002021-03-27 15:18:31 +00008352func TestTestForForLibInOtherApex(t *testing.T) {
8353 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8354 _ = testApex(t, `
8355 apex {
8356 name: "com.android.art",
8357 key: "myapex.key",
8358 native_shared_libs: ["mylib"],
8359 updatable: false,
8360 }
8361
8362 apex {
8363 name: "com.android.art.debug",
8364 key: "myapex.key",
8365 native_shared_libs: ["mylib", "mytestlib"],
8366 updatable: false,
8367 }
8368
8369 apex_key {
8370 name: "myapex.key",
8371 public_key: "testkey.avbpubkey",
8372 private_key: "testkey.pem",
8373 }
8374
8375 cc_library {
8376 name: "mylib",
8377 srcs: ["mylib.cpp"],
8378 system_shared_libs: [],
8379 stl: "none",
8380 stubs: {
8381 versions: ["1"],
8382 },
8383 apex_available: ["com.android.art", "com.android.art.debug"],
8384 }
8385
8386 cc_library {
8387 name: "mytestlib",
8388 srcs: ["mylib.cpp"],
8389 system_shared_libs: [],
8390 shared_libs: ["mylib"],
8391 stl: "none",
8392 apex_available: ["com.android.art.debug"],
8393 test_for: ["com.android.art"],
8394 }
8395 `,
8396 android.MockFS{
8397 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8398 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8399 }.AddToFixture())
8400}
8401
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008402// TODO(jungjw): Move this to proptools
8403func intPtr(i int) *int {
8404 return &i
8405}
8406
8407func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008408 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008409 apex_set {
8410 name: "myapex",
8411 set: "myapex.apks",
8412 filename: "foo_v2.apex",
8413 overrides: ["foo"],
8414 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008415 `,
8416 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8417 variables.Platform_sdk_version = intPtr(30)
8418 }),
8419 android.FixtureModifyConfig(func(config android.Config) {
8420 config.Targets[android.Android] = []android.Target{
8421 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8422 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8423 }
8424 }),
8425 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008426
Paul Duffin24704672021-04-06 16:09:30 +01008427 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008428
8429 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008430 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008431 actual := extractedApex.Args["abis"]
8432 expected := "ARMEABI_V7A,ARM64_V8A"
8433 if actual != expected {
8434 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8435 }
8436 actual = extractedApex.Args["sdk-version"]
8437 expected = "30"
8438 if actual != expected {
8439 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8440 }
8441
Paul Duffin6717d882021-06-15 19:09:41 +01008442 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008443 a := m.Module().(*ApexSet)
8444 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008445 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008446 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8447 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8448 }
8449}
8450
Anton Hansson805e0a52022-11-25 14:06:46 +00008451func TestApexSet_NativeBridge(t *testing.T) {
8452 ctx := testApex(t, `
8453 apex_set {
8454 name: "myapex",
8455 set: "myapex.apks",
8456 filename: "foo_v2.apex",
8457 overrides: ["foo"],
8458 }
8459 `,
8460 android.FixtureModifyConfig(func(config android.Config) {
8461 config.Targets[android.Android] = []android.Target{
8462 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8463 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8464 }
8465 }),
8466 )
8467
8468 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8469
8470 // Check extract_apks tool parameters. No native bridge arch expected
8471 extractedApex := m.Output("extracted/myapex.apks")
8472 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8473}
8474
Jiyong Park7d95a512020-05-10 15:16:24 +09008475func TestNoStaticLinkingToStubsLib(t *testing.T) {
8476 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8477 apex {
8478 name: "myapex",
8479 key: "myapex.key",
8480 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008481 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008482 }
8483
8484 apex_key {
8485 name: "myapex.key",
8486 public_key: "testkey.avbpubkey",
8487 private_key: "testkey.pem",
8488 }
8489
8490 cc_library {
8491 name: "mylib",
8492 srcs: ["mylib.cpp"],
8493 static_libs: ["otherlib"],
8494 system_shared_libs: [],
8495 stl: "none",
8496 apex_available: [ "myapex" ],
8497 }
8498
8499 cc_library {
8500 name: "otherlib",
8501 srcs: ["mylib.cpp"],
8502 system_shared_libs: [],
8503 stl: "none",
8504 stubs: {
8505 versions: ["1", "2", "3"],
8506 },
8507 apex_available: [ "myapex" ],
8508 }
8509 `)
8510}
8511
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008512func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008513 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008514 apex {
8515 name: "myapex",
8516 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008517 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008518 custom_sign_tool: "sign_myapex",
8519 }
8520
8521 apex_key {
8522 name: "myapex.key",
8523 public_key: "testkey.avbpubkey",
8524 private_key: "testkey.pem",
8525 }
8526 `)
8527
8528 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8529 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8530 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system_ext" sign_tool="sign_myapex"`)
8531}
8532
8533func TestApexKeysTxtOverrides(t *testing.T) {
8534 ctx := testApex(t, `
8535 apex {
8536 name: "myapex",
8537 key: "myapex.key",
8538 updatable: false,
8539 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008540 }
8541
8542 apex_key {
8543 name: "myapex.key",
8544 public_key: "testkey.avbpubkey",
8545 private_key: "testkey.pem",
8546 }
8547
8548 prebuilt_apex {
8549 name: "myapex",
8550 prefer: true,
8551 arch: {
8552 arm64: {
8553 src: "myapex-arm64.apex",
8554 },
8555 arm: {
8556 src: "myapex-arm.apex",
8557 },
8558 },
8559 }
8560
8561 apex_set {
8562 name: "myapex_set",
8563 set: "myapex.apks",
8564 filename: "myapex_set.apex",
8565 overrides: ["myapex"],
8566 }
8567 `)
8568
8569 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8570 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8571 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 +09008572 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 +09008573}
8574
Jooyung Han938b5932020-06-20 12:47:47 +09008575func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008576 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008577 apex {
8578 name: "myapex",
8579 key: "myapex.key",
8580 apps: ["app"],
8581 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008582 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008583 }
8584
8585 apex_key {
8586 name: "myapex.key",
8587 public_key: "testkey.avbpubkey",
8588 private_key: "testkey.pem",
8589 }
8590
8591 android_app {
8592 name: "app",
8593 srcs: ["foo/bar/MyClass.java"],
8594 package_name: "foo",
8595 sdk_version: "none",
8596 system_modules: "none",
8597 apex_available: [ "myapex" ],
8598 }
8599 `, withFiles(map[string][]byte{
8600 "sub/Android.bp": []byte(`
8601 override_apex {
8602 name: "override_myapex",
8603 base: "myapex",
8604 apps: ["override_app"],
8605 allowed_files: ":allowed",
8606 }
8607 // Overridable "path" property should be referenced indirectly
8608 filegroup {
8609 name: "allowed",
8610 srcs: ["allowed.txt"],
8611 }
8612 override_android_app {
8613 name: "override_app",
8614 base: "app",
8615 package_name: "bar",
8616 }
8617 `),
8618 }))
8619
8620 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8621 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8622 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8623 }
8624
8625 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8626 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8627 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8628 }
8629}
8630
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008631func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008632 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008633 apex {
8634 name: "myapex",
8635 key: "myapex.key",
8636 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008637 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008638 }
8639
8640 apex_key {
8641 name: "myapex.key",
8642 public_key: "testkey.avbpubkey",
8643 private_key: "testkey.pem",
8644 }
8645
8646 cc_library {
8647 name: "mylib",
8648 srcs: ["mylib.cpp"],
8649 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008650 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008651 },
8652 apex_available: ["myapex"],
8653 }
8654
8655 cc_prebuilt_library_shared {
8656 name: "mylib",
8657 prefer: false,
8658 srcs: ["prebuilt.so"],
8659 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008660 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008661 },
8662 apex_available: ["myapex"],
8663 }
8664 `)
8665}
8666
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008667func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008668 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008669 apex {
8670 name: "myapex",
8671 key: "myapex.key",
8672 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008673 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008674 }
8675 apex_key {
8676 name: "myapex.key",
8677 public_key: "testkey.avbpubkey",
8678 private_key: "testkey.pem",
8679 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008680 `,
8681 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8682 variables.CompressedApex = proptools.BoolPtr(true)
8683 }),
8684 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008685
8686 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8687 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8688
8689 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8690 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8691
8692 // Make sure output of bundle is .capex
8693 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8694 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8695
8696 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008697 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008698 var builder strings.Builder
8699 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8700 androidMk := builder.String()
8701 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8702}
8703
Martin Stjernholm2856c662020-12-02 15:03:42 +00008704func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008705 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008706 apex {
8707 name: "myapex",
8708 key: "myapex.key",
8709 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008710 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008711 }
8712
8713 apex_key {
8714 name: "myapex.key",
8715 public_key: "testkey.avbpubkey",
8716 private_key: "testkey.pem",
8717 }
8718
8719 cc_library {
8720 name: "mylib",
8721 srcs: ["mylib.cpp"],
8722 apex_available: ["myapex"],
8723 shared_libs: ["otherlib"],
8724 system_shared_libs: [],
8725 }
8726
8727 cc_library {
8728 name: "otherlib",
8729 srcs: ["mylib.cpp"],
8730 stubs: {
8731 versions: ["current"],
8732 },
8733 }
8734
8735 cc_prebuilt_library_shared {
8736 name: "otherlib",
8737 prefer: true,
8738 srcs: ["prebuilt.so"],
8739 stubs: {
8740 versions: ["current"],
8741 },
8742 }
8743 `)
8744
8745 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008746 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008747 var builder strings.Builder
8748 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8749 androidMk := builder.String()
8750
8751 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8752 // a thing there.
8753 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8754}
8755
Jiyong Parke3867542020-12-03 17:28:25 +09008756func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008757 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008758 apex {
8759 name: "myapex",
8760 key: "myapex.key",
8761 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008762 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008763 }
8764
8765 apex_key {
8766 name: "myapex.key",
8767 public_key: "testkey.avbpubkey",
8768 private_key: "testkey.pem",
8769 }
8770
8771 cc_library {
8772 name: "mylib",
8773 srcs: ["mylib.cpp"],
8774 system_shared_libs: [],
8775 stl: "none",
8776 apex_available: ["myapex"],
8777 shared_libs: ["mylib2"],
8778 target: {
8779 apex: {
8780 exclude_shared_libs: ["mylib2"],
8781 },
8782 },
8783 }
8784
8785 cc_library {
8786 name: "mylib2",
8787 srcs: ["mylib.cpp"],
8788 system_shared_libs: [],
8789 stl: "none",
8790 }
8791 `)
8792
8793 // Check if mylib is linked to mylib2 for the non-apex target
8794 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8795 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8796
8797 // Make sure that the link doesn't occur for the apex target
8798 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8799 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8800
8801 // It shouldn't appear in the copy cmd as well.
8802 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8803 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8804}
8805
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008806func TestPrebuiltStubLibDep(t *testing.T) {
8807 bpBase := `
8808 apex {
8809 name: "myapex",
8810 key: "myapex.key",
8811 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008812 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008813 }
8814 apex_key {
8815 name: "myapex.key",
8816 public_key: "testkey.avbpubkey",
8817 private_key: "testkey.pem",
8818 }
8819 cc_library {
8820 name: "mylib",
8821 srcs: ["mylib.cpp"],
8822 apex_available: ["myapex"],
8823 shared_libs: ["stublib"],
8824 system_shared_libs: [],
8825 }
8826 apex {
8827 name: "otherapex",
8828 enabled: %s,
8829 key: "myapex.key",
8830 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008831 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008832 }
8833 `
8834
8835 stublibSourceBp := `
8836 cc_library {
8837 name: "stublib",
8838 srcs: ["mylib.cpp"],
8839 apex_available: ["otherapex"],
8840 system_shared_libs: [],
8841 stl: "none",
8842 stubs: {
8843 versions: ["1"],
8844 },
8845 }
8846 `
8847
8848 stublibPrebuiltBp := `
8849 cc_prebuilt_library_shared {
8850 name: "stublib",
8851 srcs: ["prebuilt.so"],
8852 apex_available: ["otherapex"],
8853 stubs: {
8854 versions: ["1"],
8855 },
8856 %s
8857 }
8858 `
8859
8860 tests := []struct {
8861 name string
8862 stublibBp string
8863 usePrebuilt bool
8864 modNames []string // Modules to collect AndroidMkEntries for
8865 otherApexEnabled []string
8866 }{
8867 {
8868 name: "only_source",
8869 stublibBp: stublibSourceBp,
8870 usePrebuilt: false,
8871 modNames: []string{"stublib"},
8872 otherApexEnabled: []string{"true", "false"},
8873 },
8874 {
8875 name: "source_preferred",
8876 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8877 usePrebuilt: false,
8878 modNames: []string{"stublib", "prebuilt_stublib"},
8879 otherApexEnabled: []string{"true", "false"},
8880 },
8881 {
8882 name: "prebuilt_preferred",
8883 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8884 usePrebuilt: true,
8885 modNames: []string{"stublib", "prebuilt_stublib"},
8886 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8887 },
8888 {
8889 name: "only_prebuilt",
8890 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8891 usePrebuilt: true,
8892 modNames: []string{"stublib"},
8893 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8894 },
8895 }
8896
8897 for _, test := range tests {
8898 t.Run(test.name, func(t *testing.T) {
8899 for _, otherApexEnabled := range test.otherApexEnabled {
8900 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008901 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008902
8903 type modAndMkEntries struct {
8904 mod *cc.Module
8905 mkEntries android.AndroidMkEntries
8906 }
8907 entries := []*modAndMkEntries{}
8908
8909 // Gather shared lib modules that are installable
8910 for _, modName := range test.modNames {
8911 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8912 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8913 continue
8914 }
8915 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008916 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008917 continue
8918 }
Colin Crossaa255532020-07-03 13:18:24 -07008919 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008920 if ent.Disabled {
8921 continue
8922 }
8923 entries = append(entries, &modAndMkEntries{
8924 mod: mod,
8925 mkEntries: ent,
8926 })
8927 }
8928 }
8929 }
8930
8931 var entry *modAndMkEntries = nil
8932 for _, ent := range entries {
8933 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8934 if entry != nil {
8935 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8936 } else {
8937 entry = ent
8938 }
8939 }
8940 }
8941
8942 if entry == nil {
8943 t.Errorf("AndroidMk entry for \"stublib\" missing")
8944 } else {
8945 isPrebuilt := entry.mod.Prebuilt() != nil
8946 if isPrebuilt != test.usePrebuilt {
8947 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8948 }
8949 if !entry.mod.IsStubs() {
8950 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8951 }
8952 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8953 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8954 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008955 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008956 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008957 if !android.InList(expected, cflags) {
8958 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8959 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008960 }
8961 })
8962 }
8963 })
8964 }
8965}
8966
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008967func TestHostApexInHostOnlyBuild(t *testing.T) {
8968 testApex(t, `
8969 apex {
8970 name: "myapex",
8971 host_supported: true,
8972 key: "myapex.key",
8973 updatable: false,
8974 payload_type: "zip",
8975 }
8976 apex_key {
8977 name: "myapex.key",
8978 public_key: "testkey.avbpubkey",
8979 private_key: "testkey.pem",
8980 }
8981 `,
8982 android.FixtureModifyConfig(func(config android.Config) {
8983 // We may not have device targets in all builds, e.g. in
8984 // prebuilts/build-tools/build-prebuilts.sh
8985 config.Targets[android.Android] = []android.Target{}
8986 }))
8987}
8988
Colin Crossc33e5212021-05-25 18:16:02 -07008989func TestApexJavaCoverage(t *testing.T) {
8990 bp := `
8991 apex {
8992 name: "myapex",
8993 key: "myapex.key",
8994 java_libs: ["mylib"],
8995 bootclasspath_fragments: ["mybootclasspathfragment"],
8996 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8997 updatable: false,
8998 }
8999
9000 apex_key {
9001 name: "myapex.key",
9002 public_key: "testkey.avbpubkey",
9003 private_key: "testkey.pem",
9004 }
9005
9006 java_library {
9007 name: "mylib",
9008 srcs: ["mylib.java"],
9009 apex_available: ["myapex"],
9010 compile_dex: true,
9011 }
9012
9013 bootclasspath_fragment {
9014 name: "mybootclasspathfragment",
9015 contents: ["mybootclasspathlib"],
9016 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009017 hidden_api: {
9018 split_packages: ["*"],
9019 },
Colin Crossc33e5212021-05-25 18:16:02 -07009020 }
9021
9022 java_library {
9023 name: "mybootclasspathlib",
9024 srcs: ["mybootclasspathlib.java"],
9025 apex_available: ["myapex"],
9026 compile_dex: true,
9027 }
9028
9029 systemserverclasspath_fragment {
9030 name: "mysystemserverclasspathfragment",
9031 contents: ["mysystemserverclasspathlib"],
9032 apex_available: ["myapex"],
9033 }
9034
9035 java_library {
9036 name: "mysystemserverclasspathlib",
9037 srcs: ["mysystemserverclasspathlib.java"],
9038 apex_available: ["myapex"],
9039 compile_dex: true,
9040 }
9041 `
9042
9043 result := android.GroupFixturePreparers(
9044 PrepareForTestWithApexBuildComponents,
9045 prepareForTestWithMyapex,
9046 java.PrepareForTestWithJavaDefaultModules,
9047 android.PrepareForTestWithAndroidBuildComponents,
9048 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009049 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9050 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009051 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009052 ).RunTest(t)
9053
9054 // Make sure jacoco ran on both mylib and mybootclasspathlib
9055 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9056 t.Errorf("Failed to find jacoco rule for mylib")
9057 }
9058 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9059 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9060 }
9061 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9062 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9063 }
9064}
9065
Jiyong Park192600a2021-08-03 07:52:17 +00009066func TestProhibitStaticExecutable(t *testing.T) {
9067 testApexError(t, `executable mybin is static`, `
9068 apex {
9069 name: "myapex",
9070 key: "myapex.key",
9071 binaries: ["mybin"],
9072 min_sdk_version: "29",
9073 }
9074
9075 apex_key {
9076 name: "myapex.key",
9077 public_key: "testkey.avbpubkey",
9078 private_key: "testkey.pem",
9079 }
9080
9081 cc_binary {
9082 name: "mybin",
9083 srcs: ["mylib.cpp"],
9084 relative_install_path: "foo/bar",
9085 static_executable: true,
9086 system_shared_libs: [],
9087 stl: "none",
9088 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009089 min_sdk_version: "29",
9090 }
9091 `)
9092
9093 testApexError(t, `executable mybin.rust is static`, `
9094 apex {
9095 name: "myapex",
9096 key: "myapex.key",
9097 binaries: ["mybin.rust"],
9098 min_sdk_version: "29",
9099 }
9100
9101 apex_key {
9102 name: "myapex.key",
9103 public_key: "testkey.avbpubkey",
9104 private_key: "testkey.pem",
9105 }
9106
9107 rust_binary {
9108 name: "mybin.rust",
9109 srcs: ["foo.rs"],
9110 static_executable: true,
9111 apex_available: ["myapex"],
9112 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009113 }
9114 `)
9115}
9116
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009117func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9118 ctx := testApex(t, `
9119 apex {
9120 name: "myapex",
9121 key: "myapex.key",
9122 updatable: false,
9123 java_libs: ["foo"],
9124 }
9125
9126 apex_key {
9127 name: "myapex.key",
9128 public_key: "testkey.avbpubkey",
9129 private_key: "testkey.pem",
9130 }
9131
9132 java_library {
9133 name: "foo",
9134 srcs: ["foo.java"],
9135 apex_available: ["myapex"],
9136 installable: true,
9137 }
9138 `,
9139 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9140 )
9141
9142 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9143 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9144 var builder strings.Builder
9145 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9146 androidMk := builder.String()
9147 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex")
9148}
9149
9150func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9151 ctx := testApex(t, `
9152 prebuilt_apex {
9153 name: "myapex",
9154 arch: {
9155 arm64: {
9156 src: "myapex-arm64.apex",
9157 },
9158 arm: {
9159 src: "myapex-arm.apex",
9160 },
9161 },
9162 exported_java_libs: ["foo"],
9163 }
9164
9165 java_import {
9166 name: "foo",
9167 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009168 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009169 }
9170 `,
9171 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9172 )
9173
9174 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9175 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9176 mainModuleEntries := entriesList[0]
9177 android.AssertArrayString(t,
9178 "LOCAL_REQUIRED_MODULES",
9179 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9180 []string{
9181 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9182 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9183 })
9184}
9185
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009186func TestAndroidMk_RequiredModules(t *testing.T) {
9187 ctx := testApex(t, `
9188 apex {
9189 name: "myapex",
9190 key: "myapex.key",
9191 updatable: false,
9192 java_libs: ["foo"],
9193 required: ["otherapex"],
9194 }
9195
9196 apex {
9197 name: "otherapex",
9198 key: "myapex.key",
9199 updatable: false,
9200 java_libs: ["foo"],
9201 required: ["otherapex"],
9202 }
9203
9204 apex_key {
9205 name: "myapex.key",
9206 public_key: "testkey.avbpubkey",
9207 private_key: "testkey.pem",
9208 }
9209
9210 java_library {
9211 name: "foo",
9212 srcs: ["foo.java"],
9213 apex_available: ["myapex", "otherapex"],
9214 installable: true,
9215 }
9216 `)
9217
9218 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9219 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9220 var builder strings.Builder
9221 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9222 androidMk := builder.String()
9223 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
9224}
9225
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009226func TestAndroidMk_RequiredDeps(t *testing.T) {
9227 ctx := testApex(t, `
9228 apex {
9229 name: "myapex",
9230 key: "myapex.key",
9231 updatable: false,
9232 }
9233
9234 apex_key {
9235 name: "myapex.key",
9236 public_key: "testkey.avbpubkey",
9237 private_key: "testkey.pem",
9238 }
9239 `)
9240
9241 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9242 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9243 data := android.AndroidMkDataForTest(t, ctx, bundle)
9244 var builder strings.Builder
9245 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9246 androidMk := builder.String()
9247 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
9248
9249 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9250 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9251 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9252 var flattenedBuilder strings.Builder
9253 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9254 flattenedAndroidMk := flattenedBuilder.String()
9255 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
9256}
9257
Jooyung Hana6d36672022-02-24 13:58:07 +09009258func TestApexOutputFileProducer(t *testing.T) {
9259 for _, tc := range []struct {
9260 name string
9261 ref string
9262 expected_data []string
9263 }{
9264 {
9265 name: "test_using_output",
9266 ref: ":myapex",
9267 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9268 },
9269 {
9270 name: "test_using_apex",
9271 ref: ":myapex{.apex}",
9272 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9273 },
9274 } {
9275 t.Run(tc.name, func(t *testing.T) {
9276 ctx := testApex(t, `
9277 apex {
9278 name: "myapex",
9279 key: "myapex.key",
9280 compressible: true,
9281 updatable: false,
9282 }
9283
9284 apex_key {
9285 name: "myapex.key",
9286 public_key: "testkey.avbpubkey",
9287 private_key: "testkey.pem",
9288 }
9289
9290 java_test {
9291 name: "`+tc.name+`",
9292 srcs: ["a.java"],
9293 data: ["`+tc.ref+`"],
9294 }
9295 `,
9296 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9297 variables.CompressedApex = proptools.BoolPtr(true)
9298 }))
9299 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9300 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9301 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9302 })
9303 }
9304}
9305
satayev758968a2021-12-06 11:42:40 +00009306func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9307 preparer := android.GroupFixturePreparers(
9308 PrepareForTestWithApexBuildComponents,
9309 prepareForTestWithMyapex,
9310 java.PrepareForTestWithJavaSdkLibraryFiles,
9311 java.PrepareForTestWithJavaDefaultModules,
9312 android.PrepareForTestWithAndroidBuildComponents,
9313 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9314 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9315 )
9316
9317 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9318 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9319 preparer.RunTestWithBp(t, `
9320 apex {
9321 name: "myapex",
9322 key: "myapex.key",
9323 bootclasspath_fragments: ["mybootclasspathfragment"],
9324 min_sdk_version: "30",
9325 updatable: false,
9326 }
9327
9328 apex_key {
9329 name: "myapex.key",
9330 public_key: "testkey.avbpubkey",
9331 private_key: "testkey.pem",
9332 }
9333
9334 bootclasspath_fragment {
9335 name: "mybootclasspathfragment",
9336 contents: ["mybootclasspathlib"],
9337 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009338 hidden_api: {
9339 split_packages: ["*"],
9340 },
satayev758968a2021-12-06 11:42:40 +00009341 }
9342
9343 java_sdk_library {
9344 name: "mybootclasspathlib",
9345 srcs: ["mybootclasspathlib.java"],
9346 apex_available: ["myapex"],
9347 compile_dex: true,
9348 unsafe_ignore_missing_latest_api: true,
9349 min_sdk_version: "31",
9350 static_libs: ["util"],
9351 }
9352
9353 java_library {
9354 name: "util",
9355 srcs: ["a.java"],
9356 apex_available: ["myapex"],
9357 min_sdk_version: "31",
9358 static_libs: ["another_util"],
9359 }
9360
9361 java_library {
9362 name: "another_util",
9363 srcs: ["a.java"],
9364 min_sdk_version: "31",
9365 apex_available: ["myapex"],
9366 }
9367 `)
9368 })
9369
9370 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9371 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9372 preparer.RunTestWithBp(t, `
9373 apex {
9374 name: "myapex",
9375 key: "myapex.key",
9376 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9377 min_sdk_version: "30",
9378 updatable: false,
9379 }
9380
9381 apex_key {
9382 name: "myapex.key",
9383 public_key: "testkey.avbpubkey",
9384 private_key: "testkey.pem",
9385 }
9386
9387 systemserverclasspath_fragment {
9388 name: "mysystemserverclasspathfragment",
9389 contents: ["mysystemserverclasspathlib"],
9390 apex_available: ["myapex"],
9391 }
9392
9393 java_sdk_library {
9394 name: "mysystemserverclasspathlib",
9395 srcs: ["mysystemserverclasspathlib.java"],
9396 apex_available: ["myapex"],
9397 compile_dex: true,
9398 min_sdk_version: "32",
9399 unsafe_ignore_missing_latest_api: true,
9400 static_libs: ["util"],
9401 }
9402
9403 java_library {
9404 name: "util",
9405 srcs: ["a.java"],
9406 apex_available: ["myapex"],
9407 min_sdk_version: "31",
9408 static_libs: ["another_util"],
9409 }
9410
9411 java_library {
9412 name: "another_util",
9413 srcs: ["a.java"],
9414 min_sdk_version: "31",
9415 apex_available: ["myapex"],
9416 }
9417 `)
9418 })
9419
9420 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9421 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9422 RunTestWithBp(t, `
9423 apex {
9424 name: "myapex",
9425 key: "myapex.key",
9426 bootclasspath_fragments: ["mybootclasspathfragment"],
9427 min_sdk_version: "30",
9428 updatable: false,
9429 }
9430
9431 apex_key {
9432 name: "myapex.key",
9433 public_key: "testkey.avbpubkey",
9434 private_key: "testkey.pem",
9435 }
9436
9437 bootclasspath_fragment {
9438 name: "mybootclasspathfragment",
9439 contents: ["mybootclasspathlib"],
9440 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009441 hidden_api: {
9442 split_packages: ["*"],
9443 },
satayev758968a2021-12-06 11:42:40 +00009444 }
9445
9446 java_sdk_library {
9447 name: "mybootclasspathlib",
9448 srcs: ["mybootclasspathlib.java"],
9449 apex_available: ["myapex"],
9450 compile_dex: true,
9451 unsafe_ignore_missing_latest_api: true,
9452 }
9453 `)
9454 })
9455
9456 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9457 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9458 RunTestWithBp(t, `
9459 apex {
9460 name: "myapex",
9461 key: "myapex.key",
9462 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9463 min_sdk_version: "30",
9464 updatable: false,
9465 }
9466
9467 apex_key {
9468 name: "myapex.key",
9469 public_key: "testkey.avbpubkey",
9470 private_key: "testkey.pem",
9471 }
9472
9473 systemserverclasspath_fragment {
9474 name: "mysystemserverclasspathfragment",
9475 contents: ["mysystemserverclasspathlib"],
9476 apex_available: ["myapex"],
9477 }
9478
9479 java_sdk_library {
9480 name: "mysystemserverclasspathlib",
9481 srcs: ["mysystemserverclasspathlib.java"],
9482 apex_available: ["myapex"],
9483 compile_dex: true,
9484 unsafe_ignore_missing_latest_api: true,
9485 }
9486 `)
9487 })
9488}
9489
Jiakai Zhang6decef92022-01-12 17:56:19 +00009490// Verifies that the APEX depends on all the Make modules in the list.
9491func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9492 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9493 for _, dep := range deps {
9494 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9495 }
9496}
9497
9498// Verifies that the APEX does not depend on any of the Make modules in the list.
9499func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9500 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9501 for _, dep := range deps {
9502 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9503 }
9504}
9505
Spandan Das66773252022-01-15 00:23:18 +00009506func TestApexStrictUpdtabilityLint(t *testing.T) {
9507 bpTemplate := `
9508 apex {
9509 name: "myapex",
9510 key: "myapex.key",
9511 java_libs: ["myjavalib"],
9512 updatable: %v,
9513 min_sdk_version: "29",
9514 }
9515 apex_key {
9516 name: "myapex.key",
9517 }
9518 java_library {
9519 name: "myjavalib",
9520 srcs: ["MyClass.java"],
9521 apex_available: [ "myapex" ],
9522 lint: {
9523 strict_updatability_linting: %v,
9524 },
9525 sdk_version: "current",
9526 min_sdk_version: "29",
9527 }
9528 `
9529 fs := android.MockFS{
9530 "lint-baseline.xml": nil,
9531 }
9532
9533 testCases := []struct {
9534 testCaseName string
9535 apexUpdatable bool
9536 javaStrictUpdtabilityLint bool
9537 lintFileExists bool
9538 disallowedFlagExpected bool
9539 }{
9540 {
9541 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9542 apexUpdatable: true,
9543 javaStrictUpdtabilityLint: true,
9544 lintFileExists: false,
9545 disallowedFlagExpected: false,
9546 },
9547 {
9548 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9549 apexUpdatable: false,
9550 javaStrictUpdtabilityLint: false,
9551 lintFileExists: true,
9552 disallowedFlagExpected: false,
9553 },
9554 {
9555 testCaseName: "non-updatable apex respects strict updatability of javalib",
9556 apexUpdatable: false,
9557 javaStrictUpdtabilityLint: true,
9558 lintFileExists: true,
9559 disallowedFlagExpected: true,
9560 },
9561 {
9562 testCaseName: "updatable apex sets strict updatability of javalib to true",
9563 apexUpdatable: true,
9564 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9565 lintFileExists: true,
9566 disallowedFlagExpected: true,
9567 },
9568 }
9569
9570 for _, testCase := range testCases {
9571 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9572 fixtures := []android.FixturePreparer{}
9573 if testCase.lintFileExists {
9574 fixtures = append(fixtures, fs.AddToFixture())
9575 }
9576
9577 result := testApex(t, bp, fixtures...)
9578 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9579 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9580 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9581
9582 if disallowedFlagActual != testCase.disallowedFlagExpected {
9583 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9584 }
9585 }
9586}
9587
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009588func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9589 bp := `
9590 apex {
9591 name: "myapex",
9592 key: "myapex.key",
9593 java_libs: ["myjavalib"],
9594 updatable: true,
9595 min_sdk_version: "29",
9596 }
9597 apex_key {
9598 name: "myapex.key",
9599 }
9600 java_library {
9601 name: "myjavalib",
9602 srcs: ["MyClass.java"],
9603 apex_available: [ "myapex" ],
9604 sdk_version: "current",
9605 min_sdk_version: "29",
9606 }
9607 `
9608
9609 testCases := []struct {
9610 testCaseName string
9611 moduleDirectory string
9612 disallowedFlagExpected bool
9613 }{
9614 {
9615 testCaseName: "lintable module defined outside libcore",
9616 moduleDirectory: "",
9617 disallowedFlagExpected: true,
9618 },
9619 {
9620 testCaseName: "lintable module defined in libcore root directory",
9621 moduleDirectory: "libcore/",
9622 disallowedFlagExpected: false,
9623 },
9624 {
9625 testCaseName: "lintable module defined in libcore child directory",
9626 moduleDirectory: "libcore/childdir/",
9627 disallowedFlagExpected: true,
9628 },
9629 }
9630
9631 for _, testCase := range testCases {
9632 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9633 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9634 result := testApex(t, "", lintFileCreator, bpFileCreator)
9635 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9636 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9637 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9638 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9639
9640 if disallowedFlagActual != testCase.disallowedFlagExpected {
9641 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9642 }
9643 }
9644}
9645
Spandan Das66773252022-01-15 00:23:18 +00009646// checks transtive deps of an apex coming from bootclasspath_fragment
9647func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9648 bp := `
9649 apex {
9650 name: "myapex",
9651 key: "myapex.key",
9652 bootclasspath_fragments: ["mybootclasspathfragment"],
9653 updatable: true,
9654 min_sdk_version: "29",
9655 }
9656 apex_key {
9657 name: "myapex.key",
9658 }
9659 bootclasspath_fragment {
9660 name: "mybootclasspathfragment",
9661 contents: ["myjavalib"],
9662 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009663 hidden_api: {
9664 split_packages: ["*"],
9665 },
Spandan Das66773252022-01-15 00:23:18 +00009666 }
9667 java_library {
9668 name: "myjavalib",
9669 srcs: ["MyClass.java"],
9670 apex_available: [ "myapex" ],
9671 sdk_version: "current",
9672 min_sdk_version: "29",
9673 compile_dex: true,
9674 }
9675 `
9676 fs := android.MockFS{
9677 "lint-baseline.xml": nil,
9678 }
9679
9680 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9681 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9682 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9683 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9684 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9685 }
9686}
9687
Spandan Das42e89502022-05-06 22:12:55 +00009688// updatable apexes should propagate updatable=true to its apps
9689func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9690 bp := `
9691 apex {
9692 name: "myapex",
9693 key: "myapex.key",
9694 updatable: %v,
9695 apps: [
9696 "myapp",
9697 ],
9698 min_sdk_version: "30",
9699 }
9700 apex_key {
9701 name: "myapex.key",
9702 }
9703 android_app {
9704 name: "myapp",
9705 updatable: %v,
9706 apex_available: [
9707 "myapex",
9708 ],
9709 sdk_version: "current",
9710 min_sdk_version: "30",
9711 }
9712 `
9713 testCases := []struct {
9714 name string
9715 apex_is_updatable_bp bool
9716 app_is_updatable_bp bool
9717 app_is_updatable_expected bool
9718 }{
9719 {
9720 name: "Non-updatable apex respects updatable property of non-updatable app",
9721 apex_is_updatable_bp: false,
9722 app_is_updatable_bp: false,
9723 app_is_updatable_expected: false,
9724 },
9725 {
9726 name: "Non-updatable apex respects updatable property of updatable app",
9727 apex_is_updatable_bp: false,
9728 app_is_updatable_bp: true,
9729 app_is_updatable_expected: true,
9730 },
9731 {
9732 name: "Updatable apex respects updatable property of updatable app",
9733 apex_is_updatable_bp: true,
9734 app_is_updatable_bp: true,
9735 app_is_updatable_expected: true,
9736 },
9737 {
9738 name: "Updatable apex sets updatable=true on non-updatable app",
9739 apex_is_updatable_bp: true,
9740 app_is_updatable_bp: false,
9741 app_is_updatable_expected: true,
9742 },
9743 }
9744 for _, testCase := range testCases {
9745 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9746 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9747 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9748 }
9749}
9750
Kiyoung Kim487689e2022-07-26 09:48:22 +09009751func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9752 bp := `
9753 apex {
9754 name: "myapex",
9755 key: "myapex.key",
9756 native_shared_libs: ["libfoo"],
9757 min_sdk_version: "29",
9758 }
9759 apex_key {
9760 name: "myapex.key",
9761 }
9762 cc_library {
9763 name: "libfoo",
9764 shared_libs: ["libc"],
9765 apex_available: ["myapex"],
9766 min_sdk_version: "29",
9767 }
9768 cc_api_library {
9769 name: "libc",
9770 src: "libc.so",
9771 min_sdk_version: "29",
9772 recovery_available: true,
9773 }
9774 api_imports {
9775 name: "api_imports",
9776 shared_libs: [
9777 "libc",
9778 ],
9779 header_libs: [],
9780 }
9781 `
9782 result := testApex(t, bp)
9783
9784 hasDep := func(m android.Module, wantDep android.Module) bool {
9785 t.Helper()
9786 var found bool
9787 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9788 if dep == wantDep {
9789 found = true
9790 }
9791 })
9792 return found
9793 }
9794
9795 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9796 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9797
9798 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9799
9800 // libfoo core variant should be buildable in the same inner tree since
9801 // certain mcombo files might build system and apexes in the same inner tree
9802 // libfoo core variant should link against source libc
9803 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9804 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9805 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9806}
Liz Kammer0e255ef2022-11-04 16:07:04 -04009807
9808func TestApexImageInMixedBuilds(t *testing.T) {
9809 bp := `
9810apex_key{
9811 name: "foo_key",
9812}
9813apex {
9814 name: "foo",
9815 key: "foo_key",
9816 updatable: true,
9817 min_sdk_version: "31",
9818 file_contexts: ":myapex-file_contexts",
9819 bazel_module: { label: "//:foo" },
9820}`
9821
9822 outputBaseDir := "out/bazel"
9823 result := android.GroupFixturePreparers(
9824 prepareForApexTest,
9825 android.FixtureModifyConfig(func(config android.Config) {
9826 config.BazelContext = android.MockBazelContext{
9827 OutputBaseDir: outputBaseDir,
9828 LabelToApexInfo: map[string]cquery.ApexInfo{
9829 "//:foo": cquery.ApexInfo{
Jingwen Chen1ec77852022-11-07 14:36:12 +00009830 SignedOutput: "signed_out.apex",
9831 UnsignedOutput: "unsigned_out.apex",
9832 BundleKeyInfo: []string{"public_key", "private_key"},
9833 ContainerKeyInfo: []string{"container_cert", "container_private"},
9834 SymbolsUsedByApex: "foo_using.txt",
9835 JavaSymbolsUsedByApex: "foo_using.xml",
Liz Kammer303978d2022-11-04 16:12:43 -04009836 BundleFile: "apex_bundle.zip",
Wei Li78c07de2022-11-08 16:01:05 -08009837 InstalledFiles: "installed-files.txt",
Liz Kammer0e255ef2022-11-04 16:07:04 -04009838
9839 // unused
9840 PackageName: "pkg_name",
9841 ProvidesLibs: []string{"a", "b"},
9842 RequiresLibs: []string{"c", "d"},
9843 },
9844 },
9845 }
9846 }),
9847 ).RunTestWithBp(t, bp)
9848
9849 m := result.ModuleForTests("foo", "android_common_foo_image").Module()
9850 ab, ok := m.(*apexBundle)
9851 if !ok {
9852 t.Fatalf("Expected module to be an apexBundle, was not")
9853 }
9854
9855 if w, g := "out/bazel/execroot/__main__/public_key", ab.publicKeyFile.String(); w != g {
9856 t.Errorf("Expected public key %q, got %q", w, g)
9857 }
9858
9859 if w, g := "out/bazel/execroot/__main__/private_key", ab.privateKeyFile.String(); w != g {
9860 t.Errorf("Expected private key %q, got %q", w, g)
9861 }
9862
9863 if w, g := "out/bazel/execroot/__main__/container_cert", ab.containerCertificateFile.String(); w != g {
9864 t.Errorf("Expected public container key %q, got %q", w, g)
9865 }
9866
9867 if w, g := "out/bazel/execroot/__main__/container_private", ab.containerPrivateKeyFile.String(); w != g {
9868 t.Errorf("Expected private container key %q, got %q", w, g)
9869 }
9870
9871 if w, g := "out/bazel/execroot/__main__/signed_out.apex", ab.outputFile.String(); w != g {
9872 t.Errorf("Expected output file %q, got %q", w, g)
9873 }
Jingwen Chen0c9a2762022-11-04 09:40:47 +00009874
9875 if w, g := "out/bazel/execroot/__main__/foo_using.txt", ab.nativeApisUsedByModuleFile.String(); w != g {
9876 t.Errorf("Expected output file %q, got %q", w, g)
9877 }
Jingwen Chen1ec77852022-11-07 14:36:12 +00009878
9879 if w, g := "out/bazel/execroot/__main__/foo_using.xml", ab.javaApisUsedByModuleFile.String(); w != g {
9880 t.Errorf("Expected output file %q, got %q", w, g)
9881 }
Liz Kammer303978d2022-11-04 16:12:43 -04009882
Wei Li78c07de2022-11-08 16:01:05 -08009883 if w, g := "out/bazel/execroot/__main__/installed-files.txt", ab.installedFilesFile.String(); w != g {
9884 t.Errorf("Expected installed-files.txt %q, got %q", w, g)
9885 }
9886
Liz Kammer303978d2022-11-04 16:12:43 -04009887 mkData := android.AndroidMkDataForTest(t, result.TestContext, m)
9888 var builder strings.Builder
9889 mkData.Custom(&builder, "foo", "BAZEL_TARGET_", "", mkData)
9890
9891 data := builder.String()
9892 if w := "ALL_MODULES.$(my_register_name).BUNDLE := out/bazel/execroot/__main__/apex_bundle.zip"; !strings.Contains(data, w) {
9893 t.Errorf("Expected %q in androidmk data, but did not find %q", w, data)
9894 }
Wei Li78c07de2022-11-08 16:01:05 -08009895 if w := "$(call dist-for-goals,checkbuild,out/bazel/execroot/__main__/installed-files.txt:foo-installed-files.txt)"; !strings.Contains(data, w) {
9896 t.Errorf("Expected %q in androidmk data, but did not find %q", w, data)
9897 }
Liz Kammer0e255ef2022-11-04 16:07:04 -04009898}