blob: 2e116c7e9a3f985407848bb1a84e8ce27b1a0650 [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"
Jiyong Park25fc6a92018-11-18 18:02:45 +090019 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Paul Duffin37856732021-02-26 14:24:15 +000021 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070022 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010023 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
Kiyoung Kim487689e2022-07-26 09:48:22 +090029 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090030 "github.com/google/blueprint/proptools"
31
32 "android/soong/android"
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
Vinh Tran8f5310f2022-10-07 18:16:47 -04004133func TestCompileMultilibProp(t *testing.T) {
4134 testCases := []struct {
4135 compileMultiLibProp string
4136 containedLibs []string
4137 notContainedLibs []string
4138 }{
4139 {
4140 containedLibs: []string{
4141 "image.apex/lib64/mylib.so",
4142 "image.apex/lib/mylib.so",
4143 },
4144 compileMultiLibProp: `compile_multilib: "both",`,
4145 },
4146 {
4147 containedLibs: []string{"image.apex/lib64/mylib.so"},
4148 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4149 compileMultiLibProp: `compile_multilib: "first",`,
4150 },
4151 {
4152 containedLibs: []string{"image.apex/lib64/mylib.so"},
4153 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4154 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4155 },
4156 {
4157 containedLibs: []string{"image.apex/lib64/mylib.so"},
4158 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4159 compileMultiLibProp: `compile_multilib: "64",`,
4160 },
4161 {
4162 containedLibs: []string{"image.apex/lib/mylib.so"},
4163 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4164 compileMultiLibProp: `compile_multilib: "32",`,
4165 },
4166 }
4167 for _, testCase := range testCases {
4168 ctx := testApex(t, fmt.Sprintf(`
4169 apex {
4170 name: "myapex",
4171 key: "myapex.key",
4172 %s
4173 native_shared_libs: ["mylib"],
4174 updatable: false,
4175 }
4176 apex_key {
4177 name: "myapex.key",
4178 public_key: "testkey.avbpubkey",
4179 private_key: "testkey.pem",
4180 }
4181 cc_library {
4182 name: "mylib",
4183 srcs: ["mylib.cpp"],
4184 apex_available: [
4185 "//apex_available:platform",
4186 "myapex",
4187 ],
4188 }
4189 `, testCase.compileMultiLibProp),
4190 )
4191 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4192 apexRule := module.Rule("apexRule")
4193 copyCmds := apexRule.Args["copy_commands"]
4194 for _, containedLib := range testCase.containedLibs {
4195 ensureContains(t, copyCmds, containedLib)
4196 }
4197 for _, notContainedLib := range testCase.notContainedLibs {
4198 ensureNotContains(t, copyCmds, notContainedLib)
4199 }
4200 }
4201}
4202
Alex Light0851b882019-02-07 13:20:53 -08004203func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004204 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004205 apex {
4206 name: "myapex",
4207 key: "myapex.key",
4208 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004209 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004210 }
4211
4212 apex_key {
4213 name: "myapex.key",
4214 public_key: "testkey.avbpubkey",
4215 private_key: "testkey.pem",
4216 }
4217
4218 cc_library {
4219 name: "mylib_common",
4220 srcs: ["mylib.cpp"],
4221 system_shared_libs: [],
4222 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004223 apex_available: [
4224 "//apex_available:platform",
4225 "myapex",
4226 ],
Alex Light0851b882019-02-07 13:20:53 -08004227 }
4228 `)
4229
Sundong Ahnabb64432019-10-22 13:58:29 +09004230 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004231 apexRule := module.Rule("apexRule")
4232 copyCmds := apexRule.Args["copy_commands"]
4233
4234 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4235 t.Log("Apex was a test apex!")
4236 t.Fail()
4237 }
4238 // Ensure that main rule creates an output
4239 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4240
4241 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004242 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004243
4244 // Ensure that both direct and indirect deps are copied into apex
4245 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4246
Colin Cross7113d202019-11-20 16:39:12 -08004247 // Ensure that the platform variant ends with _shared
4248 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004249
Colin Cross56a83212020-09-15 18:30:11 -07004250 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004251 t.Log("Found mylib_common not in any apex!")
4252 t.Fail()
4253 }
4254}
4255
4256func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004257 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004258 apex_test {
4259 name: "myapex",
4260 key: "myapex.key",
4261 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004262 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004263 }
4264
4265 apex_key {
4266 name: "myapex.key",
4267 public_key: "testkey.avbpubkey",
4268 private_key: "testkey.pem",
4269 }
4270
4271 cc_library {
4272 name: "mylib_common_test",
4273 srcs: ["mylib.cpp"],
4274 system_shared_libs: [],
4275 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004276 // TODO: remove //apex_available:platform
4277 apex_available: [
4278 "//apex_available:platform",
4279 "myapex",
4280 ],
Alex Light0851b882019-02-07 13:20:53 -08004281 }
4282 `)
4283
Sundong Ahnabb64432019-10-22 13:58:29 +09004284 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004285 apexRule := module.Rule("apexRule")
4286 copyCmds := apexRule.Args["copy_commands"]
4287
4288 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4289 t.Log("Apex was not a test apex!")
4290 t.Fail()
4291 }
4292 // Ensure that main rule creates an output
4293 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4294
4295 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004296 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004297
4298 // Ensure that both direct and indirect deps are copied into apex
4299 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4300
Colin Cross7113d202019-11-20 16:39:12 -08004301 // Ensure that the platform variant ends with _shared
4302 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004303}
4304
Alex Light9670d332019-01-29 18:07:33 -08004305func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004306 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004307 apex {
4308 name: "myapex",
4309 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004310 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004311 multilib: {
4312 first: {
4313 native_shared_libs: ["mylib_common"],
4314 }
4315 },
4316 target: {
4317 android: {
4318 multilib: {
4319 first: {
4320 native_shared_libs: ["mylib"],
4321 }
4322 }
4323 },
4324 host: {
4325 multilib: {
4326 first: {
4327 native_shared_libs: ["mylib2"],
4328 }
4329 }
4330 }
4331 }
4332 }
4333
4334 apex_key {
4335 name: "myapex.key",
4336 public_key: "testkey.avbpubkey",
4337 private_key: "testkey.pem",
4338 }
4339
4340 cc_library {
4341 name: "mylib",
4342 srcs: ["mylib.cpp"],
4343 system_shared_libs: [],
4344 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004345 // TODO: remove //apex_available:platform
4346 apex_available: [
4347 "//apex_available:platform",
4348 "myapex",
4349 ],
Alex Light9670d332019-01-29 18:07:33 -08004350 }
4351
4352 cc_library {
4353 name: "mylib_common",
4354 srcs: ["mylib.cpp"],
4355 system_shared_libs: [],
4356 stl: "none",
4357 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004358 // TODO: remove //apex_available:platform
4359 apex_available: [
4360 "//apex_available:platform",
4361 "myapex",
4362 ],
Alex Light9670d332019-01-29 18:07:33 -08004363 }
4364
4365 cc_library {
4366 name: "mylib2",
4367 srcs: ["mylib.cpp"],
4368 system_shared_libs: [],
4369 stl: "none",
4370 compile_multilib: "first",
4371 }
4372 `)
4373
Sundong Ahnabb64432019-10-22 13:58:29 +09004374 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004375 copyCmds := apexRule.Args["copy_commands"]
4376
4377 // Ensure that main rule creates an output
4378 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4379
4380 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004381 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4382 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4383 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004384
4385 // Ensure that both direct and indirect deps are copied into apex
4386 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4387 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4388 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4389
Colin Cross7113d202019-11-20 16:39:12 -08004390 // Ensure that the platform variant ends with _shared
4391 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4392 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4393 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004394}
Jiyong Park04480cf2019-02-06 00:16:29 +09004395
Jiyong Park59140302020-12-14 18:44:04 +09004396func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004397 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004398 apex {
4399 name: "myapex",
4400 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004401 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004402 arch: {
4403 arm64: {
4404 native_shared_libs: ["mylib.arm64"],
4405 },
4406 x86_64: {
4407 native_shared_libs: ["mylib.x64"],
4408 },
4409 }
4410 }
4411
4412 apex_key {
4413 name: "myapex.key",
4414 public_key: "testkey.avbpubkey",
4415 private_key: "testkey.pem",
4416 }
4417
4418 cc_library {
4419 name: "mylib.arm64",
4420 srcs: ["mylib.cpp"],
4421 system_shared_libs: [],
4422 stl: "none",
4423 // TODO: remove //apex_available:platform
4424 apex_available: [
4425 "//apex_available:platform",
4426 "myapex",
4427 ],
4428 }
4429
4430 cc_library {
4431 name: "mylib.x64",
4432 srcs: ["mylib.cpp"],
4433 system_shared_libs: [],
4434 stl: "none",
4435 // TODO: remove //apex_available:platform
4436 apex_available: [
4437 "//apex_available:platform",
4438 "myapex",
4439 ],
4440 }
4441 `)
4442
4443 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4444 copyCmds := apexRule.Args["copy_commands"]
4445
4446 // Ensure that apex variant is created for the direct dep
4447 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4448 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4449
4450 // Ensure that both direct and indirect deps are copied into apex
4451 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4452 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4453}
4454
Jiyong Park04480cf2019-02-06 00:16:29 +09004455func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004456 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004457 apex {
4458 name: "myapex",
4459 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004460 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004461 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004462 }
4463
4464 apex_key {
4465 name: "myapex.key",
4466 public_key: "testkey.avbpubkey",
4467 private_key: "testkey.pem",
4468 }
4469
4470 sh_binary {
4471 name: "myscript",
4472 src: "mylib.cpp",
4473 filename: "myscript.sh",
4474 sub_dir: "script",
4475 }
4476 `)
4477
Sundong Ahnabb64432019-10-22 13:58:29 +09004478 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004479 copyCmds := apexRule.Args["copy_commands"]
4480
4481 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4482}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004483
Jooyung Han91df2082019-11-20 01:49:42 +09004484func TestApexInVariousPartition(t *testing.T) {
4485 testcases := []struct {
4486 propName, parition, flattenedPartition string
4487 }{
4488 {"", "system", "system_ext"},
4489 {"product_specific: true", "product", "product"},
4490 {"soc_specific: true", "vendor", "vendor"},
4491 {"proprietary: true", "vendor", "vendor"},
4492 {"vendor: true", "vendor", "vendor"},
4493 {"system_ext_specific: true", "system_ext", "system_ext"},
4494 }
4495 for _, tc := range testcases {
4496 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004497 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004498 apex {
4499 name: "myapex",
4500 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004501 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004502 `+tc.propName+`
4503 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004504
Jooyung Han91df2082019-11-20 01:49:42 +09004505 apex_key {
4506 name: "myapex.key",
4507 public_key: "testkey.avbpubkey",
4508 private_key: "testkey.pem",
4509 }
4510 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004511
Jooyung Han91df2082019-11-20 01:49:42 +09004512 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004513 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4514 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004515 if actual != expected {
4516 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4517 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004518
Jooyung Han91df2082019-11-20 01:49:42 +09004519 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004520 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4521 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004522 if actual != expected {
4523 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4524 }
4525 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004526 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004527}
Jiyong Park67882562019-03-21 01:11:21 +09004528
Jooyung Han580eb4f2020-06-24 19:33:06 +09004529func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004530 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004531 apex {
4532 name: "myapex",
4533 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004534 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004535 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004536
Jooyung Han580eb4f2020-06-24 19:33:06 +09004537 apex_key {
4538 name: "myapex.key",
4539 public_key: "testkey.avbpubkey",
4540 private_key: "testkey.pem",
4541 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004542 `)
4543 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004544 rule := module.Output("file_contexts")
4545 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4546}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004547
Jooyung Han580eb4f2020-06-24 19:33:06 +09004548func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004549 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004550 apex {
4551 name: "myapex",
4552 key: "myapex.key",
4553 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004554 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004555 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004556
Jooyung Han580eb4f2020-06-24 19:33:06 +09004557 apex_key {
4558 name: "myapex.key",
4559 public_key: "testkey.avbpubkey",
4560 private_key: "testkey.pem",
4561 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004562 `, withFiles(map[string][]byte{
4563 "my_own_file_contexts": nil,
4564 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004565}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004566
Jooyung Han580eb4f2020-06-24 19:33:06 +09004567func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004568 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004569 apex {
4570 name: "myapex",
4571 key: "myapex.key",
4572 product_specific: true,
4573 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004574 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004575 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004576
Jooyung Han580eb4f2020-06-24 19:33:06 +09004577 apex_key {
4578 name: "myapex.key",
4579 public_key: "testkey.avbpubkey",
4580 private_key: "testkey.pem",
4581 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004582 `)
4583
Colin Cross1c460562021-02-16 17:55:47 -08004584 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004585 apex {
4586 name: "myapex",
4587 key: "myapex.key",
4588 product_specific: true,
4589 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004590 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004591 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004592
Jooyung Han580eb4f2020-06-24 19:33:06 +09004593 apex_key {
4594 name: "myapex.key",
4595 public_key: "testkey.avbpubkey",
4596 private_key: "testkey.pem",
4597 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004598 `, withFiles(map[string][]byte{
4599 "product_specific_file_contexts": nil,
4600 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004601 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4602 rule := module.Output("file_contexts")
4603 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4604}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004605
Jooyung Han580eb4f2020-06-24 19:33:06 +09004606func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004607 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004608 apex {
4609 name: "myapex",
4610 key: "myapex.key",
4611 product_specific: true,
4612 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004613 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004614 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004615
Jooyung Han580eb4f2020-06-24 19:33:06 +09004616 apex_key {
4617 name: "myapex.key",
4618 public_key: "testkey.avbpubkey",
4619 private_key: "testkey.pem",
4620 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004621
Jooyung Han580eb4f2020-06-24 19:33:06 +09004622 filegroup {
4623 name: "my-file-contexts",
4624 srcs: ["product_specific_file_contexts"],
4625 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004626 `, withFiles(map[string][]byte{
4627 "product_specific_file_contexts": nil,
4628 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004629 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4630 rule := module.Output("file_contexts")
4631 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004632}
4633
Jiyong Park67882562019-03-21 01:11:21 +09004634func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004635 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004636 apex_key {
4637 name: "myapex.key",
4638 public_key: ":my.avbpubkey",
4639 private_key: ":my.pem",
4640 product_specific: true,
4641 }
4642
4643 filegroup {
4644 name: "my.avbpubkey",
4645 srcs: ["testkey2.avbpubkey"],
4646 }
4647
4648 filegroup {
4649 name: "my.pem",
4650 srcs: ["testkey2.pem"],
4651 }
4652 `)
4653
4654 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4655 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004656 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004657 if actual_pubkey != expected_pubkey {
4658 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4659 }
4660 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004661 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004662 if actual_privkey != expected_privkey {
4663 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4664 }
4665}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004666
4667func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004668 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004669 prebuilt_apex {
4670 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004671 arch: {
4672 arm64: {
4673 src: "myapex-arm64.apex",
4674 },
4675 arm: {
4676 src: "myapex-arm.apex",
4677 },
4678 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004679 }
4680 `)
4681
Wei Li340ee8e2022-03-18 17:33:24 -07004682 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4683 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004684
Jiyong Parkc95714e2019-03-29 14:23:10 +09004685 expectedInput := "myapex-arm64.apex"
4686 if prebuilt.inputApex.String() != expectedInput {
4687 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4688 }
Wei Li340ee8e2022-03-18 17:33:24 -07004689 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4690 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4691 rule := testingModule.Rule("genProvenanceMetaData")
4692 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4693 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4694 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4695 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004696}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004697
Paul Duffinc0609c62021-03-01 17:27:16 +00004698func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004699 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004700 prebuilt_apex {
4701 name: "myapex",
4702 }
4703 `)
4704}
4705
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004706func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004707 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004708 prebuilt_apex {
4709 name: "myapex",
4710 src: "myapex-arm.apex",
4711 filename: "notmyapex.apex",
4712 }
4713 `)
4714
Wei Li340ee8e2022-03-18 17:33:24 -07004715 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4716 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004717
4718 expected := "notmyapex.apex"
4719 if p.installFilename != expected {
4720 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4721 }
Wei Li340ee8e2022-03-18 17:33:24 -07004722 rule := testingModule.Rule("genProvenanceMetaData")
4723 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4724 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4725 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4726 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004727}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004728
Samiul Islam7c02e262021-09-08 17:48:28 +01004729func TestApexSetFilenameOverride(t *testing.T) {
4730 testApex(t, `
4731 apex_set {
4732 name: "com.company.android.myapex",
4733 apex_name: "com.android.myapex",
4734 set: "company-myapex.apks",
4735 filename: "com.company.android.myapex.apex"
4736 }
4737 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4738
4739 testApex(t, `
4740 apex_set {
4741 name: "com.company.android.myapex",
4742 apex_name: "com.android.myapex",
4743 set: "company-myapex.apks",
4744 filename: "com.company.android.myapex.capex"
4745 }
4746 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4747
4748 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4749 apex_set {
4750 name: "com.company.android.myapex",
4751 apex_name: "com.android.myapex",
4752 set: "company-myapex.apks",
4753 filename: "some-random-suffix"
4754 }
4755 `)
4756}
4757
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004758func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004759 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004760 prebuilt_apex {
4761 name: "myapex.prebuilt",
4762 src: "myapex-arm.apex",
4763 overrides: [
4764 "myapex",
4765 ],
4766 }
4767 `)
4768
Wei Li340ee8e2022-03-18 17:33:24 -07004769 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4770 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004771
4772 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004773 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004774 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004775 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004776 }
Wei Li340ee8e2022-03-18 17:33:24 -07004777 rule := testingModule.Rule("genProvenanceMetaData")
4778 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4779 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4780 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4781 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004782}
4783
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004784func TestPrebuiltApexName(t *testing.T) {
4785 testApex(t, `
4786 prebuilt_apex {
4787 name: "com.company.android.myapex",
4788 apex_name: "com.android.myapex",
4789 src: "company-myapex-arm.apex",
4790 }
4791 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4792
4793 testApex(t, `
4794 apex_set {
4795 name: "com.company.android.myapex",
4796 apex_name: "com.android.myapex",
4797 set: "company-myapex.apks",
4798 }
4799 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4800}
4801
4802func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4803 _ = android.GroupFixturePreparers(
4804 java.PrepareForTestWithJavaDefaultModules,
4805 PrepareForTestWithApexBuildComponents,
4806 android.FixtureWithRootAndroidBp(`
4807 platform_bootclasspath {
4808 name: "platform-bootclasspath",
4809 fragments: [
4810 {
4811 apex: "com.android.art",
4812 module: "art-bootclasspath-fragment",
4813 },
4814 ],
4815 }
4816
4817 prebuilt_apex {
4818 name: "com.company.android.art",
4819 apex_name: "com.android.art",
4820 src: "com.company.android.art-arm.apex",
4821 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4822 }
4823
4824 prebuilt_bootclasspath_fragment {
4825 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004826 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004827 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004828 hidden_api: {
4829 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4830 metadata: "my-bootclasspath-fragment/metadata.csv",
4831 index: "my-bootclasspath-fragment/index.csv",
4832 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4833 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4834 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004835 }
4836
4837 java_import {
4838 name: "core-oj",
4839 jars: ["prebuilt.jar"],
4840 }
4841 `),
4842 ).RunTest(t)
4843}
4844
Paul Duffin092153d2021-01-26 11:42:39 +00004845// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4846// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004847func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004848 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004849
Paul Duffin89886cb2021-02-05 16:44:03 +00004850 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004851 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004852 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004853 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004854 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004855 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004856 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4857 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4858 android.NormalizePathForTesting(dexJarBuildPath))
4859 }
4860
4861 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004862 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004863 // Make sure the import has been given the correct path to the dex jar.
4864 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4865 dexJarBuildPath := p.DexJarInstallPath()
4866 stem := android.RemoveOptionalPrebuiltPrefix(name)
4867 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4868 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4869 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004870 }
4871
Paul Duffin39853512021-02-26 11:09:39 +00004872 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004873 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004874 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004875 android.AssertArrayString(t, "Check if there is no source variant",
4876 []string{"android_common"},
4877 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004878 }
4879
4880 t.Run("prebuilt only", func(t *testing.T) {
4881 bp := `
4882 prebuilt_apex {
4883 name: "myapex",
4884 arch: {
4885 arm64: {
4886 src: "myapex-arm64.apex",
4887 },
4888 arm: {
4889 src: "myapex-arm.apex",
4890 },
4891 },
Paul Duffin39853512021-02-26 11:09:39 +00004892 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004893 }
4894
4895 java_import {
4896 name: "libfoo",
4897 jars: ["libfoo.jar"],
4898 }
Paul Duffin39853512021-02-26 11:09:39 +00004899
4900 java_sdk_library_import {
4901 name: "libbar",
4902 public: {
4903 jars: ["libbar.jar"],
4904 },
4905 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004906 `
4907
4908 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4909 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4910
Martin Stjernholm44825602021-09-17 01:44:12 +01004911 deapexerName := deapexerModuleName("myapex")
4912 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4913
Paul Duffinf6932af2021-02-26 18:21:56 +00004914 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004915 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004916 rule := deapexer.Rule("deapexer")
4917 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4918 t.Errorf("expected: %q, found: %q", expected, actual)
4919 }
4920
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004921 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004922 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004923 rule = prebuiltApex.Rule("android/soong/android.Cp")
4924 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4925 t.Errorf("expected: %q, found: %q", expected, actual)
4926 }
4927
Paul Duffin89886cb2021-02-05 16:44:03 +00004928 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004929 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004930
4931 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004932 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004933 })
4934
4935 t.Run("prebuilt with source preferred", func(t *testing.T) {
4936
4937 bp := `
4938 prebuilt_apex {
4939 name: "myapex",
4940 arch: {
4941 arm64: {
4942 src: "myapex-arm64.apex",
4943 },
4944 arm: {
4945 src: "myapex-arm.apex",
4946 },
4947 },
Paul Duffin39853512021-02-26 11:09:39 +00004948 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004949 }
4950
4951 java_import {
4952 name: "libfoo",
4953 jars: ["libfoo.jar"],
4954 }
4955
4956 java_library {
4957 name: "libfoo",
4958 }
Paul Duffin39853512021-02-26 11:09:39 +00004959
4960 java_sdk_library_import {
4961 name: "libbar",
4962 public: {
4963 jars: ["libbar.jar"],
4964 },
4965 }
4966
4967 java_sdk_library {
4968 name: "libbar",
4969 srcs: ["foo/bar/MyClass.java"],
4970 unsafe_ignore_missing_latest_api: true,
4971 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004972 `
4973
4974 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4975 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4976
Paul Duffin89886cb2021-02-05 16:44:03 +00004977 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004978 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004979 ensureNoSourceVariant(t, ctx, "libfoo")
4980
4981 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004982 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004983 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004984 })
4985
4986 t.Run("prebuilt preferred with source", func(t *testing.T) {
4987 bp := `
4988 prebuilt_apex {
4989 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004990 arch: {
4991 arm64: {
4992 src: "myapex-arm64.apex",
4993 },
4994 arm: {
4995 src: "myapex-arm.apex",
4996 },
4997 },
Paul Duffin39853512021-02-26 11:09:39 +00004998 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004999 }
5000
5001 java_import {
5002 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005003 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005004 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 prefer: true,
5014 public: {
5015 jars: ["libbar.jar"],
5016 },
5017 }
5018
5019 java_sdk_library {
5020 name: "libbar",
5021 srcs: ["foo/bar/MyClass.java"],
5022 unsafe_ignore_missing_latest_api: true,
5023 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005024 `
5025
5026 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5027 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5028
Paul Duffin89886cb2021-02-05 16:44:03 +00005029 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005030 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005031 ensureNoSourceVariant(t, ctx, "libfoo")
5032
5033 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005034 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005035 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005036 })
5037}
5038
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005039func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005040 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005041 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005042 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5043 // is disabled.
5044 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5045 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005046
Paul Duffin37856732021-02-26 14:24:15 +00005047 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5048 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005049 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005050 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005051 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005052 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005053 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005054 foundLibfooJar = true
5055 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005056 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005057 }
5058 }
5059 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005060 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 +00005061 }
5062 }
5063
Paul Duffin40a3f652021-07-19 13:11:24 +01005064 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005065 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005066 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005067 var rule android.TestingBuildParams
5068
5069 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5070 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005071 }
5072
Paul Duffin40a3f652021-07-19 13:11:24 +01005073 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5074 t.Helper()
5075 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5076 var rule android.TestingBuildParams
5077
5078 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5079 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5080 }
5081
Paul Duffin89f570a2021-06-16 01:42:33 +01005082 fragment := java.ApexVariantReference{
5083 Apex: proptools.StringPtr("myapex"),
5084 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5085 }
5086
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005087 t.Run("prebuilt only", func(t *testing.T) {
5088 bp := `
5089 prebuilt_apex {
5090 name: "myapex",
5091 arch: {
5092 arm64: {
5093 src: "myapex-arm64.apex",
5094 },
5095 arm: {
5096 src: "myapex-arm.apex",
5097 },
5098 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005099 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5100 }
5101
5102 prebuilt_bootclasspath_fragment {
5103 name: "my-bootclasspath-fragment",
5104 contents: ["libfoo", "libbar"],
5105 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005106 hidden_api: {
5107 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5108 metadata: "my-bootclasspath-fragment/metadata.csv",
5109 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005110 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5111 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5112 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005113 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005114 }
5115
5116 java_import {
5117 name: "libfoo",
5118 jars: ["libfoo.jar"],
5119 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005120 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005121 }
Paul Duffin37856732021-02-26 14:24:15 +00005122
5123 java_sdk_library_import {
5124 name: "libbar",
5125 public: {
5126 jars: ["libbar.jar"],
5127 },
5128 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005129 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005130 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005131 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005132 `
5133
Paul Duffin89f570a2021-06-16 01:42:33 +01005134 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005135 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5136 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005137
Paul Duffin537ea3d2021-05-14 10:38:00 +01005138 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005139 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005140 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005141 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005142 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5143 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005144 })
5145
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005146 t.Run("apex_set only", func(t *testing.T) {
5147 bp := `
5148 apex_set {
5149 name: "myapex",
5150 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005151 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5152 }
5153
5154 prebuilt_bootclasspath_fragment {
5155 name: "my-bootclasspath-fragment",
5156 contents: ["libfoo", "libbar"],
5157 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005158 hidden_api: {
5159 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5160 metadata: "my-bootclasspath-fragment/metadata.csv",
5161 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005162 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5163 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5164 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005165 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005166 }
5167
5168 java_import {
5169 name: "libfoo",
5170 jars: ["libfoo.jar"],
5171 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005172 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005173 }
5174
5175 java_sdk_library_import {
5176 name: "libbar",
5177 public: {
5178 jars: ["libbar.jar"],
5179 },
5180 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005181 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005182 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005183 }
5184 `
5185
Paul Duffin89f570a2021-06-16 01:42:33 +01005186 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005187 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5188 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5189
Paul Duffin537ea3d2021-05-14 10:38:00 +01005190 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005191 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005192 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005193 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005194 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5195 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005196 })
5197
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005198 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5199 bp := `
5200 prebuilt_apex {
5201 name: "myapex",
5202 arch: {
5203 arm64: {
5204 src: "myapex-arm64.apex",
5205 },
5206 arm: {
5207 src: "myapex-arm.apex",
5208 },
5209 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005210 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5211 }
5212
5213 prebuilt_bootclasspath_fragment {
5214 name: "my-bootclasspath-fragment",
5215 contents: ["libfoo", "libbar"],
5216 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005217 hidden_api: {
5218 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5219 metadata: "my-bootclasspath-fragment/metadata.csv",
5220 index: "my-bootclasspath-fragment/index.csv",
5221 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5222 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5223 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005224 }
5225
5226 java_import {
5227 name: "libfoo",
5228 jars: ["libfoo.jar"],
5229 apex_available: ["myapex"],
5230 }
5231
5232 java_library {
5233 name: "libfoo",
5234 srcs: ["foo/bar/MyClass.java"],
5235 apex_available: ["myapex"],
5236 }
Paul Duffin37856732021-02-26 14:24:15 +00005237
5238 java_sdk_library_import {
5239 name: "libbar",
5240 public: {
5241 jars: ["libbar.jar"],
5242 },
5243 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005244 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005245 }
5246
5247 java_sdk_library {
5248 name: "libbar",
5249 srcs: ["foo/bar/MyClass.java"],
5250 unsafe_ignore_missing_latest_api: true,
5251 apex_available: ["myapex"],
5252 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005253 `
5254
5255 // In this test the source (java_library) libfoo is active since the
5256 // prebuilt (java_import) defaults to prefer:false. However the
5257 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5258 // find the dex boot jar in it. We either need to disable the source libfoo
5259 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005260 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005261 // dexbootjar check is skipped if AllowMissingDependencies is true
5262 preparerAllowMissingDeps := android.GroupFixturePreparers(
5263 preparer,
5264 android.PrepareForTestWithAllowMissingDependencies,
5265 )
5266 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005267 })
5268
5269 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5270 bp := `
5271 prebuilt_apex {
5272 name: "myapex",
5273 arch: {
5274 arm64: {
5275 src: "myapex-arm64.apex",
5276 },
5277 arm: {
5278 src: "myapex-arm.apex",
5279 },
5280 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005281 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5282 }
5283
5284 prebuilt_bootclasspath_fragment {
5285 name: "my-bootclasspath-fragment",
5286 contents: ["libfoo", "libbar"],
5287 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005288 hidden_api: {
5289 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5290 metadata: "my-bootclasspath-fragment/metadata.csv",
5291 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005292 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5293 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5294 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005295 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005296 }
5297
5298 java_import {
5299 name: "libfoo",
5300 prefer: true,
5301 jars: ["libfoo.jar"],
5302 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005303 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005304 }
5305
5306 java_library {
5307 name: "libfoo",
5308 srcs: ["foo/bar/MyClass.java"],
5309 apex_available: ["myapex"],
5310 }
Paul Duffin37856732021-02-26 14:24:15 +00005311
5312 java_sdk_library_import {
5313 name: "libbar",
5314 prefer: true,
5315 public: {
5316 jars: ["libbar.jar"],
5317 },
5318 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005319 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005320 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005321 }
5322
5323 java_sdk_library {
5324 name: "libbar",
5325 srcs: ["foo/bar/MyClass.java"],
5326 unsafe_ignore_missing_latest_api: true,
5327 apex_available: ["myapex"],
5328 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005329 `
5330
Paul Duffin89f570a2021-06-16 01:42:33 +01005331 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005332 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5333 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005334
Paul Duffin537ea3d2021-05-14 10:38:00 +01005335 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005336 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005337 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005338 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005339 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5340 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005341 })
5342
5343 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5344 bp := `
5345 apex {
5346 name: "myapex",
5347 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005348 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005349 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005350 }
5351
5352 apex_key {
5353 name: "myapex.key",
5354 public_key: "testkey.avbpubkey",
5355 private_key: "testkey.pem",
5356 }
5357
5358 prebuilt_apex {
5359 name: "myapex",
5360 arch: {
5361 arm64: {
5362 src: "myapex-arm64.apex",
5363 },
5364 arm: {
5365 src: "myapex-arm.apex",
5366 },
5367 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005368 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5369 }
5370
5371 prebuilt_bootclasspath_fragment {
5372 name: "my-bootclasspath-fragment",
5373 contents: ["libfoo", "libbar"],
5374 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005375 hidden_api: {
5376 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5377 metadata: "my-bootclasspath-fragment/metadata.csv",
5378 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005379 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5380 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5381 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005382 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005383 }
5384
5385 java_import {
5386 name: "libfoo",
5387 jars: ["libfoo.jar"],
5388 apex_available: ["myapex"],
5389 }
5390
5391 java_library {
5392 name: "libfoo",
5393 srcs: ["foo/bar/MyClass.java"],
5394 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005395 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005396 }
Paul Duffin37856732021-02-26 14:24:15 +00005397
5398 java_sdk_library_import {
5399 name: "libbar",
5400 public: {
5401 jars: ["libbar.jar"],
5402 },
5403 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005404 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005405 }
5406
5407 java_sdk_library {
5408 name: "libbar",
5409 srcs: ["foo/bar/MyClass.java"],
5410 unsafe_ignore_missing_latest_api: true,
5411 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005412 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005413 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005414 `
5415
Paul Duffin89f570a2021-06-16 01:42:33 +01005416 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005417 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5418 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005419
Paul Duffin537ea3d2021-05-14 10:38:00 +01005420 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005421 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005422 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005423 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005424 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5425 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005426 })
5427
5428 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5429 bp := `
5430 apex {
5431 name: "myapex",
5432 enabled: false,
5433 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005434 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005435 }
5436
5437 apex_key {
5438 name: "myapex.key",
5439 public_key: "testkey.avbpubkey",
5440 private_key: "testkey.pem",
5441 }
5442
5443 prebuilt_apex {
5444 name: "myapex",
5445 arch: {
5446 arm64: {
5447 src: "myapex-arm64.apex",
5448 },
5449 arm: {
5450 src: "myapex-arm.apex",
5451 },
5452 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005453 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5454 }
5455
5456 prebuilt_bootclasspath_fragment {
5457 name: "my-bootclasspath-fragment",
5458 contents: ["libfoo", "libbar"],
5459 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005460 hidden_api: {
5461 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5462 metadata: "my-bootclasspath-fragment/metadata.csv",
5463 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005464 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5465 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5466 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005467 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005468 }
5469
5470 java_import {
5471 name: "libfoo",
5472 prefer: true,
5473 jars: ["libfoo.jar"],
5474 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005475 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005476 }
5477
5478 java_library {
5479 name: "libfoo",
5480 srcs: ["foo/bar/MyClass.java"],
5481 apex_available: ["myapex"],
5482 }
Paul Duffin37856732021-02-26 14:24:15 +00005483
5484 java_sdk_library_import {
5485 name: "libbar",
5486 prefer: true,
5487 public: {
5488 jars: ["libbar.jar"],
5489 },
5490 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005491 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005492 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005493 }
5494
5495 java_sdk_library {
5496 name: "libbar",
5497 srcs: ["foo/bar/MyClass.java"],
5498 unsafe_ignore_missing_latest_api: true,
5499 apex_available: ["myapex"],
5500 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005501 `
5502
Paul Duffin89f570a2021-06-16 01:42:33 +01005503 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005504 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5505 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005506
Paul Duffin537ea3d2021-05-14 10:38:00 +01005507 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005508 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005509 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005510 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005511 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5512 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005513 })
5514}
5515
Roland Levillain630846d2019-06-26 12:48:34 +01005516func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005517 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005518 apex_test {
5519 name: "myapex",
5520 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005521 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005522 tests: [
5523 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005524 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005525 ],
5526 }
5527
5528 apex_key {
5529 name: "myapex.key",
5530 public_key: "testkey.avbpubkey",
5531 private_key: "testkey.pem",
5532 }
5533
Liz Kammer1c14a212020-05-12 15:26:55 -07005534 filegroup {
5535 name: "fg",
5536 srcs: [
5537 "baz",
5538 "bar/baz"
5539 ],
5540 }
5541
Roland Levillain630846d2019-06-26 12:48:34 +01005542 cc_test {
5543 name: "mytest",
5544 gtest: false,
5545 srcs: ["mytest.cpp"],
5546 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005547 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005548 system_shared_libs: [],
5549 static_executable: true,
5550 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005551 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005552 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005553
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005554 cc_library {
5555 name: "mylib",
5556 srcs: ["mylib.cpp"],
5557 system_shared_libs: [],
5558 stl: "none",
5559 }
5560
Liz Kammer5bd365f2020-05-27 15:15:11 -07005561 filegroup {
5562 name: "fg2",
5563 srcs: [
5564 "testdata/baz"
5565 ],
5566 }
5567
Roland Levillain9b5fde92019-06-28 15:41:19 +01005568 cc_test {
5569 name: "mytests",
5570 gtest: false,
5571 srcs: [
5572 "mytest1.cpp",
5573 "mytest2.cpp",
5574 "mytest3.cpp",
5575 ],
5576 test_per_src: true,
5577 relative_install_path: "test",
5578 system_shared_libs: [],
5579 static_executable: true,
5580 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005581 data: [
5582 ":fg",
5583 ":fg2",
5584 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005585 }
Roland Levillain630846d2019-06-26 12:48:34 +01005586 `)
5587
Sundong Ahnabb64432019-10-22 13:58:29 +09005588 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005589 copyCmds := apexRule.Args["copy_commands"]
5590
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005591 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005592 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005593 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005594
Liz Kammer1c14a212020-05-12 15:26:55 -07005595 //Ensure that test data are copied into apex.
5596 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5597 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5598
Roland Levillain9b5fde92019-06-28 15:41:19 +01005599 // Ensure that test deps built with `test_per_src` are copied into apex.
5600 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5601 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5602 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005603
5604 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005605 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005606 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005607 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005608 prefix := "TARGET_"
5609 var builder strings.Builder
5610 data.Custom(&builder, name, prefix, "", data)
5611 androidMk := builder.String()
Prerana Patilb1896c82022-11-09 18:14:34 +00005612 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5613 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5614 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5615 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5616 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5617 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005618 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005619
5620 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005621 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005622 data.Custom(&builder, name, prefix, "", data)
5623 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005624 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5625 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005626}
5627
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005628func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005629 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005630 apex {
5631 name: "myapex",
5632 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005633 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005634 }
5635 apex_key {
5636 name: "myapex.key",
5637 public_key: "testkey.avbpubkey",
5638 private_key: "testkey.pem",
5639 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005640 `,
5641 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5642 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5643 }),
5644 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005645 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005646 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005647 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005648 var builder strings.Builder
5649 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5650 androidMk := builder.String()
5651 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5652}
5653
Jooyung Hand48f3c32019-08-23 11:18:57 +09005654func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5655 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5656 apex {
5657 name: "myapex",
5658 key: "myapex.key",
5659 native_shared_libs: ["libfoo"],
5660 }
5661
5662 apex_key {
5663 name: "myapex.key",
5664 public_key: "testkey.avbpubkey",
5665 private_key: "testkey.pem",
5666 }
5667
5668 cc_library {
5669 name: "libfoo",
5670 stl: "none",
5671 system_shared_libs: [],
5672 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005673 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005674 }
5675 `)
5676 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5677 apex {
5678 name: "myapex",
5679 key: "myapex.key",
5680 java_libs: ["myjar"],
5681 }
5682
5683 apex_key {
5684 name: "myapex.key",
5685 public_key: "testkey.avbpubkey",
5686 private_key: "testkey.pem",
5687 }
5688
5689 java_library {
5690 name: "myjar",
5691 srcs: ["foo/bar/MyClass.java"],
5692 sdk_version: "none",
5693 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005694 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005695 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005696 }
5697 `)
5698}
5699
Bill Peckhama41a6962021-01-11 10:58:54 -08005700func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005701 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005702 apex {
5703 name: "myapex",
5704 key: "myapex.key",
5705 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005706 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005707 }
5708
5709 apex_key {
5710 name: "myapex.key",
5711 public_key: "testkey.avbpubkey",
5712 private_key: "testkey.pem",
5713 }
5714
5715 java_import {
5716 name: "myjavaimport",
5717 apex_available: ["myapex"],
5718 jars: ["my.jar"],
5719 compile_dex: true,
5720 }
5721 `)
5722
5723 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5724 apexRule := module.Rule("apexRule")
5725 copyCmds := apexRule.Args["copy_commands"]
5726 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5727}
5728
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005729func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005730 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005731 apex {
5732 name: "myapex",
5733 key: "myapex.key",
5734 apps: [
5735 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005736 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005737 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005738 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005739 }
5740
5741 apex_key {
5742 name: "myapex.key",
5743 public_key: "testkey.avbpubkey",
5744 private_key: "testkey.pem",
5745 }
5746
5747 android_app {
5748 name: "AppFoo",
5749 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005750 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005751 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005752 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005753 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005754 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005755 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005756
5757 android_app {
5758 name: "AppFooPriv",
5759 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005760 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005761 system_modules: "none",
5762 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005763 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005764 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005765 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005766
5767 cc_library_shared {
5768 name: "libjni",
5769 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005770 shared_libs: ["libfoo"],
5771 stl: "none",
5772 system_shared_libs: [],
5773 apex_available: [ "myapex" ],
5774 sdk_version: "current",
5775 }
5776
5777 cc_library_shared {
5778 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005779 stl: "none",
5780 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005781 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005782 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005783 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005784 `)
5785
Sundong Ahnabb64432019-10-22 13:58:29 +09005786 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005787 apexRule := module.Rule("apexRule")
5788 copyCmds := apexRule.Args["copy_commands"]
5789
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005790 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5791 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005792
Colin Crossaede88c2020-08-11 12:17:01 -07005793 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005794 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005795 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005796 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005797 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005798 // JNI libraries including transitive deps are
5799 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005800 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005801 // ... embedded inside APK (jnilibs.zip)
5802 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5803 // ... and not directly inside the APEX
5804 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5805 }
Dario Frenicde2a032019-10-27 00:29:22 +01005806}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005807
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005808func TestApexWithAppImportBuildId(t *testing.T) {
5809 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5810 for _, id := range invalidBuildIds {
5811 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5812 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5813 variables.BuildId = proptools.StringPtr(id)
5814 })
5815 testApexError(t, message, `apex {
5816 name: "myapex",
5817 key: "myapex.key",
5818 apps: ["AppFooPrebuilt"],
5819 updatable: false,
5820 }
5821
5822 apex_key {
5823 name: "myapex.key",
5824 public_key: "testkey.avbpubkey",
5825 private_key: "testkey.pem",
5826 }
5827
5828 android_app_import {
5829 name: "AppFooPrebuilt",
5830 apk: "PrebuiltAppFoo.apk",
5831 presigned: true,
5832 apex_available: ["myapex"],
5833 }
5834 `, fixture)
5835 }
5836}
5837
Dario Frenicde2a032019-10-27 00:29:22 +01005838func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005839 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005840 apex {
5841 name: "myapex",
5842 key: "myapex.key",
5843 apps: [
5844 "AppFooPrebuilt",
5845 "AppFooPrivPrebuilt",
5846 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005847 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005848 }
5849
5850 apex_key {
5851 name: "myapex.key",
5852 public_key: "testkey.avbpubkey",
5853 private_key: "testkey.pem",
5854 }
5855
5856 android_app_import {
5857 name: "AppFooPrebuilt",
5858 apk: "PrebuiltAppFoo.apk",
5859 presigned: true,
5860 dex_preopt: {
5861 enabled: false,
5862 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005863 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005864 }
5865
5866 android_app_import {
5867 name: "AppFooPrivPrebuilt",
5868 apk: "PrebuiltAppFooPriv.apk",
5869 privileged: true,
5870 presigned: true,
5871 dex_preopt: {
5872 enabled: false,
5873 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005874 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005875 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005876 }
5877 `)
5878
Sundong Ahnabb64432019-10-22 13:58:29 +09005879 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005880 apexRule := module.Rule("apexRule")
5881 copyCmds := apexRule.Args["copy_commands"]
5882
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005883 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5884 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005885}
5886
5887func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005888 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005889 apex {
5890 name: "myapex",
5891 key: "myapex.key",
5892 apps: [
5893 "AppFoo",
5894 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005895 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005896 }
5897
5898 apex_key {
5899 name: "myapex.key",
5900 public_key: "testkey.avbpubkey",
5901 private_key: "testkey.pem",
5902 }
5903
5904 android_app {
5905 name: "AppFoo",
5906 srcs: ["foo/bar/MyClass.java"],
5907 sdk_version: "none",
5908 system_modules: "none",
5909 apex_available: [ "myapex" ],
5910 }
5911
5912 android_app_import {
5913 name: "AppFoo",
5914 apk: "AppFooPrebuilt.apk",
5915 filename: "AppFooPrebuilt.apk",
5916 presigned: true,
5917 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005918 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005919 }
5920 `, withFiles(map[string][]byte{
5921 "AppFooPrebuilt.apk": nil,
5922 }))
5923
5924 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005925 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005926 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005927}
5928
Dario Freni6f3937c2019-12-20 22:58:03 +00005929func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005930 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005931 apex {
5932 name: "myapex",
5933 key: "myapex.key",
5934 apps: [
5935 "TesterHelpAppFoo",
5936 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005937 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005938 }
5939
5940 apex_key {
5941 name: "myapex.key",
5942 public_key: "testkey.avbpubkey",
5943 private_key: "testkey.pem",
5944 }
5945
5946 android_test_helper_app {
5947 name: "TesterHelpAppFoo",
5948 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005949 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005950 }
5951
5952 `)
5953
5954 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5955 apexRule := module.Rule("apexRule")
5956 copyCmds := apexRule.Args["copy_commands"]
5957
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005958 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005959}
5960
Jooyung Han18020ea2019-11-13 10:50:48 +09005961func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5962 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005963 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005964 apex {
5965 name: "myapex",
5966 key: "myapex.key",
5967 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005968 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005969 }
5970
5971 apex_key {
5972 name: "myapex.key",
5973 public_key: "testkey.avbpubkey",
5974 private_key: "testkey.pem",
5975 }
5976
5977 apex {
5978 name: "otherapex",
5979 key: "myapex.key",
5980 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005981 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005982 }
5983
5984 cc_defaults {
5985 name: "libfoo-defaults",
5986 apex_available: ["otherapex"],
5987 }
5988
5989 cc_library {
5990 name: "libfoo",
5991 defaults: ["libfoo-defaults"],
5992 stl: "none",
5993 system_shared_libs: [],
5994 }`)
5995}
5996
Paul Duffine52e66f2020-03-30 17:54:29 +01005997func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005998 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005999 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006000 apex {
6001 name: "myapex",
6002 key: "myapex.key",
6003 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006004 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006005 }
6006
6007 apex_key {
6008 name: "myapex.key",
6009 public_key: "testkey.avbpubkey",
6010 private_key: "testkey.pem",
6011 }
6012
6013 apex {
6014 name: "otherapex",
6015 key: "otherapex.key",
6016 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006017 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006018 }
6019
6020 apex_key {
6021 name: "otherapex.key",
6022 public_key: "testkey.avbpubkey",
6023 private_key: "testkey.pem",
6024 }
6025
6026 cc_library {
6027 name: "libfoo",
6028 stl: "none",
6029 system_shared_libs: [],
6030 apex_available: ["otherapex"],
6031 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006032}
Jiyong Park127b40b2019-09-30 16:04:35 +09006033
Paul Duffine52e66f2020-03-30 17:54:29 +01006034func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006035 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006036 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006037.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006038.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006039.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006040.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006041.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006042.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006043 apex {
6044 name: "myapex",
6045 key: "myapex.key",
6046 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006047 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006048 }
6049
6050 apex_key {
6051 name: "myapex.key",
6052 public_key: "testkey.avbpubkey",
6053 private_key: "testkey.pem",
6054 }
6055
Jiyong Park127b40b2019-09-30 16:04:35 +09006056 cc_library {
6057 name: "libfoo",
6058 stl: "none",
6059 shared_libs: ["libbar"],
6060 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006061 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006062 }
6063
6064 cc_library {
6065 name: "libbar",
6066 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006067 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006068 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006069 apex_available: ["myapex"],
6070 }
6071
6072 cc_library {
6073 name: "libbaz",
6074 stl: "none",
6075 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006076 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006077}
Jiyong Park127b40b2019-09-30 16:04:35 +09006078
Paul Duffine52e66f2020-03-30 17:54:29 +01006079func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006080 testApexError(t, "\"otherapex\" is not a valid module name", `
6081 apex {
6082 name: "myapex",
6083 key: "myapex.key",
6084 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006085 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006086 }
6087
6088 apex_key {
6089 name: "myapex.key",
6090 public_key: "testkey.avbpubkey",
6091 private_key: "testkey.pem",
6092 }
6093
6094 cc_library {
6095 name: "libfoo",
6096 stl: "none",
6097 system_shared_libs: [],
6098 apex_available: ["otherapex"],
6099 }`)
6100
Paul Duffine52e66f2020-03-30 17:54:29 +01006101 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006102 apex {
6103 name: "myapex",
6104 key: "myapex.key",
6105 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006106 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006107 }
6108
6109 apex_key {
6110 name: "myapex.key",
6111 public_key: "testkey.avbpubkey",
6112 private_key: "testkey.pem",
6113 }
6114
6115 cc_library {
6116 name: "libfoo",
6117 stl: "none",
6118 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006119 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006120 apex_available: ["myapex"],
6121 }
6122
6123 cc_library {
6124 name: "libbar",
6125 stl: "none",
6126 system_shared_libs: [],
6127 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006128 }
6129
6130 cc_library {
6131 name: "libbaz",
6132 stl: "none",
6133 system_shared_libs: [],
6134 stubs: {
6135 versions: ["10", "20", "30"],
6136 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006137 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006138}
Jiyong Park127b40b2019-09-30 16:04:35 +09006139
Jiyong Park89e850a2020-04-07 16:37:39 +09006140func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006141 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006142 apex {
6143 name: "myapex",
6144 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006145 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006146 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006147 }
6148
6149 apex_key {
6150 name: "myapex.key",
6151 public_key: "testkey.avbpubkey",
6152 private_key: "testkey.pem",
6153 }
6154
6155 cc_library {
6156 name: "libfoo",
6157 stl: "none",
6158 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006159 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006160 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006161 }
6162
6163 cc_library {
6164 name: "libfoo2",
6165 stl: "none",
6166 system_shared_libs: [],
6167 shared_libs: ["libbaz"],
6168 apex_available: ["//apex_available:platform"],
6169 }
6170
6171 cc_library {
6172 name: "libbar",
6173 stl: "none",
6174 system_shared_libs: [],
6175 apex_available: ["myapex"],
6176 }
6177
6178 cc_library {
6179 name: "libbaz",
6180 stl: "none",
6181 system_shared_libs: [],
6182 apex_available: ["myapex"],
6183 stubs: {
6184 versions: ["1"],
6185 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006186 }`)
6187
Jiyong Park89e850a2020-04-07 16:37:39 +09006188 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6189 // because it depends on libbar which isn't available to platform
6190 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6191 if libfoo.NotAvailableForPlatform() != true {
6192 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6193 }
6194
6195 // libfoo2 however can be available to platform because it depends on libbaz which provides
6196 // stubs
6197 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6198 if libfoo2.NotAvailableForPlatform() == true {
6199 t.Errorf("%q should be available to platform", libfoo2.String())
6200 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006201}
Jiyong Parka90ca002019-10-07 15:47:24 +09006202
Paul Duffine52e66f2020-03-30 17:54:29 +01006203func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006204 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006205 apex {
6206 name: "myapex",
6207 key: "myapex.key",
6208 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006209 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006210 }
6211
6212 apex_key {
6213 name: "myapex.key",
6214 public_key: "testkey.avbpubkey",
6215 private_key: "testkey.pem",
6216 }
6217
6218 cc_library {
6219 name: "libfoo",
6220 stl: "none",
6221 system_shared_libs: [],
6222 apex_available: ["myapex"],
6223 static: {
6224 apex_available: ["//apex_available:platform"],
6225 },
6226 }`)
6227
Jiyong Park89e850a2020-04-07 16:37:39 +09006228 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6229 if libfooShared.NotAvailableForPlatform() != true {
6230 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6231 }
6232 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6233 if libfooStatic.NotAvailableForPlatform() != false {
6234 t.Errorf("%q should be available to platform", libfooStatic.String())
6235 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006236}
6237
Jiyong Park5d790c32019-11-15 18:40:32 +09006238func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006239 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006240 apex {
6241 name: "myapex",
6242 key: "myapex.key",
6243 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006244 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006245 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006246 bootclasspath_fragments: ["mybootclasspath_fragment"],
6247 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6248 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006249 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006250 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006251 }
6252
6253 override_apex {
6254 name: "override_myapex",
6255 base: "myapex",
6256 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006257 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006258 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006259 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6260 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6261 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006262 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006263 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006264 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006265 key: "mynewapex.key",
6266 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006267 }
6268
6269 apex_key {
6270 name: "myapex.key",
6271 public_key: "testkey.avbpubkey",
6272 private_key: "testkey.pem",
6273 }
6274
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006275 apex_key {
6276 name: "mynewapex.key",
6277 public_key: "testkey2.avbpubkey",
6278 private_key: "testkey2.pem",
6279 }
6280
6281 android_app_certificate {
6282 name: "myapex.certificate",
6283 certificate: "testkey",
6284 }
6285
Jiyong Park5d790c32019-11-15 18:40:32 +09006286 android_app {
6287 name: "app",
6288 srcs: ["foo/bar/MyClass.java"],
6289 package_name: "foo",
6290 sdk_version: "none",
6291 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006292 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006293 }
6294
6295 override_android_app {
6296 name: "override_app",
6297 base: "app",
6298 package_name: "bar",
6299 }
markchien7c803b82021-08-26 22:10:06 +08006300
6301 bpf {
6302 name: "bpf",
6303 srcs: ["bpf.c"],
6304 }
6305
6306 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006307 name: "overrideBpf",
6308 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006309 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006310
6311 prebuilt_etc {
6312 name: "myetc",
6313 src: "myprebuilt",
6314 }
6315
6316 prebuilt_etc {
6317 name: "override_myetc",
6318 src: "override_myprebuilt",
6319 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006320
6321 java_library {
6322 name: "bcplib",
6323 srcs: ["a.java"],
6324 compile_dex: true,
6325 apex_available: ["myapex"],
6326 permitted_packages: ["bcp.lib"],
6327 }
6328
6329 bootclasspath_fragment {
6330 name: "mybootclasspath_fragment",
6331 contents: ["bcplib"],
6332 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006333 hidden_api: {
6334 split_packages: ["*"],
6335 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006336 }
6337
6338 java_library {
6339 name: "override_bcplib",
6340 srcs: ["a.java"],
6341 compile_dex: true,
6342 apex_available: ["myapex"],
6343 permitted_packages: ["override.bcp.lib"],
6344 }
6345
6346 bootclasspath_fragment {
6347 name: "override_bootclasspath_fragment",
6348 contents: ["override_bcplib"],
6349 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006350 hidden_api: {
6351 split_packages: ["*"],
6352 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006353 }
6354
6355 java_library {
6356 name: "systemserverlib",
6357 srcs: ["a.java"],
6358 apex_available: ["myapex"],
6359 }
6360
6361 systemserverclasspath_fragment {
6362 name: "mysystemserverclasspath_fragment",
6363 standalone_contents: ["systemserverlib"],
6364 apex_available: ["myapex"],
6365 }
6366
6367 java_library {
6368 name: "override_systemserverlib",
6369 srcs: ["a.java"],
6370 apex_available: ["myapex"],
6371 }
6372
6373 systemserverclasspath_fragment {
6374 name: "override_systemserverclasspath_fragment",
6375 standalone_contents: ["override_systemserverlib"],
6376 apex_available: ["myapex"],
6377 }
6378
6379 java_library {
6380 name: "myjava_library",
6381 srcs: ["a.java"],
6382 compile_dex: true,
6383 apex_available: ["myapex"],
6384 }
6385
6386 java_library {
6387 name: "override_java_library",
6388 srcs: ["a.java"],
6389 compile_dex: true,
6390 apex_available: ["myapex"],
6391 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006392 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006393
Jiyong Park317645e2019-12-05 13:20:58 +09006394 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6395 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6396 if originalVariant.GetOverriddenBy() != "" {
6397 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6398 }
6399 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6400 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6401 }
6402
Jiyong Park5d790c32019-11-15 18:40:32 +09006403 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6404 apexRule := module.Rule("apexRule")
6405 copyCmds := apexRule.Args["copy_commands"]
6406
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006407 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6408 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006409
markchien7c803b82021-08-26 22:10:06 +08006410 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006411 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006412
Daniel Norman5a3ce132021-08-26 15:44:43 -07006413 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6414 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6415
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006416 apexBundle := module.Module().(*apexBundle)
6417 name := apexBundle.Name()
6418 if name != "override_myapex" {
6419 t.Errorf("name should be \"override_myapex\", but was %q", name)
6420 }
6421
Baligh Uddin004d7172020-02-19 21:29:28 -08006422 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6423 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6424 }
6425
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006426 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6427 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6428 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6429 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6430 android.AssertArrayString(t, "Java_libs does not match",
6431 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6432
Jiyong Park20bacab2020-03-03 11:45:41 +09006433 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006434 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006435 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6436
6437 signApkRule := module.Rule("signapk")
6438 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006439
Colin Crossaa255532020-07-03 13:18:24 -07006440 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006441 var builder strings.Builder
6442 data.Custom(&builder, name, "TARGET_", "", data)
6443 androidMk := builder.String()
Prerana Patilb1896c82022-11-09 18:14:34 +00006444 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6445 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6446 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
6447 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6448 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6449 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006450 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006451 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006452 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006453 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006454 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006455 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006456 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6457 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6458 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006459 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006460}
6461
Albert Martineefabcf2022-03-21 20:11:16 +00006462func TestMinSdkVersionOverride(t *testing.T) {
6463 // Override from 29 to 31
6464 minSdkOverride31 := "31"
6465 ctx := testApex(t, `
6466 apex {
6467 name: "myapex",
6468 key: "myapex.key",
6469 native_shared_libs: ["mylib"],
6470 updatable: true,
6471 min_sdk_version: "29"
6472 }
6473
6474 override_apex {
6475 name: "override_myapex",
6476 base: "myapex",
6477 logging_parent: "com.foo.bar",
6478 package_name: "test.overridden.package"
6479 }
6480
6481 apex_key {
6482 name: "myapex.key",
6483 public_key: "testkey.avbpubkey",
6484 private_key: "testkey.pem",
6485 }
6486
6487 cc_library {
6488 name: "mylib",
6489 srcs: ["mylib.cpp"],
6490 runtime_libs: ["libbar"],
6491 system_shared_libs: [],
6492 stl: "none",
6493 apex_available: [ "myapex" ],
6494 min_sdk_version: "apex_inherit"
6495 }
6496
6497 cc_library {
6498 name: "libbar",
6499 srcs: ["mylib.cpp"],
6500 system_shared_libs: [],
6501 stl: "none",
6502 apex_available: [ "myapex" ],
6503 min_sdk_version: "apex_inherit"
6504 }
6505
6506 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6507
6508 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6509 copyCmds := apexRule.Args["copy_commands"]
6510
6511 // Ensure that direct non-stubs dep is always included
6512 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6513
6514 // Ensure that runtime_libs dep in included
6515 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6516
6517 // Ensure libraries target overridden min_sdk_version value
6518 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6519}
6520
6521func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6522 // Attempt to override from 31 to 29, should be a NOOP
6523 minSdkOverride29 := "29"
6524 ctx := testApex(t, `
6525 apex {
6526 name: "myapex",
6527 key: "myapex.key",
6528 native_shared_libs: ["mylib"],
6529 updatable: true,
6530 min_sdk_version: "31"
6531 }
6532
6533 override_apex {
6534 name: "override_myapex",
6535 base: "myapex",
6536 logging_parent: "com.foo.bar",
6537 package_name: "test.overridden.package"
6538 }
6539
6540 apex_key {
6541 name: "myapex.key",
6542 public_key: "testkey.avbpubkey",
6543 private_key: "testkey.pem",
6544 }
6545
6546 cc_library {
6547 name: "mylib",
6548 srcs: ["mylib.cpp"],
6549 runtime_libs: ["libbar"],
6550 system_shared_libs: [],
6551 stl: "none",
6552 apex_available: [ "myapex" ],
6553 min_sdk_version: "apex_inherit"
6554 }
6555
6556 cc_library {
6557 name: "libbar",
6558 srcs: ["mylib.cpp"],
6559 system_shared_libs: [],
6560 stl: "none",
6561 apex_available: [ "myapex" ],
6562 min_sdk_version: "apex_inherit"
6563 }
6564
6565 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6566
6567 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6568 copyCmds := apexRule.Args["copy_commands"]
6569
6570 // Ensure that direct non-stubs dep is always included
6571 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6572
6573 // Ensure that runtime_libs dep in included
6574 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6575
6576 // Ensure libraries target the original min_sdk_version value rather than the overridden
6577 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6578}
6579
Jooyung Han214bf372019-11-12 13:03:50 +09006580func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006581 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006582 apex {
6583 name: "myapex",
6584 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006585 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006586 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006587 }
6588
6589 apex_key {
6590 name: "myapex.key",
6591 public_key: "testkey.avbpubkey",
6592 private_key: "testkey.pem",
6593 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006594
6595 cc_library {
6596 name: "mylib",
6597 srcs: ["mylib.cpp"],
6598 stl: "libc++",
6599 system_shared_libs: [],
6600 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006601 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006602 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006603 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006604
6605 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6606 args := module.Rule("apexRule").Args
6607 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006608 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006609
6610 // The copies of the libraries in the apex should have one more dependency than
6611 // the ones outside the apex, namely the unwinder. Ideally we should check
6612 // the dependency names directly here but for some reason the names are blank in
6613 // this test.
6614 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006615 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006616 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6617 if len(apexImplicits) != len(nonApexImplicits)+1 {
6618 t.Errorf("%q missing unwinder dep", lib)
6619 }
6620 }
Jooyung Han214bf372019-11-12 13:03:50 +09006621}
6622
Paul Duffine05480a2021-03-08 15:07:14 +00006623var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006624 "api/current.txt": nil,
6625 "api/removed.txt": nil,
6626 "api/system-current.txt": nil,
6627 "api/system-removed.txt": nil,
6628 "api/test-current.txt": nil,
6629 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006630
Anton Hanssondff2c782020-12-21 17:10:01 +00006631 "100/public/api/foo.txt": nil,
6632 "100/public/api/foo-removed.txt": nil,
6633 "100/system/api/foo.txt": nil,
6634 "100/system/api/foo-removed.txt": nil,
6635
Paul Duffineedc5d52020-06-12 17:46:39 +01006636 // For java_sdk_library_import
6637 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006638}
6639
Jooyung Han58f26ab2019-12-18 15:34:32 +09006640func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006641 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006642 apex {
6643 name: "myapex",
6644 key: "myapex.key",
6645 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006646 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006647 }
6648
6649 apex_key {
6650 name: "myapex.key",
6651 public_key: "testkey.avbpubkey",
6652 private_key: "testkey.pem",
6653 }
6654
6655 java_sdk_library {
6656 name: "foo",
6657 srcs: ["a.java"],
6658 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006659 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006660 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006661
6662 prebuilt_apis {
6663 name: "sdk",
6664 api_dirs: ["100"],
6665 }
Paul Duffin9b879592020-05-26 13:21:35 +01006666 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006667
6668 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006669 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006670 "javalib/foo.jar",
6671 "etc/permissions/foo.xml",
6672 })
6673 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006674 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006675 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 +09006676}
6677
Paul Duffin9b879592020-05-26 13:21:35 +01006678func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006679 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006680 apex {
6681 name: "myapex",
6682 key: "myapex.key",
6683 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006684 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006685 }
6686
6687 apex_key {
6688 name: "myapex.key",
6689 public_key: "testkey.avbpubkey",
6690 private_key: "testkey.pem",
6691 }
6692
6693 java_sdk_library {
6694 name: "foo",
6695 srcs: ["a.java"],
6696 api_packages: ["foo"],
6697 apex_available: ["myapex"],
6698 sdk_version: "none",
6699 system_modules: "none",
6700 }
6701
6702 java_library {
6703 name: "bar",
6704 srcs: ["a.java"],
6705 libs: ["foo"],
6706 apex_available: ["myapex"],
6707 sdk_version: "none",
6708 system_modules: "none",
6709 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006710
6711 prebuilt_apis {
6712 name: "sdk",
6713 api_dirs: ["100"],
6714 }
Paul Duffin9b879592020-05-26 13:21:35 +01006715 `, withFiles(filesForSdkLibrary))
6716
6717 // java_sdk_library installs both impl jar and permission XML
6718 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6719 "javalib/bar.jar",
6720 "javalib/foo.jar",
6721 "etc/permissions/foo.xml",
6722 })
6723
6724 // The bar library should depend on the implementation jar.
6725 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006726 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006727 t.Errorf("expected %q, found %#q", expected, actual)
6728 }
6729}
6730
6731func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006732 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006733 apex {
6734 name: "myapex",
6735 key: "myapex.key",
6736 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006737 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006738 }
6739
6740 apex_key {
6741 name: "myapex.key",
6742 public_key: "testkey.avbpubkey",
6743 private_key: "testkey.pem",
6744 }
6745
6746 java_sdk_library {
6747 name: "foo",
6748 srcs: ["a.java"],
6749 api_packages: ["foo"],
6750 apex_available: ["myapex"],
6751 sdk_version: "none",
6752 system_modules: "none",
6753 }
6754
6755 java_library {
6756 name: "bar",
6757 srcs: ["a.java"],
6758 libs: ["foo"],
6759 sdk_version: "none",
6760 system_modules: "none",
6761 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006762
6763 prebuilt_apis {
6764 name: "sdk",
6765 api_dirs: ["100"],
6766 }
Paul Duffin9b879592020-05-26 13:21:35 +01006767 `, withFiles(filesForSdkLibrary))
6768
6769 // java_sdk_library installs both impl jar and permission XML
6770 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6771 "javalib/foo.jar",
6772 "etc/permissions/foo.xml",
6773 })
6774
6775 // The bar library should depend on the stubs jar.
6776 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006777 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.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
Paul Duffineedc5d52020-06-12 17:46:39 +01006782func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006783 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006784 prebuilt_apis {
6785 name: "sdk",
6786 api_dirs: ["100"],
6787 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006788 withFiles(map[string][]byte{
6789 "apex/a.java": nil,
6790 "apex/apex_manifest.json": nil,
6791 "apex/Android.bp": []byte(`
6792 package {
6793 default_visibility: ["//visibility:private"],
6794 }
6795
6796 apex {
6797 name: "myapex",
6798 key: "myapex.key",
6799 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006800 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006801 }
6802
6803 apex_key {
6804 name: "myapex.key",
6805 public_key: "testkey.avbpubkey",
6806 private_key: "testkey.pem",
6807 }
6808
6809 java_library {
6810 name: "bar",
6811 srcs: ["a.java"],
6812 libs: ["foo"],
6813 apex_available: ["myapex"],
6814 sdk_version: "none",
6815 system_modules: "none",
6816 }
6817`),
6818 "source/a.java": nil,
6819 "source/api/current.txt": nil,
6820 "source/api/removed.txt": nil,
6821 "source/Android.bp": []byte(`
6822 package {
6823 default_visibility: ["//visibility:private"],
6824 }
6825
6826 java_sdk_library {
6827 name: "foo",
6828 visibility: ["//apex"],
6829 srcs: ["a.java"],
6830 api_packages: ["foo"],
6831 apex_available: ["myapex"],
6832 sdk_version: "none",
6833 system_modules: "none",
6834 public: {
6835 enabled: true,
6836 },
6837 }
6838`),
6839 "prebuilt/a.jar": nil,
6840 "prebuilt/Android.bp": []byte(`
6841 package {
6842 default_visibility: ["//visibility:private"],
6843 }
6844
6845 java_sdk_library_import {
6846 name: "foo",
6847 visibility: ["//apex", "//source"],
6848 apex_available: ["myapex"],
6849 prefer: true,
6850 public: {
6851 jars: ["a.jar"],
6852 },
6853 }
6854`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006855 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006856 )
6857
6858 // java_sdk_library installs both impl jar and permission XML
6859 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6860 "javalib/bar.jar",
6861 "javalib/foo.jar",
6862 "etc/permissions/foo.xml",
6863 })
6864
6865 // The bar library should depend on the implementation jar.
6866 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006867 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006868 t.Errorf("expected %q, found %#q", expected, actual)
6869 }
6870}
6871
6872func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6873 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6874 apex {
6875 name: "myapex",
6876 key: "myapex.key",
6877 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006878 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006879 }
6880
6881 apex_key {
6882 name: "myapex.key",
6883 public_key: "testkey.avbpubkey",
6884 private_key: "testkey.pem",
6885 }
6886
6887 java_sdk_library_import {
6888 name: "foo",
6889 apex_available: ["myapex"],
6890 prefer: true,
6891 public: {
6892 jars: ["a.jar"],
6893 },
6894 }
6895
6896 `, withFiles(filesForSdkLibrary))
6897}
6898
atrost6e126252020-01-27 17:01:16 +00006899func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006900 result := android.GroupFixturePreparers(
6901 prepareForApexTest,
6902 java.PrepareForTestWithPlatformCompatConfig,
6903 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006904 apex {
6905 name: "myapex",
6906 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006907 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006908 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006909 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006910 }
6911
6912 apex_key {
6913 name: "myapex.key",
6914 public_key: "testkey.avbpubkey",
6915 private_key: "testkey.pem",
6916 }
6917
6918 platform_compat_config {
6919 name: "myjar-platform-compat-config",
6920 src: ":myjar",
6921 }
6922
6923 java_library {
6924 name: "myjar",
6925 srcs: ["foo/bar/MyClass.java"],
6926 sdk_version: "none",
6927 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006928 apex_available: [ "myapex" ],
6929 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006930
6931 // Make sure that a preferred prebuilt does not affect the apex contents.
6932 prebuilt_platform_compat_config {
6933 name: "myjar-platform-compat-config",
6934 metadata: "compat-config/metadata.xml",
6935 prefer: true,
6936 }
atrost6e126252020-01-27 17:01:16 +00006937 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006938 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006939 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6940 "etc/compatconfig/myjar-platform-compat-config.xml",
6941 "javalib/myjar.jar",
6942 })
6943}
6944
Jiyong Park479321d2019-12-16 11:47:12 +09006945func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6946 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6947 apex {
6948 name: "myapex",
6949 key: "myapex.key",
6950 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006951 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006952 }
6953
6954 apex_key {
6955 name: "myapex.key",
6956 public_key: "testkey.avbpubkey",
6957 private_key: "testkey.pem",
6958 }
6959
6960 java_library {
6961 name: "myjar",
6962 srcs: ["foo/bar/MyClass.java"],
6963 sdk_version: "none",
6964 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006965 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006966 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006967 }
6968 `)
6969}
6970
Jiyong Park7afd1072019-12-30 16:56:33 +09006971func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006972 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006973 apex {
6974 name: "myapex",
6975 key: "myapex.key",
6976 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006977 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006978 }
6979
6980 apex_key {
6981 name: "myapex.key",
6982 public_key: "testkey.avbpubkey",
6983 private_key: "testkey.pem",
6984 }
6985
6986 cc_library {
6987 name: "mylib",
6988 srcs: ["mylib.cpp"],
6989 system_shared_libs: [],
6990 stl: "none",
6991 required: ["a", "b"],
6992 host_required: ["c", "d"],
6993 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006994 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006995 }
6996 `)
6997
6998 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006999 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007000 name := apexBundle.BaseModuleName()
7001 prefix := "TARGET_"
7002 var builder strings.Builder
7003 data.Custom(&builder, name, prefix, "", data)
7004 androidMk := builder.String()
7005 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
7006 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
7007 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
7008}
7009
Jiyong Park7cd10e32020-01-14 09:22:18 +09007010func TestSymlinksFromApexToSystem(t *testing.T) {
7011 bp := `
7012 apex {
7013 name: "myapex",
7014 key: "myapex.key",
7015 native_shared_libs: ["mylib"],
7016 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007017 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007018 }
7019
Jiyong Park9d677202020-02-19 16:29:35 +09007020 apex {
7021 name: "myapex.updatable",
7022 key: "myapex.key",
7023 native_shared_libs: ["mylib"],
7024 java_libs: ["myjar"],
7025 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007026 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007027 }
7028
Jiyong Park7cd10e32020-01-14 09:22:18 +09007029 apex_key {
7030 name: "myapex.key",
7031 public_key: "testkey.avbpubkey",
7032 private_key: "testkey.pem",
7033 }
7034
7035 cc_library {
7036 name: "mylib",
7037 srcs: ["mylib.cpp"],
7038 shared_libs: ["myotherlib"],
7039 system_shared_libs: [],
7040 stl: "none",
7041 apex_available: [
7042 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007043 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007044 "//apex_available:platform",
7045 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007046 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007047 }
7048
7049 cc_library {
7050 name: "myotherlib",
7051 srcs: ["mylib.cpp"],
7052 system_shared_libs: [],
7053 stl: "none",
7054 apex_available: [
7055 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007056 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007057 "//apex_available:platform",
7058 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007059 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007060 }
7061
7062 java_library {
7063 name: "myjar",
7064 srcs: ["foo/bar/MyClass.java"],
7065 sdk_version: "none",
7066 system_modules: "none",
7067 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007068 apex_available: [
7069 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007070 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007071 "//apex_available:platform",
7072 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007073 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007074 }
7075
7076 java_library {
7077 name: "myotherjar",
7078 srcs: ["foo/bar/MyClass.java"],
7079 sdk_version: "none",
7080 system_modules: "none",
7081 apex_available: [
7082 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007083 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007084 "//apex_available:platform",
7085 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007086 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007087 }
7088 `
7089
7090 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7091 for _, f := range files {
7092 if f.path == file {
7093 if f.isLink {
7094 t.Errorf("%q is not a real file", file)
7095 }
7096 return
7097 }
7098 }
7099 t.Errorf("%q is not found", file)
7100 }
7101
7102 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7103 for _, f := range files {
7104 if f.path == file {
7105 if !f.isLink {
7106 t.Errorf("%q is not a symlink", file)
7107 }
7108 return
7109 }
7110 }
7111 t.Errorf("%q is not found", file)
7112 }
7113
Jiyong Park9d677202020-02-19 16:29:35 +09007114 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7115 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007116 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007117 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007118 ensureRealfileExists(t, files, "javalib/myjar.jar")
7119 ensureRealfileExists(t, files, "lib64/mylib.so")
7120 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7121
Jiyong Park9d677202020-02-19 16:29:35 +09007122 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7123 ensureRealfileExists(t, files, "javalib/myjar.jar")
7124 ensureRealfileExists(t, files, "lib64/mylib.so")
7125 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7126
7127 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007128 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007129 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007130 ensureRealfileExists(t, files, "javalib/myjar.jar")
7131 ensureRealfileExists(t, files, "lib64/mylib.so")
7132 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007133
7134 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7135 ensureRealfileExists(t, files, "javalib/myjar.jar")
7136 ensureRealfileExists(t, files, "lib64/mylib.so")
7137 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007138}
7139
Yo Chiange8128052020-07-23 20:09:18 +08007140func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007141 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007142 apex {
7143 name: "myapex",
7144 key: "myapex.key",
7145 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007146 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007147 }
7148
7149 apex_key {
7150 name: "myapex.key",
7151 public_key: "testkey.avbpubkey",
7152 private_key: "testkey.pem",
7153 }
7154
7155 cc_library_shared {
7156 name: "mylib",
7157 srcs: ["mylib.cpp"],
7158 shared_libs: ["myotherlib"],
7159 system_shared_libs: [],
7160 stl: "none",
7161 apex_available: [
7162 "myapex",
7163 "//apex_available:platform",
7164 ],
7165 }
7166
7167 cc_prebuilt_library_shared {
7168 name: "myotherlib",
7169 srcs: ["prebuilt.so"],
7170 system_shared_libs: [],
7171 stl: "none",
7172 apex_available: [
7173 "myapex",
7174 "//apex_available:platform",
7175 ],
7176 }
7177 `)
7178
Prerana Patilb1896c82022-11-09 18:14:34 +00007179 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007180 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007181 var builder strings.Builder
7182 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7183 androidMk := builder.String()
7184 // `myotherlib` is added to `myapex` as symlink
Prerana Patilb1896c82022-11-09 18:14:34 +00007185 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007186 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7187 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7188 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Prerana Patilb1896c82022-11-09 18:14:34 +00007189 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 +08007190}
7191
Jooyung Han643adc42020-02-27 13:50:06 +09007192func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007193 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007194 apex {
7195 name: "myapex",
7196 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007197 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007198 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007199 }
7200
7201 apex_key {
7202 name: "myapex.key",
7203 public_key: "testkey.avbpubkey",
7204 private_key: "testkey.pem",
7205 }
7206
7207 cc_library {
7208 name: "mylib",
7209 srcs: ["mylib.cpp"],
7210 shared_libs: ["mylib2"],
7211 system_shared_libs: [],
7212 stl: "none",
7213 apex_available: [ "myapex" ],
7214 }
7215
7216 cc_library {
7217 name: "mylib2",
7218 srcs: ["mylib.cpp"],
7219 system_shared_libs: [],
7220 stl: "none",
7221 apex_available: [ "myapex" ],
7222 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007223
7224 rust_ffi_shared {
7225 name: "libfoo.rust",
7226 crate_name: "foo",
7227 srcs: ["foo.rs"],
7228 shared_libs: ["libfoo.shared_from_rust"],
7229 prefer_rlib: true,
7230 apex_available: ["myapex"],
7231 }
7232
7233 cc_library_shared {
7234 name: "libfoo.shared_from_rust",
7235 srcs: ["mylib.cpp"],
7236 system_shared_libs: [],
7237 stl: "none",
7238 stubs: {
7239 versions: ["10", "11", "12"],
7240 },
7241 }
7242
Jooyung Han643adc42020-02-27 13:50:06 +09007243 `)
7244
7245 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7246 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007247 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007248 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7249 "lib64/mylib.so",
7250 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007251 "lib64/libfoo.rust.so",
7252 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7253 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007254 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007255
7256 // b/220397949
7257 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007258}
7259
Jooyung Han49f67012020-04-17 13:43:10 +09007260func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007261 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007262 apex {
7263 name: "myapex",
7264 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007265 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007266 }
7267 apex_key {
7268 name: "myapex.key",
7269 public_key: "testkey.avbpubkey",
7270 private_key: "testkey.pem",
7271 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007272 `,
7273 android.FixtureModifyConfig(func(config android.Config) {
7274 delete(config.Targets, android.Android)
7275 config.AndroidCommonTarget = android.Target{}
7276 }),
7277 )
Jooyung Han49f67012020-04-17 13:43:10 +09007278
7279 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7280 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7281 }
7282}
7283
Jiyong Parkbd159612020-02-28 15:22:21 +09007284func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007285 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007286 apex {
7287 name: "myapex",
7288 key: "myapex.key",
7289 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007290 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007291 }
7292
7293 apex_key {
7294 name: "myapex.key",
7295 public_key: "testkey.avbpubkey",
7296 private_key: "testkey.pem",
7297 }
7298
7299 android_app {
7300 name: "AppFoo",
7301 srcs: ["foo/bar/MyClass.java"],
7302 sdk_version: "none",
7303 system_modules: "none",
7304 apex_available: [ "myapex" ],
7305 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007306 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007307
Colin Crosscf371cc2020-11-13 11:48:42 -08007308 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007309 content := bundleConfigRule.Args["content"]
7310
7311 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007312 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 +09007313}
7314
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007315func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007316 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007317 apex {
7318 name: "myapex",
7319 key: "myapex.key",
7320 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007321 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007322 }
7323
7324 apex_key {
7325 name: "myapex.key",
7326 public_key: "testkey.avbpubkey",
7327 private_key: "testkey.pem",
7328 }
7329
7330 android_app_set {
7331 name: "AppSet",
7332 set: "AppSet.apks",
7333 }`)
7334 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007335 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007336 content := bundleConfigRule.Args["content"]
7337 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7338 s := mod.Rule("apexRule").Args["copy_commands"]
7339 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007340 if len(copyCmds) != 4 {
7341 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007342 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007343 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7344 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007345 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7346 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007347
7348 // Ensure that canned_fs_config has an entry for the app set zip file
7349 generateFsRule := mod.Rule("generateFsConfig")
7350 cmd := generateFsRule.RuleParams.Command
7351 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007352}
7353
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007354func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007355 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007356 apex_set {
7357 name: "myapex",
7358 filename: "foo_v2.apex",
7359 sanitized: {
7360 none: { set: "myapex.apks", },
7361 hwaddress: { set: "myapex.hwasan.apks", },
7362 },
Paul Duffin24704672021-04-06 16:09:30 +01007363 }
7364 `
7365 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007366
Paul Duffin24704672021-04-06 16:09:30 +01007367 // Check that the extractor produces the correct output file from the correct input file.
7368 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007369
Paul Duffin24704672021-04-06 16:09:30 +01007370 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7371 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007372
Paul Duffin24704672021-04-06 16:09:30 +01007373 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7374
7375 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007376 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7377 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007378
7379 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007380}
7381
Pranav Guptaeba03b02022-09-27 00:27:08 +00007382func TestApexSetApksModuleAssignment(t *testing.T) {
7383 ctx := testApex(t, `
7384 apex_set {
7385 name: "myapex",
7386 set: ":myapex_apks_file",
7387 }
7388
7389 filegroup {
7390 name: "myapex_apks_file",
7391 srcs: ["myapex.apks"],
7392 }
7393 `)
7394
7395 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7396
7397 // Check that the extractor produces the correct apks file from the input module
7398 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7399 extractedApex := m.Output(extractorOutput)
7400
7401 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7402}
7403
Paul Duffin89f570a2021-06-16 01:42:33 +01007404func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007405 t.Helper()
7406
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007407 bp := `
7408 java_library {
7409 name: "some-updatable-apex-lib",
7410 srcs: ["a.java"],
7411 sdk_version: "current",
7412 apex_available: [
7413 "some-updatable-apex",
7414 ],
satayevabcd5972021-08-06 17:49:46 +01007415 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007416 }
7417
7418 java_library {
7419 name: "some-non-updatable-apex-lib",
7420 srcs: ["a.java"],
7421 apex_available: [
7422 "some-non-updatable-apex",
7423 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007424 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007425 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007426 }
7427
7428 bootclasspath_fragment {
7429 name: "some-non-updatable-fragment",
7430 contents: ["some-non-updatable-apex-lib"],
7431 apex_available: [
7432 "some-non-updatable-apex",
7433 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007434 hidden_api: {
7435 split_packages: ["*"],
7436 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007437 }
7438
7439 java_library {
7440 name: "some-platform-lib",
7441 srcs: ["a.java"],
7442 sdk_version: "current",
7443 installable: true,
7444 }
7445
7446 java_library {
7447 name: "some-art-lib",
7448 srcs: ["a.java"],
7449 sdk_version: "current",
7450 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007451 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007452 ],
7453 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007454 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007455 }
7456
7457 apex {
7458 name: "some-updatable-apex",
7459 key: "some-updatable-apex.key",
7460 java_libs: ["some-updatable-apex-lib"],
7461 updatable: true,
7462 min_sdk_version: "current",
7463 }
7464
7465 apex {
7466 name: "some-non-updatable-apex",
7467 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007468 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007469 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007470 }
7471
7472 apex_key {
7473 name: "some-updatable-apex.key",
7474 }
7475
7476 apex_key {
7477 name: "some-non-updatable-apex.key",
7478 }
7479
7480 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007481 name: "com.android.art.debug",
7482 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007483 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007484 updatable: true,
7485 min_sdk_version: "current",
7486 }
7487
Paul Duffinf23bc472021-04-27 12:42:20 +01007488 bootclasspath_fragment {
7489 name: "art-bootclasspath-fragment",
7490 image_name: "art",
7491 contents: ["some-art-lib"],
7492 apex_available: [
7493 "com.android.art.debug",
7494 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007495 hidden_api: {
7496 split_packages: ["*"],
7497 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007498 }
7499
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007500 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007501 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007502 }
7503
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007504 filegroup {
7505 name: "some-updatable-apex-file_contexts",
7506 srcs: [
7507 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7508 ],
7509 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007510
7511 filegroup {
7512 name: "some-non-updatable-apex-file_contexts",
7513 srcs: [
7514 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7515 ],
7516 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007517 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007518
Paul Duffin89f570a2021-06-16 01:42:33 +01007519 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007520}
7521
Paul Duffin89f570a2021-06-16 01:42:33 +01007522func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007523 t.Helper()
7524
Paul Duffin55607122021-03-30 23:32:51 +01007525 fs := android.MockFS{
7526 "a.java": nil,
7527 "a.jar": nil,
7528 "apex_manifest.json": nil,
7529 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007530 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007531 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7532 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7533 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007534 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007535 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007536
Paul Duffin55607122021-03-30 23:32:51 +01007537 errorHandler := android.FixtureExpectsNoErrors
7538 if errmsg != "" {
7539 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007540 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007541
Paul Duffin55607122021-03-30 23:32:51 +01007542 result := android.GroupFixturePreparers(
7543 cc.PrepareForTestWithCcDefaultModules,
7544 java.PrepareForTestWithHiddenApiBuildComponents,
7545 java.PrepareForTestWithJavaDefaultModules,
7546 java.PrepareForTestWithJavaSdkLibraryFiles,
7547 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007548 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007549 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007550 android.FixtureModifyMockFS(func(fs android.MockFS) {
7551 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7552 insert := ""
7553 for _, fragment := range fragments {
7554 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7555 }
7556 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7557 platform_bootclasspath {
7558 name: "platform-bootclasspath",
7559 fragments: [
7560 %s
7561 ],
7562 }
7563 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007564 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007565 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007566 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007567 ).
7568 ExtendWithErrorHandler(errorHandler).
7569 RunTestWithBp(t, bp)
7570
7571 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007572}
7573
Paul Duffin5556c5f2022-06-09 17:32:21 +00007574func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007575 preparers := android.GroupFixturePreparers(
7576 java.PrepareForTestWithJavaDefaultModules,
7577 PrepareForTestWithApexBuildComponents,
7578 ).
7579 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7580 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7581
7582 bpBase := `
7583 apex_set {
7584 name: "com.android.myapex",
7585 installable: true,
7586 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7587 set: "myapex.apks",
7588 }
7589
7590 apex_set {
7591 name: "com.mycompany.android.myapex",
7592 apex_name: "com.android.myapex",
7593 installable: true,
7594 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7595 set: "company-myapex.apks",
7596 }
7597
7598 prebuilt_bootclasspath_fragment {
7599 name: "my-bootclasspath-fragment",
7600 apex_available: ["com.android.myapex"],
7601 %s
7602 }
7603 `
7604
7605 t.Run("java_import", func(t *testing.T) {
7606 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7607 java_import {
7608 name: "libfoo",
7609 jars: ["libfoo.jar"],
7610 apex_available: ["com.android.myapex"],
7611 }
7612 `)
7613 })
7614
7615 t.Run("java_sdk_library_import", func(t *testing.T) {
7616 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7617 java_sdk_library_import {
7618 name: "libfoo",
7619 public: {
7620 jars: ["libbar.jar"],
7621 },
7622 apex_available: ["com.android.myapex"],
7623 }
7624 `)
7625 })
7626
7627 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7628 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7629 image_name: "art",
7630 contents: ["libfoo"],
7631 `)+`
7632 java_sdk_library_import {
7633 name: "libfoo",
7634 public: {
7635 jars: ["libbar.jar"],
7636 },
7637 apex_available: ["com.android.myapex"],
7638 }
7639 `)
7640 })
7641}
7642
Paul Duffin5556c5f2022-06-09 17:32:21 +00007643func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7644 preparers := android.GroupFixturePreparers(
7645 java.PrepareForTestWithJavaDefaultModules,
7646 PrepareForTestWithApexBuildComponents,
7647 )
7648
7649 bpBase := `
7650 apex_set {
7651 name: "com.android.myapex",
7652 installable: true,
7653 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7654 set: "myapex.apks",
7655 }
7656
7657 apex_set {
7658 name: "com.android.myapex_compressed",
7659 apex_name: "com.android.myapex",
7660 installable: true,
7661 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7662 set: "myapex_compressed.apks",
7663 }
7664
7665 prebuilt_bootclasspath_fragment {
7666 name: "my-bootclasspath-fragment",
7667 apex_available: [
7668 "com.android.myapex",
7669 "com.android.myapex_compressed",
7670 ],
7671 hidden_api: {
7672 annotation_flags: "annotation-flags.csv",
7673 metadata: "metadata.csv",
7674 index: "index.csv",
7675 signature_patterns: "signature_patterns.csv",
7676 },
7677 %s
7678 }
7679 `
7680
7681 t.Run("java_import", func(t *testing.T) {
7682 result := preparers.RunTestWithBp(t,
7683 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7684 java_import {
7685 name: "libfoo",
7686 jars: ["libfoo.jar"],
7687 apex_available: [
7688 "com.android.myapex",
7689 "com.android.myapex_compressed",
7690 ],
7691 }
7692 `)
7693
7694 module := result.Module("libfoo", "android_common_com.android.myapex")
7695 usesLibraryDep := module.(java.UsesLibraryDependency)
7696 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7697 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7698 usesLibraryDep.DexJarBuildPath().Path())
7699 })
7700
7701 t.Run("java_sdk_library_import", func(t *testing.T) {
7702 result := preparers.RunTestWithBp(t,
7703 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7704 java_sdk_library_import {
7705 name: "libfoo",
7706 public: {
7707 jars: ["libbar.jar"],
7708 },
7709 apex_available: [
7710 "com.android.myapex",
7711 "com.android.myapex_compressed",
7712 ],
7713 compile_dex: true,
7714 }
7715 `)
7716
7717 module := result.Module("libfoo", "android_common_com.android.myapex")
7718 usesLibraryDep := module.(java.UsesLibraryDependency)
7719 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7720 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7721 usesLibraryDep.DexJarBuildPath().Path())
7722 })
7723
7724 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7725 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7726 image_name: "art",
7727 contents: ["libfoo"],
7728 `)+`
7729 java_sdk_library_import {
7730 name: "libfoo",
7731 public: {
7732 jars: ["libbar.jar"],
7733 },
7734 apex_available: [
7735 "com.android.myapex",
7736 "com.android.myapex_compressed",
7737 ],
7738 compile_dex: true,
7739 }
7740 `)
7741 })
7742}
7743
Jooyung Han548640b2020-04-27 12:10:30 +09007744func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7745 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7746 apex {
7747 name: "myapex",
7748 key: "myapex.key",
7749 updatable: true,
7750 }
7751
7752 apex_key {
7753 name: "myapex.key",
7754 public_key: "testkey.avbpubkey",
7755 private_key: "testkey.pem",
7756 }
7757 `)
7758}
7759
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007760func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7761 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7762 apex {
7763 name: "myapex",
7764 key: "myapex.key",
7765 }
7766
7767 apex_key {
7768 name: "myapex.key",
7769 public_key: "testkey.avbpubkey",
7770 private_key: "testkey.pem",
7771 }
7772 `)
7773}
7774
Daniel Norman69109112021-12-02 12:52:42 -08007775func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7776 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7777 apex {
7778 name: "myapex",
7779 key: "myapex.key",
7780 updatable: true,
7781 soc_specific: true,
7782 }
7783
7784 apex_key {
7785 name: "myapex.key",
7786 public_key: "testkey.avbpubkey",
7787 private_key: "testkey.pem",
7788 }
7789 `)
7790}
7791
satayevb98371c2021-06-15 16:49:50 +01007792func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7793 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7794 apex {
7795 name: "myapex",
7796 key: "myapex.key",
7797 systemserverclasspath_fragments: [
7798 "mysystemserverclasspathfragment",
7799 ],
7800 min_sdk_version: "29",
7801 updatable: true,
7802 }
7803
7804 apex_key {
7805 name: "myapex.key",
7806 public_key: "testkey.avbpubkey",
7807 private_key: "testkey.pem",
7808 }
7809
7810 java_library {
7811 name: "foo",
7812 srcs: ["b.java"],
7813 min_sdk_version: "29",
7814 installable: true,
7815 apex_available: [
7816 "myapex",
7817 ],
7818 }
7819
7820 systemserverclasspath_fragment {
7821 name: "mysystemserverclasspathfragment",
7822 generate_classpaths_proto: false,
7823 contents: [
7824 "foo",
7825 ],
7826 apex_available: [
7827 "myapex",
7828 ],
7829 }
satayevabcd5972021-08-06 17:49:46 +01007830 `,
7831 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7832 )
satayevb98371c2021-06-15 16:49:50 +01007833}
7834
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007835func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007836 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7837 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7838 // modules to be included in the BootJars.
7839 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7840 return android.GroupFixturePreparers(
7841 dexpreopt.FixtureSetBootJars(bootJars...),
7842 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7843 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7844 }),
7845 )
7846 }
7847
7848 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7849 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7850 // specified in the ArtApexJars configuration.
7851 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7852 return android.GroupFixturePreparers(
7853 dexpreopt.FixtureSetArtBootJars(bootJars...),
7854 dexpreopt.FixtureSetBootJars(bootJars...),
7855 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7856 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7857 }),
7858 )
7859 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007860
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007861 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007862 preparer := android.GroupFixturePreparers(
7863 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7864 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7865 )
7866 fragments := []java.ApexVariantReference{
7867 {
7868 Apex: proptools.StringPtr("com.android.art.debug"),
7869 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7870 },
7871 {
7872 Apex: proptools.StringPtr("some-non-updatable-apex"),
7873 Module: proptools.StringPtr("some-non-updatable-fragment"),
7874 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007875 }
satayevabcd5972021-08-06 17:49:46 +01007876 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007877 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007878
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007879 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007880 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7881 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007882 preparer := android.GroupFixturePreparers(
7883 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7884 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7885 )
Paul Duffin60264a02021-04-12 20:02:36 +01007886 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007887 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007888
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007889 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 +01007890 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 +01007891 // Update the dexpreopt ArtApexJars directly.
7892 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7893 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007894 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007895
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007896 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 +01007897 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 +01007898 // Update the dexpreopt ArtApexJars directly.
7899 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7900 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007901 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007902
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007903 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 +01007904 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 +01007905 preparer := android.GroupFixturePreparers(
7906 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7907 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7908 )
Paul Duffin60264a02021-04-12 20:02:36 +01007909 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007910 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007911
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007912 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 +01007913 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007914 fragment := java.ApexVariantReference{
7915 Apex: proptools.StringPtr("some-non-updatable-apex"),
7916 Module: proptools.StringPtr("some-non-updatable-fragment"),
7917 }
7918 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007919 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007920
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007921 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007922 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007923 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7924 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007925 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007926
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007927 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007928 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007929 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7930 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007931 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007932
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007933 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007934 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007935 // Update the dexpreopt ArtApexJars directly.
7936 preparer := prepareSetArtJars("platform:some-platform-lib")
7937 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("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007941 preparer := android.GroupFixturePreparers(
7942 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7943 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7944 )
7945 fragments := []java.ApexVariantReference{
7946 {
7947 Apex: proptools.StringPtr("some-non-updatable-apex"),
7948 Module: proptools.StringPtr("some-non-updatable-fragment"),
7949 },
7950 }
7951 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007952 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007953}
7954
7955func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007956 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007957 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007958 fragment := java.ApexVariantReference{
7959 Apex: proptools.StringPtr("myapex"),
7960 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7961 }
7962
Paul Duffin064b70c2020-11-02 17:32:38 +00007963 testDexpreoptWithApexes(t, `
7964 prebuilt_apex {
7965 name: "myapex" ,
7966 arch: {
7967 arm64: {
7968 src: "myapex-arm64.apex",
7969 },
7970 arm: {
7971 src: "myapex-arm.apex",
7972 },
7973 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007974 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7975 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007976
Paul Duffin89f570a2021-06-16 01:42:33 +01007977 prebuilt_bootclasspath_fragment {
7978 name: "my-bootclasspath-fragment",
7979 contents: ["libfoo"],
7980 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007981 hidden_api: {
7982 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7983 metadata: "my-bootclasspath-fragment/metadata.csv",
7984 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007985 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7986 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7987 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007988 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007989 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007990
Paul Duffin89f570a2021-06-16 01:42:33 +01007991 java_import {
7992 name: "libfoo",
7993 jars: ["libfoo.jar"],
7994 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007995 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007996 }
7997 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007998 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007999}
8000
Spandan Dasf14e2542021-11-12 00:01:37 +00008001func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008002 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008003 bp += `
8004 apex_key {
8005 name: "myapex.key",
8006 public_key: "testkey.avbpubkey",
8007 private_key: "testkey.pem",
8008 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008009 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008010 "lib1/src/A.java": nil,
8011 "lib2/src/B.java": nil,
8012 "system/sepolicy/apex/myapex-file_contexts": nil,
8013 }
8014
Paul Duffin45338f02021-03-30 23:07:52 +01008015 errorHandler := android.FixtureExpectsNoErrors
8016 if errmsg != "" {
8017 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008018 }
Colin Crossae8600b2020-10-29 17:09:13 -07008019
Paul Duffin45338f02021-03-30 23:07:52 +01008020 android.GroupFixturePreparers(
8021 android.PrepareForTestWithAndroidBuildComponents,
8022 java.PrepareForTestWithJavaBuildComponents,
8023 PrepareForTestWithApexBuildComponents,
8024 android.PrepareForTestWithNeverallowRules(rules),
8025 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008026 apexBootJars := make([]string, 0, len(bootJars))
8027 for _, apexBootJar := range bootJars {
8028 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008029 }
satayevd604b212021-07-21 14:23:52 +01008030 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008031 }),
8032 fs.AddToFixture(),
8033 ).
8034 ExtendWithErrorHandler(errorHandler).
8035 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008036}
8037
8038func TestApexPermittedPackagesRules(t *testing.T) {
8039 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008040 name string
8041 expectedError string
8042 bp string
8043 bootJars []string
8044 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008045 }{
8046
8047 {
8048 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8049 expectedError: "",
8050 bp: `
8051 java_library {
8052 name: "bcp_lib1",
8053 srcs: ["lib1/src/*.java"],
8054 permitted_packages: ["foo.bar"],
8055 apex_available: ["myapex"],
8056 sdk_version: "none",
8057 system_modules: "none",
8058 }
8059 java_library {
8060 name: "nonbcp_lib2",
8061 srcs: ["lib2/src/*.java"],
8062 apex_available: ["myapex"],
8063 permitted_packages: ["a.b"],
8064 sdk_version: "none",
8065 system_modules: "none",
8066 }
8067 apex {
8068 name: "myapex",
8069 key: "myapex.key",
8070 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008071 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008072 }`,
8073 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008074 bcpPermittedPackages: map[string][]string{
8075 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008076 "foo.bar",
8077 },
8078 },
8079 },
8080 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008081 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008082 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 +01008083 bp: `
8084 java_library {
8085 name: "bcp_lib1",
8086 srcs: ["lib1/src/*.java"],
8087 apex_available: ["myapex"],
8088 permitted_packages: ["foo.bar"],
8089 sdk_version: "none",
8090 system_modules: "none",
8091 }
8092 java_library {
8093 name: "bcp_lib2",
8094 srcs: ["lib2/src/*.java"],
8095 apex_available: ["myapex"],
8096 permitted_packages: ["foo.bar", "bar.baz"],
8097 sdk_version: "none",
8098 system_modules: "none",
8099 }
8100 apex {
8101 name: "myapex",
8102 key: "myapex.key",
8103 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008104 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008105 }
8106 `,
8107 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008108 bcpPermittedPackages: map[string][]string{
8109 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008110 "foo.bar",
8111 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008112 "bcp_lib2": []string{
8113 "foo.bar",
8114 },
8115 },
8116 },
8117 {
8118 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8119 expectedError: "",
8120 bp: `
8121 java_library {
8122 name: "bcp_lib_restricted",
8123 srcs: ["lib1/src/*.java"],
8124 apex_available: ["myapex"],
8125 permitted_packages: ["foo.bar"],
8126 sdk_version: "none",
8127 min_sdk_version: "29",
8128 system_modules: "none",
8129 }
8130 java_library {
8131 name: "bcp_lib_unrestricted",
8132 srcs: ["lib2/src/*.java"],
8133 apex_available: ["myapex"],
8134 permitted_packages: ["foo.bar", "bar.baz"],
8135 sdk_version: "none",
8136 min_sdk_version: "29",
8137 system_modules: "none",
8138 }
8139 apex {
8140 name: "myapex",
8141 key: "myapex.key",
8142 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8143 updatable: true,
8144 min_sdk_version: "29",
8145 }
8146 `,
8147 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8148 bcpPermittedPackages: map[string][]string{
8149 "bcp_lib1_non_updateable": []string{
8150 "foo.bar",
8151 },
8152 // 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 +01008153 },
8154 },
8155 }
8156 for _, tc := range testcases {
8157 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008158 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8159 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008160 })
8161 }
8162}
8163
Jiyong Park62304bb2020-04-13 16:19:48 +09008164func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008165 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008166 apex {
8167 name: "myapex",
8168 key: "myapex.key",
8169 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008170 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008171 }
8172
8173 apex_key {
8174 name: "myapex.key",
8175 public_key: "testkey.avbpubkey",
8176 private_key: "testkey.pem",
8177 }
8178
8179 cc_library {
8180 name: "mylib",
8181 srcs: ["mylib.cpp"],
8182 system_shared_libs: [],
8183 stl: "none",
8184 stubs: {
8185 versions: ["1"],
8186 },
8187 apex_available: ["myapex"],
8188 }
8189
8190 cc_library {
8191 name: "myprivlib",
8192 srcs: ["mylib.cpp"],
8193 system_shared_libs: [],
8194 stl: "none",
8195 apex_available: ["myapex"],
8196 }
8197
8198
8199 cc_test {
8200 name: "mytest",
8201 gtest: false,
8202 srcs: ["mylib.cpp"],
8203 system_shared_libs: [],
8204 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008205 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008206 test_for: ["myapex"]
8207 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008208
8209 cc_library {
8210 name: "mytestlib",
8211 srcs: ["mylib.cpp"],
8212 system_shared_libs: [],
8213 shared_libs: ["mylib", "myprivlib"],
8214 stl: "none",
8215 test_for: ["myapex"],
8216 }
8217
8218 cc_benchmark {
8219 name: "mybench",
8220 srcs: ["mylib.cpp"],
8221 system_shared_libs: [],
8222 shared_libs: ["mylib", "myprivlib"],
8223 stl: "none",
8224 test_for: ["myapex"],
8225 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008226 `)
8227
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008228 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008229 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008230 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8231 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8232 }
8233
8234 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008235 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008236 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8237 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8238 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8239}
Jiyong Park46a512f2020-12-04 18:02:13 +09008240
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008241func TestIndirectTestFor(t *testing.T) {
8242 ctx := testApex(t, `
8243 apex {
8244 name: "myapex",
8245 key: "myapex.key",
8246 native_shared_libs: ["mylib", "myprivlib"],
8247 updatable: false,
8248 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008249
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008250 apex_key {
8251 name: "myapex.key",
8252 public_key: "testkey.avbpubkey",
8253 private_key: "testkey.pem",
8254 }
8255
8256 cc_library {
8257 name: "mylib",
8258 srcs: ["mylib.cpp"],
8259 system_shared_libs: [],
8260 stl: "none",
8261 stubs: {
8262 versions: ["1"],
8263 },
8264 apex_available: ["myapex"],
8265 }
8266
8267 cc_library {
8268 name: "myprivlib",
8269 srcs: ["mylib.cpp"],
8270 system_shared_libs: [],
8271 stl: "none",
8272 shared_libs: ["mylib"],
8273 apex_available: ["myapex"],
8274 }
8275
8276 cc_library {
8277 name: "mytestlib",
8278 srcs: ["mylib.cpp"],
8279 system_shared_libs: [],
8280 shared_libs: ["myprivlib"],
8281 stl: "none",
8282 test_for: ["myapex"],
8283 }
8284 `)
8285
8286 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008287 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008288 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8289 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8290 }
8291
8292 // The platform variant of mytestlib links to the platform variant of the
8293 // internal myprivlib.
8294 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8295
8296 // The platform variant of myprivlib links to the platform variant of mylib
8297 // and bypasses its stubs.
8298 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 +09008299}
8300
Martin Stjernholmec009002021-03-27 15:18:31 +00008301func TestTestForForLibInOtherApex(t *testing.T) {
8302 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8303 _ = testApex(t, `
8304 apex {
8305 name: "com.android.art",
8306 key: "myapex.key",
8307 native_shared_libs: ["mylib"],
8308 updatable: false,
8309 }
8310
8311 apex {
8312 name: "com.android.art.debug",
8313 key: "myapex.key",
8314 native_shared_libs: ["mylib", "mytestlib"],
8315 updatable: false,
8316 }
8317
8318 apex_key {
8319 name: "myapex.key",
8320 public_key: "testkey.avbpubkey",
8321 private_key: "testkey.pem",
8322 }
8323
8324 cc_library {
8325 name: "mylib",
8326 srcs: ["mylib.cpp"],
8327 system_shared_libs: [],
8328 stl: "none",
8329 stubs: {
8330 versions: ["1"],
8331 },
8332 apex_available: ["com.android.art", "com.android.art.debug"],
8333 }
8334
8335 cc_library {
8336 name: "mytestlib",
8337 srcs: ["mylib.cpp"],
8338 system_shared_libs: [],
8339 shared_libs: ["mylib"],
8340 stl: "none",
8341 apex_available: ["com.android.art.debug"],
8342 test_for: ["com.android.art"],
8343 }
8344 `,
8345 android.MockFS{
8346 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8347 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8348 }.AddToFixture())
8349}
8350
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008351// TODO(jungjw): Move this to proptools
8352func intPtr(i int) *int {
8353 return &i
8354}
8355
8356func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008357 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008358 apex_set {
8359 name: "myapex",
8360 set: "myapex.apks",
8361 filename: "foo_v2.apex",
8362 overrides: ["foo"],
8363 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008364 `,
8365 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8366 variables.Platform_sdk_version = intPtr(30)
8367 }),
8368 android.FixtureModifyConfig(func(config android.Config) {
8369 config.Targets[android.Android] = []android.Target{
8370 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8371 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8372 }
8373 }),
8374 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008375
Paul Duffin24704672021-04-06 16:09:30 +01008376 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008377
8378 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008379 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008380 actual := extractedApex.Args["abis"]
8381 expected := "ARMEABI_V7A,ARM64_V8A"
8382 if actual != expected {
8383 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8384 }
8385 actual = extractedApex.Args["sdk-version"]
8386 expected = "30"
8387 if actual != expected {
8388 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8389 }
8390
Paul Duffin6717d882021-06-15 19:09:41 +01008391 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008392 a := m.Module().(*ApexSet)
8393 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008394 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008395 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8396 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8397 }
8398}
8399
Jiyong Park7d95a512020-05-10 15:16:24 +09008400func TestNoStaticLinkingToStubsLib(t *testing.T) {
8401 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8402 apex {
8403 name: "myapex",
8404 key: "myapex.key",
8405 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008406 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008407 }
8408
8409 apex_key {
8410 name: "myapex.key",
8411 public_key: "testkey.avbpubkey",
8412 private_key: "testkey.pem",
8413 }
8414
8415 cc_library {
8416 name: "mylib",
8417 srcs: ["mylib.cpp"],
8418 static_libs: ["otherlib"],
8419 system_shared_libs: [],
8420 stl: "none",
8421 apex_available: [ "myapex" ],
8422 }
8423
8424 cc_library {
8425 name: "otherlib",
8426 srcs: ["mylib.cpp"],
8427 system_shared_libs: [],
8428 stl: "none",
8429 stubs: {
8430 versions: ["1", "2", "3"],
8431 },
8432 apex_available: [ "myapex" ],
8433 }
8434 `)
8435}
8436
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008437func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008438 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008439 apex {
8440 name: "myapex",
8441 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008442 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008443 custom_sign_tool: "sign_myapex",
8444 }
8445
8446 apex_key {
8447 name: "myapex.key",
8448 public_key: "testkey.avbpubkey",
8449 private_key: "testkey.pem",
8450 }
8451 `)
8452
8453 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8454 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8455 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"`)
8456}
8457
8458func TestApexKeysTxtOverrides(t *testing.T) {
8459 ctx := testApex(t, `
8460 apex {
8461 name: "myapex",
8462 key: "myapex.key",
8463 updatable: false,
8464 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008465 }
8466
8467 apex_key {
8468 name: "myapex.key",
8469 public_key: "testkey.avbpubkey",
8470 private_key: "testkey.pem",
8471 }
8472
8473 prebuilt_apex {
8474 name: "myapex",
8475 prefer: true,
8476 arch: {
8477 arm64: {
8478 src: "myapex-arm64.apex",
8479 },
8480 arm: {
8481 src: "myapex-arm.apex",
8482 },
8483 },
8484 }
8485
8486 apex_set {
8487 name: "myapex_set",
8488 set: "myapex.apks",
8489 filename: "myapex_set.apex",
8490 overrides: ["myapex"],
8491 }
8492 `)
8493
8494 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8495 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8496 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 +09008497 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 +09008498}
8499
Jooyung Han938b5932020-06-20 12:47:47 +09008500func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008501 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008502 apex {
8503 name: "myapex",
8504 key: "myapex.key",
8505 apps: ["app"],
8506 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008507 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008508 }
8509
8510 apex_key {
8511 name: "myapex.key",
8512 public_key: "testkey.avbpubkey",
8513 private_key: "testkey.pem",
8514 }
8515
8516 android_app {
8517 name: "app",
8518 srcs: ["foo/bar/MyClass.java"],
8519 package_name: "foo",
8520 sdk_version: "none",
8521 system_modules: "none",
8522 apex_available: [ "myapex" ],
8523 }
8524 `, withFiles(map[string][]byte{
8525 "sub/Android.bp": []byte(`
8526 override_apex {
8527 name: "override_myapex",
8528 base: "myapex",
8529 apps: ["override_app"],
8530 allowed_files: ":allowed",
8531 }
8532 // Overridable "path" property should be referenced indirectly
8533 filegroup {
8534 name: "allowed",
8535 srcs: ["allowed.txt"],
8536 }
8537 override_android_app {
8538 name: "override_app",
8539 base: "app",
8540 package_name: "bar",
8541 }
8542 `),
8543 }))
8544
8545 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8546 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8547 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8548 }
8549
8550 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8551 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8552 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8553 }
8554}
8555
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008556func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008557 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008558 apex {
8559 name: "myapex",
8560 key: "myapex.key",
8561 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008562 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008563 }
8564
8565 apex_key {
8566 name: "myapex.key",
8567 public_key: "testkey.avbpubkey",
8568 private_key: "testkey.pem",
8569 }
8570
8571 cc_library {
8572 name: "mylib",
8573 srcs: ["mylib.cpp"],
8574 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008575 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008576 },
8577 apex_available: ["myapex"],
8578 }
8579
8580 cc_prebuilt_library_shared {
8581 name: "mylib",
8582 prefer: false,
8583 srcs: ["prebuilt.so"],
8584 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008585 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008586 },
8587 apex_available: ["myapex"],
8588 }
8589 `)
8590}
8591
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008592func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008593 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008594 apex {
8595 name: "myapex",
8596 key: "myapex.key",
8597 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008598 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008599 }
8600 apex_key {
8601 name: "myapex.key",
8602 public_key: "testkey.avbpubkey",
8603 private_key: "testkey.pem",
8604 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008605 `,
8606 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8607 variables.CompressedApex = proptools.BoolPtr(true)
8608 }),
8609 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008610
8611 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8612 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8613
8614 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8615 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8616
8617 // Make sure output of bundle is .capex
8618 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8619 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8620
8621 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008622 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008623 var builder strings.Builder
8624 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8625 androidMk := builder.String()
8626 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8627}
8628
Martin Stjernholm2856c662020-12-02 15:03:42 +00008629func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008630 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008631 apex {
8632 name: "myapex",
8633 key: "myapex.key",
8634 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008635 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008636 }
8637
8638 apex_key {
8639 name: "myapex.key",
8640 public_key: "testkey.avbpubkey",
8641 private_key: "testkey.pem",
8642 }
8643
8644 cc_library {
8645 name: "mylib",
8646 srcs: ["mylib.cpp"],
8647 apex_available: ["myapex"],
8648 shared_libs: ["otherlib"],
8649 system_shared_libs: [],
8650 }
8651
8652 cc_library {
8653 name: "otherlib",
8654 srcs: ["mylib.cpp"],
8655 stubs: {
8656 versions: ["current"],
8657 },
8658 }
8659
8660 cc_prebuilt_library_shared {
8661 name: "otherlib",
8662 prefer: true,
8663 srcs: ["prebuilt.so"],
8664 stubs: {
8665 versions: ["current"],
8666 },
8667 }
8668 `)
8669
8670 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008671 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008672 var builder strings.Builder
8673 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8674 androidMk := builder.String()
8675
8676 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8677 // a thing there.
8678 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8679}
8680
Jiyong Parke3867542020-12-03 17:28:25 +09008681func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008682 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008683 apex {
8684 name: "myapex",
8685 key: "myapex.key",
8686 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008687 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008688 }
8689
8690 apex_key {
8691 name: "myapex.key",
8692 public_key: "testkey.avbpubkey",
8693 private_key: "testkey.pem",
8694 }
8695
8696 cc_library {
8697 name: "mylib",
8698 srcs: ["mylib.cpp"],
8699 system_shared_libs: [],
8700 stl: "none",
8701 apex_available: ["myapex"],
8702 shared_libs: ["mylib2"],
8703 target: {
8704 apex: {
8705 exclude_shared_libs: ["mylib2"],
8706 },
8707 },
8708 }
8709
8710 cc_library {
8711 name: "mylib2",
8712 srcs: ["mylib.cpp"],
8713 system_shared_libs: [],
8714 stl: "none",
8715 }
8716 `)
8717
8718 // Check if mylib is linked to mylib2 for the non-apex target
8719 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8720 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8721
8722 // Make sure that the link doesn't occur for the apex target
8723 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8724 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8725
8726 // It shouldn't appear in the copy cmd as well.
8727 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8728 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8729}
8730
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008731func TestPrebuiltStubLibDep(t *testing.T) {
8732 bpBase := `
8733 apex {
8734 name: "myapex",
8735 key: "myapex.key",
8736 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008737 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008738 }
8739 apex_key {
8740 name: "myapex.key",
8741 public_key: "testkey.avbpubkey",
8742 private_key: "testkey.pem",
8743 }
8744 cc_library {
8745 name: "mylib",
8746 srcs: ["mylib.cpp"],
8747 apex_available: ["myapex"],
8748 shared_libs: ["stublib"],
8749 system_shared_libs: [],
8750 }
8751 apex {
8752 name: "otherapex",
8753 enabled: %s,
8754 key: "myapex.key",
8755 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008756 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008757 }
8758 `
8759
8760 stublibSourceBp := `
8761 cc_library {
8762 name: "stublib",
8763 srcs: ["mylib.cpp"],
8764 apex_available: ["otherapex"],
8765 system_shared_libs: [],
8766 stl: "none",
8767 stubs: {
8768 versions: ["1"],
8769 },
8770 }
8771 `
8772
8773 stublibPrebuiltBp := `
8774 cc_prebuilt_library_shared {
8775 name: "stublib",
8776 srcs: ["prebuilt.so"],
8777 apex_available: ["otherapex"],
8778 stubs: {
8779 versions: ["1"],
8780 },
8781 %s
8782 }
8783 `
8784
8785 tests := []struct {
8786 name string
8787 stublibBp string
8788 usePrebuilt bool
8789 modNames []string // Modules to collect AndroidMkEntries for
8790 otherApexEnabled []string
8791 }{
8792 {
8793 name: "only_source",
8794 stublibBp: stublibSourceBp,
8795 usePrebuilt: false,
8796 modNames: []string{"stublib"},
8797 otherApexEnabled: []string{"true", "false"},
8798 },
8799 {
8800 name: "source_preferred",
8801 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8802 usePrebuilt: false,
8803 modNames: []string{"stublib", "prebuilt_stublib"},
8804 otherApexEnabled: []string{"true", "false"},
8805 },
8806 {
8807 name: "prebuilt_preferred",
8808 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8809 usePrebuilt: true,
8810 modNames: []string{"stublib", "prebuilt_stublib"},
8811 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8812 },
8813 {
8814 name: "only_prebuilt",
8815 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8816 usePrebuilt: true,
8817 modNames: []string{"stublib"},
8818 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8819 },
8820 }
8821
8822 for _, test := range tests {
8823 t.Run(test.name, func(t *testing.T) {
8824 for _, otherApexEnabled := range test.otherApexEnabled {
8825 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008826 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008827
8828 type modAndMkEntries struct {
8829 mod *cc.Module
8830 mkEntries android.AndroidMkEntries
8831 }
8832 entries := []*modAndMkEntries{}
8833
8834 // Gather shared lib modules that are installable
8835 for _, modName := range test.modNames {
8836 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8837 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8838 continue
8839 }
8840 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008841 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008842 continue
8843 }
Colin Crossaa255532020-07-03 13:18:24 -07008844 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008845 if ent.Disabled {
8846 continue
8847 }
8848 entries = append(entries, &modAndMkEntries{
8849 mod: mod,
8850 mkEntries: ent,
8851 })
8852 }
8853 }
8854 }
8855
8856 var entry *modAndMkEntries = nil
8857 for _, ent := range entries {
8858 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8859 if entry != nil {
8860 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8861 } else {
8862 entry = ent
8863 }
8864 }
8865 }
8866
8867 if entry == nil {
8868 t.Errorf("AndroidMk entry for \"stublib\" missing")
8869 } else {
8870 isPrebuilt := entry.mod.Prebuilt() != nil
8871 if isPrebuilt != test.usePrebuilt {
8872 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8873 }
8874 if !entry.mod.IsStubs() {
8875 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8876 }
8877 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8878 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8879 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008880 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008881 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008882 if !android.InList(expected, cflags) {
8883 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8884 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008885 }
8886 })
8887 }
8888 })
8889 }
8890}
8891
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008892func TestHostApexInHostOnlyBuild(t *testing.T) {
8893 testApex(t, `
8894 apex {
8895 name: "myapex",
8896 host_supported: true,
8897 key: "myapex.key",
8898 updatable: false,
8899 payload_type: "zip",
8900 }
8901 apex_key {
8902 name: "myapex.key",
8903 public_key: "testkey.avbpubkey",
8904 private_key: "testkey.pem",
8905 }
8906 `,
8907 android.FixtureModifyConfig(func(config android.Config) {
8908 // We may not have device targets in all builds, e.g. in
8909 // prebuilts/build-tools/build-prebuilts.sh
8910 config.Targets[android.Android] = []android.Target{}
8911 }))
8912}
8913
Colin Crossc33e5212021-05-25 18:16:02 -07008914func TestApexJavaCoverage(t *testing.T) {
8915 bp := `
8916 apex {
8917 name: "myapex",
8918 key: "myapex.key",
8919 java_libs: ["mylib"],
8920 bootclasspath_fragments: ["mybootclasspathfragment"],
8921 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8922 updatable: false,
8923 }
8924
8925 apex_key {
8926 name: "myapex.key",
8927 public_key: "testkey.avbpubkey",
8928 private_key: "testkey.pem",
8929 }
8930
8931 java_library {
8932 name: "mylib",
8933 srcs: ["mylib.java"],
8934 apex_available: ["myapex"],
8935 compile_dex: true,
8936 }
8937
8938 bootclasspath_fragment {
8939 name: "mybootclasspathfragment",
8940 contents: ["mybootclasspathlib"],
8941 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01008942 hidden_api: {
8943 split_packages: ["*"],
8944 },
Colin Crossc33e5212021-05-25 18:16:02 -07008945 }
8946
8947 java_library {
8948 name: "mybootclasspathlib",
8949 srcs: ["mybootclasspathlib.java"],
8950 apex_available: ["myapex"],
8951 compile_dex: true,
8952 }
8953
8954 systemserverclasspath_fragment {
8955 name: "mysystemserverclasspathfragment",
8956 contents: ["mysystemserverclasspathlib"],
8957 apex_available: ["myapex"],
8958 }
8959
8960 java_library {
8961 name: "mysystemserverclasspathlib",
8962 srcs: ["mysystemserverclasspathlib.java"],
8963 apex_available: ["myapex"],
8964 compile_dex: true,
8965 }
8966 `
8967
8968 result := android.GroupFixturePreparers(
8969 PrepareForTestWithApexBuildComponents,
8970 prepareForTestWithMyapex,
8971 java.PrepareForTestWithJavaDefaultModules,
8972 android.PrepareForTestWithAndroidBuildComponents,
8973 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008974 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8975 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04008976 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07008977 ).RunTest(t)
8978
8979 // Make sure jacoco ran on both mylib and mybootclasspathlib
8980 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8981 t.Errorf("Failed to find jacoco rule for mylib")
8982 }
8983 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8984 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8985 }
8986 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8987 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8988 }
8989}
8990
Jiyong Park192600a2021-08-03 07:52:17 +00008991func TestProhibitStaticExecutable(t *testing.T) {
8992 testApexError(t, `executable mybin is static`, `
8993 apex {
8994 name: "myapex",
8995 key: "myapex.key",
8996 binaries: ["mybin"],
8997 min_sdk_version: "29",
8998 }
8999
9000 apex_key {
9001 name: "myapex.key",
9002 public_key: "testkey.avbpubkey",
9003 private_key: "testkey.pem",
9004 }
9005
9006 cc_binary {
9007 name: "mybin",
9008 srcs: ["mylib.cpp"],
9009 relative_install_path: "foo/bar",
9010 static_executable: true,
9011 system_shared_libs: [],
9012 stl: "none",
9013 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009014 min_sdk_version: "29",
9015 }
9016 `)
9017
9018 testApexError(t, `executable mybin.rust is static`, `
9019 apex {
9020 name: "myapex",
9021 key: "myapex.key",
9022 binaries: ["mybin.rust"],
9023 min_sdk_version: "29",
9024 }
9025
9026 apex_key {
9027 name: "myapex.key",
9028 public_key: "testkey.avbpubkey",
9029 private_key: "testkey.pem",
9030 }
9031
9032 rust_binary {
9033 name: "mybin.rust",
9034 srcs: ["foo.rs"],
9035 static_executable: true,
9036 apex_available: ["myapex"],
9037 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009038 }
9039 `)
9040}
9041
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009042func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9043 ctx := testApex(t, `
9044 apex {
9045 name: "myapex",
9046 key: "myapex.key",
9047 updatable: false,
9048 java_libs: ["foo"],
9049 }
9050
9051 apex_key {
9052 name: "myapex.key",
9053 public_key: "testkey.avbpubkey",
9054 private_key: "testkey.pem",
9055 }
9056
9057 java_library {
9058 name: "foo",
9059 srcs: ["foo.java"],
9060 apex_available: ["myapex"],
9061 installable: true,
9062 }
9063 `,
9064 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9065 )
9066
9067 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9068 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9069 var builder strings.Builder
9070 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9071 androidMk := builder.String()
9072 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")
9073}
9074
9075func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9076 ctx := testApex(t, `
9077 prebuilt_apex {
9078 name: "myapex",
9079 arch: {
9080 arm64: {
9081 src: "myapex-arm64.apex",
9082 },
9083 arm: {
9084 src: "myapex-arm.apex",
9085 },
9086 },
9087 exported_java_libs: ["foo"],
9088 }
9089
9090 java_import {
9091 name: "foo",
9092 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009093 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009094 }
9095 `,
9096 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9097 )
9098
9099 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9100 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9101 mainModuleEntries := entriesList[0]
9102 android.AssertArrayString(t,
9103 "LOCAL_REQUIRED_MODULES",
9104 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9105 []string{
9106 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9107 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9108 })
9109}
9110
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009111func TestAndroidMk_RequiredModules(t *testing.T) {
9112 ctx := testApex(t, `
9113 apex {
9114 name: "myapex",
9115 key: "myapex.key",
9116 updatable: false,
9117 java_libs: ["foo"],
9118 required: ["otherapex"],
9119 }
9120
9121 apex {
9122 name: "otherapex",
9123 key: "myapex.key",
9124 updatable: false,
9125 java_libs: ["foo"],
9126 required: ["otherapex"],
9127 }
9128
9129 apex_key {
9130 name: "myapex.key",
9131 public_key: "testkey.avbpubkey",
9132 private_key: "testkey.pem",
9133 }
9134
9135 java_library {
9136 name: "foo",
9137 srcs: ["foo.java"],
9138 apex_available: ["myapex", "otherapex"],
9139 installable: true,
9140 }
9141 `)
9142
9143 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9144 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9145 var builder strings.Builder
9146 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9147 androidMk := builder.String()
9148 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
9149}
9150
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009151func TestAndroidMk_RequiredDeps(t *testing.T) {
9152 ctx := testApex(t, `
9153 apex {
9154 name: "myapex",
9155 key: "myapex.key",
9156 updatable: false,
9157 }
9158
9159 apex_key {
9160 name: "myapex.key",
9161 public_key: "testkey.avbpubkey",
9162 private_key: "testkey.pem",
9163 }
9164 `)
9165
9166 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9167 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9168 data := android.AndroidMkDataForTest(t, ctx, bundle)
9169 var builder strings.Builder
9170 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9171 androidMk := builder.String()
9172 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
9173
9174 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9175 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9176 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9177 var flattenedBuilder strings.Builder
9178 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9179 flattenedAndroidMk := flattenedBuilder.String()
9180 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
9181}
9182
Jooyung Hana6d36672022-02-24 13:58:07 +09009183func TestApexOutputFileProducer(t *testing.T) {
9184 for _, tc := range []struct {
9185 name string
9186 ref string
9187 expected_data []string
9188 }{
9189 {
9190 name: "test_using_output",
9191 ref: ":myapex",
9192 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9193 },
9194 {
9195 name: "test_using_apex",
9196 ref: ":myapex{.apex}",
9197 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9198 },
9199 } {
9200 t.Run(tc.name, func(t *testing.T) {
9201 ctx := testApex(t, `
9202 apex {
9203 name: "myapex",
9204 key: "myapex.key",
9205 compressible: true,
9206 updatable: false,
9207 }
9208
9209 apex_key {
9210 name: "myapex.key",
9211 public_key: "testkey.avbpubkey",
9212 private_key: "testkey.pem",
9213 }
9214
9215 java_test {
9216 name: "`+tc.name+`",
9217 srcs: ["a.java"],
9218 data: ["`+tc.ref+`"],
9219 }
9220 `,
9221 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9222 variables.CompressedApex = proptools.BoolPtr(true)
9223 }))
9224 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9225 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9226 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9227 })
9228 }
9229}
9230
satayev758968a2021-12-06 11:42:40 +00009231func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9232 preparer := android.GroupFixturePreparers(
9233 PrepareForTestWithApexBuildComponents,
9234 prepareForTestWithMyapex,
9235 java.PrepareForTestWithJavaSdkLibraryFiles,
9236 java.PrepareForTestWithJavaDefaultModules,
9237 android.PrepareForTestWithAndroidBuildComponents,
9238 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9239 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9240 )
9241
9242 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9243 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9244 preparer.RunTestWithBp(t, `
9245 apex {
9246 name: "myapex",
9247 key: "myapex.key",
9248 bootclasspath_fragments: ["mybootclasspathfragment"],
9249 min_sdk_version: "30",
9250 updatable: false,
9251 }
9252
9253 apex_key {
9254 name: "myapex.key",
9255 public_key: "testkey.avbpubkey",
9256 private_key: "testkey.pem",
9257 }
9258
9259 bootclasspath_fragment {
9260 name: "mybootclasspathfragment",
9261 contents: ["mybootclasspathlib"],
9262 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009263 hidden_api: {
9264 split_packages: ["*"],
9265 },
satayev758968a2021-12-06 11:42:40 +00009266 }
9267
9268 java_sdk_library {
9269 name: "mybootclasspathlib",
9270 srcs: ["mybootclasspathlib.java"],
9271 apex_available: ["myapex"],
9272 compile_dex: true,
9273 unsafe_ignore_missing_latest_api: true,
9274 min_sdk_version: "31",
9275 static_libs: ["util"],
9276 }
9277
9278 java_library {
9279 name: "util",
9280 srcs: ["a.java"],
9281 apex_available: ["myapex"],
9282 min_sdk_version: "31",
9283 static_libs: ["another_util"],
9284 }
9285
9286 java_library {
9287 name: "another_util",
9288 srcs: ["a.java"],
9289 min_sdk_version: "31",
9290 apex_available: ["myapex"],
9291 }
9292 `)
9293 })
9294
9295 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9296 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9297 preparer.RunTestWithBp(t, `
9298 apex {
9299 name: "myapex",
9300 key: "myapex.key",
9301 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9302 min_sdk_version: "30",
9303 updatable: false,
9304 }
9305
9306 apex_key {
9307 name: "myapex.key",
9308 public_key: "testkey.avbpubkey",
9309 private_key: "testkey.pem",
9310 }
9311
9312 systemserverclasspath_fragment {
9313 name: "mysystemserverclasspathfragment",
9314 contents: ["mysystemserverclasspathlib"],
9315 apex_available: ["myapex"],
9316 }
9317
9318 java_sdk_library {
9319 name: "mysystemserverclasspathlib",
9320 srcs: ["mysystemserverclasspathlib.java"],
9321 apex_available: ["myapex"],
9322 compile_dex: true,
9323 min_sdk_version: "32",
9324 unsafe_ignore_missing_latest_api: true,
9325 static_libs: ["util"],
9326 }
9327
9328 java_library {
9329 name: "util",
9330 srcs: ["a.java"],
9331 apex_available: ["myapex"],
9332 min_sdk_version: "31",
9333 static_libs: ["another_util"],
9334 }
9335
9336 java_library {
9337 name: "another_util",
9338 srcs: ["a.java"],
9339 min_sdk_version: "31",
9340 apex_available: ["myapex"],
9341 }
9342 `)
9343 })
9344
9345 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9346 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9347 RunTestWithBp(t, `
9348 apex {
9349 name: "myapex",
9350 key: "myapex.key",
9351 bootclasspath_fragments: ["mybootclasspathfragment"],
9352 min_sdk_version: "30",
9353 updatable: false,
9354 }
9355
9356 apex_key {
9357 name: "myapex.key",
9358 public_key: "testkey.avbpubkey",
9359 private_key: "testkey.pem",
9360 }
9361
9362 bootclasspath_fragment {
9363 name: "mybootclasspathfragment",
9364 contents: ["mybootclasspathlib"],
9365 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009366 hidden_api: {
9367 split_packages: ["*"],
9368 },
satayev758968a2021-12-06 11:42:40 +00009369 }
9370
9371 java_sdk_library {
9372 name: "mybootclasspathlib",
9373 srcs: ["mybootclasspathlib.java"],
9374 apex_available: ["myapex"],
9375 compile_dex: true,
9376 unsafe_ignore_missing_latest_api: true,
9377 }
9378 `)
9379 })
9380
9381 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9382 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9383 RunTestWithBp(t, `
9384 apex {
9385 name: "myapex",
9386 key: "myapex.key",
9387 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9388 min_sdk_version: "30",
9389 updatable: false,
9390 }
9391
9392 apex_key {
9393 name: "myapex.key",
9394 public_key: "testkey.avbpubkey",
9395 private_key: "testkey.pem",
9396 }
9397
9398 systemserverclasspath_fragment {
9399 name: "mysystemserverclasspathfragment",
9400 contents: ["mysystemserverclasspathlib"],
9401 apex_available: ["myapex"],
9402 }
9403
9404 java_sdk_library {
9405 name: "mysystemserverclasspathlib",
9406 srcs: ["mysystemserverclasspathlib.java"],
9407 apex_available: ["myapex"],
9408 compile_dex: true,
9409 unsafe_ignore_missing_latest_api: true,
9410 }
9411 `)
9412 })
9413}
9414
Jiakai Zhang6decef92022-01-12 17:56:19 +00009415// Verifies that the APEX depends on all the Make modules in the list.
9416func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9417 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9418 for _, dep := range deps {
9419 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9420 }
9421}
9422
9423// Verifies that the APEX does not depend on any of the Make modules in the list.
9424func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9425 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9426 for _, dep := range deps {
9427 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9428 }
9429}
9430
Spandan Das66773252022-01-15 00:23:18 +00009431func TestApexStrictUpdtabilityLint(t *testing.T) {
9432 bpTemplate := `
9433 apex {
9434 name: "myapex",
9435 key: "myapex.key",
9436 java_libs: ["myjavalib"],
9437 updatable: %v,
9438 min_sdk_version: "29",
9439 }
9440 apex_key {
9441 name: "myapex.key",
9442 }
9443 java_library {
9444 name: "myjavalib",
9445 srcs: ["MyClass.java"],
9446 apex_available: [ "myapex" ],
9447 lint: {
9448 strict_updatability_linting: %v,
9449 },
9450 sdk_version: "current",
9451 min_sdk_version: "29",
9452 }
9453 `
9454 fs := android.MockFS{
9455 "lint-baseline.xml": nil,
9456 }
9457
9458 testCases := []struct {
9459 testCaseName string
9460 apexUpdatable bool
9461 javaStrictUpdtabilityLint bool
9462 lintFileExists bool
9463 disallowedFlagExpected bool
9464 }{
9465 {
9466 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9467 apexUpdatable: true,
9468 javaStrictUpdtabilityLint: true,
9469 lintFileExists: false,
9470 disallowedFlagExpected: false,
9471 },
9472 {
9473 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9474 apexUpdatable: false,
9475 javaStrictUpdtabilityLint: false,
9476 lintFileExists: true,
9477 disallowedFlagExpected: false,
9478 },
9479 {
9480 testCaseName: "non-updatable apex respects strict updatability of javalib",
9481 apexUpdatable: false,
9482 javaStrictUpdtabilityLint: true,
9483 lintFileExists: true,
9484 disallowedFlagExpected: true,
9485 },
9486 {
9487 testCaseName: "updatable apex sets strict updatability of javalib to true",
9488 apexUpdatable: true,
9489 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9490 lintFileExists: true,
9491 disallowedFlagExpected: true,
9492 },
9493 }
9494
9495 for _, testCase := range testCases {
9496 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9497 fixtures := []android.FixturePreparer{}
9498 if testCase.lintFileExists {
9499 fixtures = append(fixtures, fs.AddToFixture())
9500 }
9501
9502 result := testApex(t, bp, fixtures...)
9503 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9504 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9505 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9506
9507 if disallowedFlagActual != testCase.disallowedFlagExpected {
9508 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9509 }
9510 }
9511}
9512
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009513func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9514 bp := `
9515 apex {
9516 name: "myapex",
9517 key: "myapex.key",
9518 java_libs: ["myjavalib"],
9519 updatable: true,
9520 min_sdk_version: "29",
9521 }
9522 apex_key {
9523 name: "myapex.key",
9524 }
9525 java_library {
9526 name: "myjavalib",
9527 srcs: ["MyClass.java"],
9528 apex_available: [ "myapex" ],
9529 sdk_version: "current",
9530 min_sdk_version: "29",
9531 }
9532 `
9533
9534 testCases := []struct {
9535 testCaseName string
9536 moduleDirectory string
9537 disallowedFlagExpected bool
9538 }{
9539 {
9540 testCaseName: "lintable module defined outside libcore",
9541 moduleDirectory: "",
9542 disallowedFlagExpected: true,
9543 },
9544 {
9545 testCaseName: "lintable module defined in libcore root directory",
9546 moduleDirectory: "libcore/",
9547 disallowedFlagExpected: false,
9548 },
9549 {
9550 testCaseName: "lintable module defined in libcore child directory",
9551 moduleDirectory: "libcore/childdir/",
9552 disallowedFlagExpected: true,
9553 },
9554 }
9555
9556 for _, testCase := range testCases {
9557 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9558 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9559 result := testApex(t, "", lintFileCreator, bpFileCreator)
9560 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9561 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9562 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9563 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9564
9565 if disallowedFlagActual != testCase.disallowedFlagExpected {
9566 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9567 }
9568 }
9569}
9570
Spandan Das66773252022-01-15 00:23:18 +00009571// checks transtive deps of an apex coming from bootclasspath_fragment
9572func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9573 bp := `
9574 apex {
9575 name: "myapex",
9576 key: "myapex.key",
9577 bootclasspath_fragments: ["mybootclasspathfragment"],
9578 updatable: true,
9579 min_sdk_version: "29",
9580 }
9581 apex_key {
9582 name: "myapex.key",
9583 }
9584 bootclasspath_fragment {
9585 name: "mybootclasspathfragment",
9586 contents: ["myjavalib"],
9587 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009588 hidden_api: {
9589 split_packages: ["*"],
9590 },
Spandan Das66773252022-01-15 00:23:18 +00009591 }
9592 java_library {
9593 name: "myjavalib",
9594 srcs: ["MyClass.java"],
9595 apex_available: [ "myapex" ],
9596 sdk_version: "current",
9597 min_sdk_version: "29",
9598 compile_dex: true,
9599 }
9600 `
9601 fs := android.MockFS{
9602 "lint-baseline.xml": nil,
9603 }
9604
9605 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9606 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9607 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9608 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9609 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9610 }
9611}
9612
Spandan Das42e89502022-05-06 22:12:55 +00009613// updatable apexes should propagate updatable=true to its apps
9614func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9615 bp := `
9616 apex {
9617 name: "myapex",
9618 key: "myapex.key",
9619 updatable: %v,
9620 apps: [
9621 "myapp",
9622 ],
9623 min_sdk_version: "30",
9624 }
9625 apex_key {
9626 name: "myapex.key",
9627 }
9628 android_app {
9629 name: "myapp",
9630 updatable: %v,
9631 apex_available: [
9632 "myapex",
9633 ],
9634 sdk_version: "current",
9635 min_sdk_version: "30",
9636 }
9637 `
9638 testCases := []struct {
9639 name string
9640 apex_is_updatable_bp bool
9641 app_is_updatable_bp bool
9642 app_is_updatable_expected bool
9643 }{
9644 {
9645 name: "Non-updatable apex respects updatable property of non-updatable app",
9646 apex_is_updatable_bp: false,
9647 app_is_updatable_bp: false,
9648 app_is_updatable_expected: false,
9649 },
9650 {
9651 name: "Non-updatable apex respects updatable property of updatable app",
9652 apex_is_updatable_bp: false,
9653 app_is_updatable_bp: true,
9654 app_is_updatable_expected: true,
9655 },
9656 {
9657 name: "Updatable apex respects updatable property of updatable app",
9658 apex_is_updatable_bp: true,
9659 app_is_updatable_bp: true,
9660 app_is_updatable_expected: true,
9661 },
9662 {
9663 name: "Updatable apex sets updatable=true on non-updatable app",
9664 apex_is_updatable_bp: true,
9665 app_is_updatable_bp: false,
9666 app_is_updatable_expected: true,
9667 },
9668 }
9669 for _, testCase := range testCases {
9670 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9671 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9672 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9673 }
9674}
9675
Kiyoung Kim487689e2022-07-26 09:48:22 +09009676func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9677 bp := `
9678 apex {
9679 name: "myapex",
9680 key: "myapex.key",
9681 native_shared_libs: ["libfoo"],
9682 min_sdk_version: "29",
9683 }
9684 apex_key {
9685 name: "myapex.key",
9686 }
9687 cc_library {
9688 name: "libfoo",
9689 shared_libs: ["libc"],
9690 apex_available: ["myapex"],
9691 min_sdk_version: "29",
9692 }
9693 cc_api_library {
9694 name: "libc",
9695 src: "libc.so",
9696 min_sdk_version: "29",
9697 recovery_available: true,
9698 }
9699 api_imports {
9700 name: "api_imports",
9701 shared_libs: [
9702 "libc",
9703 ],
9704 header_libs: [],
9705 }
9706 `
9707 result := testApex(t, bp)
9708
9709 hasDep := func(m android.Module, wantDep android.Module) bool {
9710 t.Helper()
9711 var found bool
9712 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9713 if dep == wantDep {
9714 found = true
9715 }
9716 })
9717 return found
9718 }
9719
9720 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9721 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9722
9723 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9724
9725 // libfoo core variant should be buildable in the same inner tree since
9726 // certain mcombo files might build system and apexes in the same inner tree
9727 // libfoo core variant should link against source libc
9728 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9729 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9730 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9731}
9732
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009733func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009734 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009735}