blob: 7b4371f2342d0a96a2a1beb0f4828050d14e07b7 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
Liz Kammer0e255ef2022-11-04 16:07:04 -040032 "android/soong/bazel/cquery"
markchien2f59ec92020-09-02 16:23:38 +080033 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090034 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000035 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070036 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090037 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090038 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090040)
41
Jooyung Hand3639552019-08-09 12:57:43 +090042// names returns name list from white space separated string
43func names(s string) (ns []string) {
44 for _, n := range strings.Split(s, " ") {
45 if len(n) > 0 {
46 ns = append(ns, n)
47 }
48 }
49 return
50}
51
Paul Duffin40b62572021-03-20 11:39:01 +000052func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090053 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010054 android.GroupFixturePreparers(
55 prepareForApexTest,
56 android.GroupFixturePreparers(preparers...),
57 ).
Paul Duffine05480a2021-03-08 15:07:14 +000058 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000059 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090060}
61
Paul Duffin40b62572021-03-20 11:39:01 +000062func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090063 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010064
65 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000066 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010067 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000068 }
Paul Duffin284165a2021-03-29 01:50:31 +010069
70 result := android.GroupFixturePreparers(
71 prepareForApexTest,
72 android.GroupFixturePreparers(preparers...),
73 optionalBpPreparer,
74 ).RunTest(t)
75
Paul Duffine05480a2021-03-08 15:07:14 +000076 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090077}
78
Paul Duffin810f33d2021-03-09 14:12:32 +000079func withFiles(files android.MockFS) android.FixturePreparer {
80 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
84 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090085 for k, v := range targets {
86 config.Targets[k] = v
87 }
Paul Duffin810f33d2021-03-09 14:12:32 +000088 })
Jooyung Han344d5432019-08-23 11:17:39 +090089}
90
Jooyung Han35155c42020-02-06 17:33:20 +090091// withNativeBridgeTargets sets configuration with targets including:
92// - X86_64 (primary)
93// - X86 (secondary)
94// - Arm64 on X86_64 (native bridge)
95// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000096var withNativeBridgeEnabled = android.FixtureModifyConfig(
97 func(config android.Config) {
98 config.Targets[android.Android] = []android.Target{
99 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
100 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
104 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
107 }
108 },
109)
110
111func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
112 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
113 variables.ManifestPackageNameOverrides = specs
114 })
Jooyung Han35155c42020-02-06 17:33:20 +0900115}
116
Albert Martineefabcf2022-03-21 20:11:16 +0000117func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
118 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
119 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
120 })
121}
122
Paul Duffin810f33d2021-03-09 14:12:32 +0000123var withBinder32bit = android.FixtureModifyProductVariables(
124 func(variables android.FixtureProductVariables) {
125 variables.Binder32bit = proptools.BoolPtr(true)
126 },
127)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900128
Paul Duffin810f33d2021-03-09 14:12:32 +0000129var withUnbundledBuild = android.FixtureModifyProductVariables(
130 func(variables android.FixtureProductVariables) {
131 variables.Unbundled_build = proptools.BoolPtr(true)
132 },
133)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900134
Paul Duffin284165a2021-03-29 01:50:31 +0100135// Legacy preparer used for running tests within the apex package.
136//
137// This includes everything that was needed to run any test in the apex package prior to the
138// introduction of the test fixtures. Tests that are being converted to use fixtures directly
139// rather than through the testApex...() methods should avoid using this and instead use the
140// various preparers directly, using android.GroupFixturePreparers(...) to group them when
141// necessary.
142//
143// deprecated
144var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000145 // General preparers in alphabetical order as test infrastructure will enforce correct
146 // registration order.
147 android.PrepareForTestWithAndroidBuildComponents,
148 bpf.PrepareForTestWithBpf,
149 cc.PrepareForTestWithCcBuildComponents,
150 java.PrepareForTestWithJavaDefaultModules,
151 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
152 rust.PrepareForTestWithRustDefaultModules,
153 sh.PrepareForTestWithShBuildComponents,
154
155 PrepareForTestWithApexBuildComponents,
156
157 // Additional apex test specific preparers.
158 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
159 filegroup {
160 name: "myapex-file_contexts",
161 srcs: [
162 "apex/myapex-file_contexts",
163 ],
164 }
165 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000166 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000167 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 "a.java": nil,
169 "PrebuiltAppFoo.apk": nil,
170 "PrebuiltAppFooPriv.apk": nil,
171 "apex_manifest.json": nil,
172 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000173 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
174 "system/sepolicy/apex/myapex2-file_contexts": nil,
175 "system/sepolicy/apex/otherapex-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
177 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700178 "mylib.cpp": nil,
179 "mytest.cpp": nil,
180 "mytest1.cpp": nil,
181 "mytest2.cpp": nil,
182 "mytest3.cpp": nil,
183 "myprebuilt": nil,
184 "my_include": nil,
185 "foo/bar/MyClass.java": nil,
186 "prebuilt.jar": nil,
187 "prebuilt.so": nil,
188 "vendor/foo/devkeys/test.x509.pem": nil,
189 "vendor/foo/devkeys/test.pk8": nil,
190 "testkey.x509.pem": nil,
191 "testkey.pk8": nil,
192 "testkey.override.x509.pem": nil,
193 "testkey.override.pk8": nil,
194 "vendor/foo/devkeys/testkey.avbpubkey": nil,
195 "vendor/foo/devkeys/testkey.pem": nil,
196 "NOTICE": nil,
197 "custom_notice": nil,
198 "custom_notice_for_static_lib": nil,
199 "testkey2.avbpubkey": nil,
200 "testkey2.pem": nil,
201 "myapex-arm64.apex": nil,
202 "myapex-arm.apex": nil,
203 "myapex.apks": nil,
204 "frameworks/base/api/current.txt": nil,
205 "framework/aidl/a.aidl": nil,
206 "dummy.txt": nil,
207 "baz": nil,
208 "bar/baz": nil,
209 "testdata/baz": nil,
210 "AppSet.apks": nil,
211 "foo.rs": nil,
212 "libfoo.jar": nil,
213 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000214 },
215 ),
216
217 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
218 variables.DeviceVndkVersion = proptools.StringPtr("current")
219 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
220 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
221 variables.Platform_sdk_codename = proptools.StringPtr("Q")
222 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000223 // "Tiramisu" needs to be in the next line for compatibility with soong code,
224 // not because of these tests specifically (it's not used by the tests)
225 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900226 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000227 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000228 }),
229)
230
Paul Duffin52bfaa42021-03-23 23:40:12 +0000231var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
232 "system/sepolicy/apex/myapex-file_contexts": nil,
233})
234
Jooyung Han643adc42020-02-27 13:50:06 +0900235// ensure that 'result' equals 'expected'
236func ensureEquals(t *testing.T, result string, expected string) {
237 t.Helper()
238 if result != expected {
239 t.Errorf("%q != %q", expected, result)
240 }
241}
242
Jiyong Park25fc6a92018-11-18 18:02:45 +0900243// ensure that 'result' contains 'expected'
244func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900245 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246 if !strings.Contains(result, expected) {
247 t.Errorf("%q is not found in %q", expected, result)
248 }
249}
250
Liz Kammer5bd365f2020-05-27 15:15:11 -0700251// ensure that 'result' contains 'expected' exactly one time
252func ensureContainsOnce(t *testing.T, result string, expected string) {
253 t.Helper()
254 count := strings.Count(result, expected)
255 if count != 1 {
256 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
257 }
258}
259
Jiyong Park25fc6a92018-11-18 18:02:45 +0900260// ensures that 'result' does not contain 'notExpected'
261func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900262 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263 if strings.Contains(result, notExpected) {
264 t.Errorf("%q is found in %q", notExpected, result)
265 }
266}
267
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700268func ensureMatches(t *testing.T, result string, expectedRex string) {
269 ok, err := regexp.MatchString(expectedRex, result)
270 if err != nil {
271 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
272 return
273 }
274 if !ok {
275 t.Errorf("%s does not match regular expession %s", result, expectedRex)
276 }
277}
278
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900280 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281 if !android.InList(expected, result) {
282 t.Errorf("%q is not found in %v", expected, result)
283 }
284}
285
286func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900287 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900288 if android.InList(notExpected, result) {
289 t.Errorf("%q is found in %v", notExpected, result)
290 }
291}
292
Jooyung Hane1633032019-08-01 17:41:43 +0900293func ensureListEmpty(t *testing.T, result []string) {
294 t.Helper()
295 if len(result) > 0 {
296 t.Errorf("%q is expected to be empty", result)
297 }
298}
299
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000300func ensureListNotEmpty(t *testing.T, result []string) {
301 t.Helper()
302 if len(result) == 0 {
303 t.Errorf("%q is expected to be not empty", result)
304 }
305}
306
Jiyong Park25fc6a92018-11-18 18:02:45 +0900307// Minimal test
308func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800309 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900310 apex_defaults {
311 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900312 manifest: ":myapex.manifest",
313 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900314 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900315 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900316 native_shared_libs: [
317 "mylib",
318 "libfoo.ffi",
319 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900320 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800321 multilib: {
322 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900323 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800324 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900325 },
Jiyong Park77acec62020-06-01 21:39:15 +0900326 java_libs: [
327 "myjar",
328 "myjar_dex",
329 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000330 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900331 }
332
Jiyong Park30ca9372019-02-07 16:27:23 +0900333 apex {
334 name: "myapex",
335 defaults: ["myapex-defaults"],
336 }
337
Jiyong Park25fc6a92018-11-18 18:02:45 +0900338 apex_key {
339 name: "myapex.key",
340 public_key: "testkey.avbpubkey",
341 private_key: "testkey.pem",
342 }
343
Jiyong Park809bb722019-02-13 21:33:49 +0900344 filegroup {
345 name: "myapex.manifest",
346 srcs: ["apex_manifest.json"],
347 }
348
349 filegroup {
350 name: "myapex.androidmanifest",
351 srcs: ["AndroidManifest.xml"],
352 }
353
Jiyong Park25fc6a92018-11-18 18:02:45 +0900354 cc_library {
355 name: "mylib",
356 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900357 shared_libs: [
358 "mylib2",
359 "libbar.ffi",
360 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900361 system_shared_libs: [],
362 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000363 // TODO: remove //apex_available:platform
364 apex_available: [
365 "//apex_available:platform",
366 "myapex",
367 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900368 }
369
Alex Light3d673592019-01-18 14:37:31 -0800370 cc_binary {
371 name: "foo",
372 srcs: ["mylib.cpp"],
373 compile_multilib: "both",
374 multilib: {
375 lib32: {
376 suffix: "32",
377 },
378 lib64: {
379 suffix: "64",
380 },
381 },
382 symlinks: ["foo_link_"],
383 symlink_preferred_arch: true,
384 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800385 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700386 apex_available: [ "myapex", "com.android.gki.*" ],
387 }
388
Jiyong Park99644e92020-11-17 22:21:02 +0900389 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000390 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900391 srcs: ["foo.rs"],
392 rlibs: ["libfoo.rlib.rust"],
393 dylibs: ["libfoo.dylib.rust"],
394 apex_available: ["myapex"],
395 }
396
397 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000398 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900399 srcs: ["foo.rs"],
400 crate_name: "foo",
401 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900402 shared_libs: ["libfoo.shared_from_rust"],
403 }
404
405 cc_library_shared {
406 name: "libfoo.shared_from_rust",
407 srcs: ["mylib.cpp"],
408 system_shared_libs: [],
409 stl: "none",
410 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900411 }
412
413 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000414 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900415 srcs: ["foo.rs"],
416 crate_name: "foo",
417 apex_available: ["myapex"],
418 }
419
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900420 rust_ffi_shared {
421 name: "libfoo.ffi",
422 srcs: ["foo.rs"],
423 crate_name: "foo",
424 apex_available: ["myapex"],
425 }
426
427 rust_ffi_shared {
428 name: "libbar.ffi",
429 srcs: ["foo.rs"],
430 crate_name: "bar",
431 apex_available: ["myapex"],
432 }
433
Yifan Hongd22a84a2020-07-28 17:37:46 -0700434 apex {
435 name: "com.android.gki.fake",
436 binaries: ["foo"],
437 key: "myapex.key",
438 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000439 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800440 }
441
Paul Duffindddd5462020-04-07 15:25:44 +0100442 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900443 name: "mylib2",
444 srcs: ["mylib.cpp"],
445 system_shared_libs: [],
446 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900447 static_libs: ["libstatic"],
448 // TODO: remove //apex_available:platform
449 apex_available: [
450 "//apex_available:platform",
451 "myapex",
452 ],
453 }
454
Paul Duffindddd5462020-04-07 15:25:44 +0100455 cc_prebuilt_library_shared {
456 name: "mylib2",
457 srcs: ["prebuilt.so"],
458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
463 }
464
Jiyong Park9918e1a2020-03-17 19:16:40 +0900465 cc_library_static {
466 name: "libstatic",
467 srcs: ["mylib.cpp"],
468 system_shared_libs: [],
469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900475 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476
477 java_library {
478 name: "myjar",
479 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900480 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900484 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000485 // TODO: remove //apex_available:platform
486 apex_available: [
487 "//apex_available:platform",
488 "myapex",
489 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 }
491
Jiyong Park77acec62020-06-01 21:39:15 +0900492 dex_import {
493 name: "myjar_dex",
494 jars: ["prebuilt.jar"],
495 apex_available: [
496 "//apex_available:platform",
497 "myapex",
498 ],
499 }
500
Jiyong Park7f7766d2019-07-25 22:02:35 +0900501 java_library {
502 name: "myotherjar",
503 srcs: ["foo/bar/MyClass.java"],
504 sdk_version: "none",
505 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900506 // TODO: remove //apex_available:platform
507 apex_available: [
508 "//apex_available:platform",
509 "myapex",
510 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900511 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900512
513 java_library {
514 name: "mysharedjar",
515 srcs: ["foo/bar/MyClass.java"],
516 sdk_version: "none",
517 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900518 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900519 `)
520
Paul Duffina71a67a2021-03-29 00:42:57 +0100521 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900523 // Make sure that Android.mk is created
524 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700525 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 var builder strings.Builder
527 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
528
529 androidMk := builder.String()
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900530 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
531
Jiyong Park42cca6c2019-04-01 11:15:50 +0900532 optFlags := apexRule.Args["opt_flags"]
533 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700534 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100535 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536
Jiyong Park25fc6a92018-11-18 18:02:45 +0900537 copyCmds := apexRule.Args["copy_commands"]
538
539 // Ensure that main rule creates an output
540 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
541
542 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700543 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
544 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900548
549 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
551 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900552 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900556
557 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800558 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
559 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900560 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900562 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
564 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900566 // .. but not for java libs
567 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900568 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800569
Colin Cross7113d202019-11-20 16:39:12 -0800570 // Ensure that the platform variant ends with _shared or _common
571 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900573 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
574 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
576
577 // Ensure that dynamic dependency to java libs are not included
578 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800579
580 // Ensure that all symlinks are present.
581 found_foo_link_64 := false
582 found_foo := false
583 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900584 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800585 if strings.HasSuffix(cmd, "bin/foo") {
586 found_foo = true
587 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
588 found_foo_link_64 = true
589 }
590 }
591 }
592 good := found_foo && found_foo_link_64
593 if !good {
594 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
595 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900596
Artur Satayeva8bd1132020-04-27 18:07:06 +0100597 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
600 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
601 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100602
603 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
606 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800608}
609
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800611 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612 apex_defaults {
613 name: "myapex-defaults",
614 key: "myapex.key",
615 prebuilts: ["myetc"],
616 native_shared_libs: ["mylib"],
617 java_libs: ["myjar"],
618 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900619 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800620 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000621 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900622 }
623
624 prebuilt_etc {
625 name: "myetc",
626 src: "myprebuilt",
627 }
628
629 apex {
630 name: "myapex",
631 defaults: ["myapex-defaults"],
632 }
633
634 apex_key {
635 name: "myapex.key",
636 public_key: "testkey.avbpubkey",
637 private_key: "testkey.pem",
638 }
639
640 cc_library {
641 name: "mylib",
642 system_shared_libs: [],
643 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000644 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900645 }
646
647 java_library {
648 name: "myjar",
649 srcs: ["foo/bar/MyClass.java"],
650 sdk_version: "none",
651 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000652 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900653 }
654
655 android_app {
656 name: "AppFoo",
657 srcs: ["foo/bar/MyClass.java"],
658 sdk_version: "none",
659 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000660 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900662
663 runtime_resource_overlay {
664 name: "rro",
665 theme: "blue",
666 }
667
markchien2f59ec92020-09-02 16:23:38 +0800668 bpf {
669 name: "bpf",
670 srcs: ["bpf.c", "bpf2.c"],
671 }
672
Ken Chenfad7f9d2021-11-10 22:02:57 +0800673 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800674 name: "netdTest",
675 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 sub_dir: "netd",
677 }
678
Jooyung Hanf21c7972019-12-16 22:32:06 +0900679 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000680 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900681 "etc/myetc",
682 "javalib/myjar.jar",
683 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000684 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900685 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800686 "etc/bpf/bpf.o",
687 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800688 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900689 })
690}
691
Jooyung Han01a3ee22019-11-02 02:52:25 +0900692func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800693 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 apex {
695 name: "myapex",
696 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000697 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 }
699
700 apex_key {
701 name: "myapex.key",
702 public_key: "testkey.avbpubkey",
703 private_key: "testkey.pem",
704 }
705 `)
706
707 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900708 args := module.Rule("apexRule").Args
709 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
710 t.Error("manifest should be apex_manifest.pb, but " + manifest)
711 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900712}
713
Liz Kammer4854a7d2021-05-27 14:28:27 -0400714func TestApexManifestMinSdkVersion(t *testing.T) {
715 ctx := testApex(t, `
716 apex_defaults {
717 name: "my_defaults",
718 key: "myapex.key",
719 product_specific: true,
720 file_contexts: ":my-file-contexts",
721 updatable: false,
722 }
723 apex {
724 name: "myapex_30",
725 min_sdk_version: "30",
726 defaults: ["my_defaults"],
727 }
728
729 apex {
730 name: "myapex_current",
731 min_sdk_version: "current",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_none",
737 defaults: ["my_defaults"],
738 }
739
740 apex_key {
741 name: "myapex.key",
742 public_key: "testkey.avbpubkey",
743 private_key: "testkey.pem",
744 }
745
746 filegroup {
747 name: "my-file-contexts",
748 srcs: ["product_specific_file_contexts"],
749 }
750 `, withFiles(map[string][]byte{
751 "product_specific_file_contexts": nil,
752 }), android.FixtureModifyProductVariables(
753 func(variables android.FixtureProductVariables) {
754 variables.Unbundled_build = proptools.BoolPtr(true)
755 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
756 }), android.FixtureMergeEnv(map[string]string{
757 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
758 }))
759
760 testCases := []struct {
761 module string
762 minSdkVersion string
763 }{
764 {
765 module: "myapex_30",
766 minSdkVersion: "30",
767 },
768 {
769 module: "myapex_current",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 {
773 module: "myapex_none",
774 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
775 },
776 }
777 for _, tc := range testCases {
778 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
779 args := module.Rule("apexRule").Args
780 optFlags := args["opt_flags"]
781 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
782 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
783 }
784 }
785}
786
Alex Light5098a612018-11-29 17:12:15 -0800787func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800788 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800789 apex {
790 name: "myapex",
791 key: "myapex.key",
792 payload_type: "zip",
793 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000794 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800795 }
796
797 apex_key {
798 name: "myapex.key",
799 public_key: "testkey.avbpubkey",
800 private_key: "testkey.pem",
801 }
802
803 cc_library {
804 name: "mylib",
805 srcs: ["mylib.cpp"],
806 shared_libs: ["mylib2"],
807 system_shared_libs: [],
808 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000809 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800810 }
811
812 cc_library {
813 name: "mylib2",
814 srcs: ["mylib.cpp"],
815 system_shared_libs: [],
816 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000817 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800818 }
819 `)
820
Sundong Ahnabb64432019-10-22 13:58:29 +0900821 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800822 copyCmds := zipApexRule.Args["copy_commands"]
823
824 // Ensure that main rule creates an output
825 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
826
827 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700828 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800829
830 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700831 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800832
833 // Ensure that both direct and indirect deps are copied into apex
834 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
835 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900836}
837
838func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800839 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900840 apex {
841 name: "myapex",
842 key: "myapex.key",
843 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900844 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000845 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900846 }
847
848 apex_key {
849 name: "myapex.key",
850 public_key: "testkey.avbpubkey",
851 private_key: "testkey.pem",
852 }
853
854 cc_library {
855 name: "mylib",
856 srcs: ["mylib.cpp"],
857 shared_libs: ["mylib2", "mylib3"],
858 system_shared_libs: [],
859 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000860 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900861 }
862
863 cc_library {
864 name: "mylib2",
865 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900866 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 system_shared_libs: [],
868 stl: "none",
869 stubs: {
870 versions: ["1", "2", "3"],
871 },
872 }
873
874 cc_library {
875 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900876 srcs: ["mylib.cpp"],
877 shared_libs: ["mylib4"],
878 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900879 stl: "none",
880 stubs: {
881 versions: ["10", "11", "12"],
882 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000883 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900885
886 cc_library {
887 name: "mylib4",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000891 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900892 }
Jiyong Park105dc322021-06-11 17:22:09 +0900893
894 rust_binary {
895 name: "foo.rust",
896 srcs: ["foo.rs"],
897 shared_libs: ["libfoo.shared_from_rust"],
898 prefer_rlib: true,
899 apex_available: ["myapex"],
900 }
901
902 cc_library_shared {
903 name: "libfoo.shared_from_rust",
904 srcs: ["mylib.cpp"],
905 system_shared_libs: [],
906 stl: "none",
907 stubs: {
908 versions: ["10", "11", "12"],
909 },
910 }
911
Jiyong Park25fc6a92018-11-18 18:02:45 +0900912 `)
913
Sundong Ahnabb64432019-10-22 13:58:29 +0900914 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 copyCmds := apexRule.Args["copy_commands"]
916
917 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800918 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919
920 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800921 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922
923 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800924 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900925
Colin Crossaede88c2020-08-11 12:17:01 -0700926 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927
928 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900929 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900930 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900931 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932
933 // 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 -0700934 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700936 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900937
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700938 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
939 // is replaced by sharing of "cFlags" in cc/builder.go.
940 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
941 // module variable representing "cflags". So it was not detected by ensureNotContains.
942 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
943 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
944 // including the original cflags's "-include mylib.h".
945 //
Jiyong Park64379952018-12-13 18:37:29 +0900946 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700947 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
948 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900949
Jiyong Park85cc35a2022-07-17 11:30:47 +0900950 // Ensure that genstub for platform-provided lib is invoked with --systemapi
951 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
952 // Ensure that genstub for apex-provided lib is invoked with --apex
953 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900954
Jooyung Hana57af4a2020-01-23 05:36:59 +0000955 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900956 "lib64/mylib.so",
957 "lib64/mylib3.so",
958 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900959 "bin/foo.rust",
960 "lib64/libc++.so", // by the implicit dependency from foo.rust
961 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900962 })
Jiyong Park105dc322021-06-11 17:22:09 +0900963
964 // Ensure that stub dependency from a rust module is not included
965 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
966 // The rust module is linked to the stub cc library
967 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
968 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
969 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900970
971 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
972 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973}
974
Jiyong Park1bc84122021-06-22 20:23:05 +0900975func TestApexCanUsePrivateApis(t *testing.T) {
976 ctx := testApex(t, `
977 apex {
978 name: "myapex",
979 key: "myapex.key",
980 native_shared_libs: ["mylib"],
981 binaries: ["foo.rust"],
982 updatable: false,
983 platform_apis: true,
984 }
985
986 apex_key {
987 name: "myapex.key",
988 public_key: "testkey.avbpubkey",
989 private_key: "testkey.pem",
990 }
991
992 cc_library {
993 name: "mylib",
994 srcs: ["mylib.cpp"],
995 shared_libs: ["mylib2"],
996 system_shared_libs: [],
997 stl: "none",
998 apex_available: [ "myapex" ],
999 }
1000
1001 cc_library {
1002 name: "mylib2",
1003 srcs: ["mylib.cpp"],
1004 cflags: ["-include mylib.h"],
1005 system_shared_libs: [],
1006 stl: "none",
1007 stubs: {
1008 versions: ["1", "2", "3"],
1009 },
1010 }
1011
1012 rust_binary {
1013 name: "foo.rust",
1014 srcs: ["foo.rs"],
1015 shared_libs: ["libfoo.shared_from_rust"],
1016 prefer_rlib: true,
1017 apex_available: ["myapex"],
1018 }
1019
1020 cc_library_shared {
1021 name: "libfoo.shared_from_rust",
1022 srcs: ["mylib.cpp"],
1023 system_shared_libs: [],
1024 stl: "none",
1025 stubs: {
1026 versions: ["10", "11", "12"],
1027 },
1028 }
1029 `)
1030
1031 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1032 copyCmds := apexRule.Args["copy_commands"]
1033
1034 // Ensure that indirect stubs dep is not included
1035 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1037
1038 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1039 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001040 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001041 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1042 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001043 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001044 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1046}
1047
Colin Cross7812fd32020-09-25 12:35:10 -07001048func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1049 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001050 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001051 apex {
1052 name: "myapex",
1053 key: "myapex.key",
1054 native_shared_libs: ["mylib", "mylib3"],
1055 min_sdk_version: "29",
1056 }
1057
1058 apex_key {
1059 name: "myapex.key",
1060 public_key: "testkey.avbpubkey",
1061 private_key: "testkey.pem",
1062 }
1063
1064 cc_library {
1065 name: "mylib",
1066 srcs: ["mylib.cpp"],
1067 shared_libs: ["mylib2", "mylib3"],
1068 system_shared_libs: [],
1069 stl: "none",
1070 apex_available: [ "myapex" ],
1071 min_sdk_version: "28",
1072 }
1073
1074 cc_library {
1075 name: "mylib2",
1076 srcs: ["mylib.cpp"],
1077 cflags: ["-include mylib.h"],
1078 system_shared_libs: [],
1079 stl: "none",
1080 stubs: {
1081 versions: ["28", "29", "30", "current"],
1082 },
1083 min_sdk_version: "28",
1084 }
1085
1086 cc_library {
1087 name: "mylib3",
1088 srcs: ["mylib.cpp"],
1089 shared_libs: ["mylib4"],
1090 system_shared_libs: [],
1091 stl: "none",
1092 stubs: {
1093 versions: ["28", "29", "30", "current"],
1094 },
1095 apex_available: [ "myapex" ],
1096 min_sdk_version: "28",
1097 }
1098
1099 cc_library {
1100 name: "mylib4",
1101 srcs: ["mylib.cpp"],
1102 system_shared_libs: [],
1103 stl: "none",
1104 apex_available: [ "myapex" ],
1105 min_sdk_version: "28",
1106 }
1107 `)
1108
1109 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1110 copyCmds := apexRule.Args["copy_commands"]
1111
1112 // Ensure that direct non-stubs dep is always included
1113 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1114
1115 // Ensure that indirect stubs dep is not included
1116 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1117
1118 // Ensure that direct stubs dep is included
1119 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1120
1121 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1122
Jiyong Park55549df2021-02-26 23:57:23 +09001123 // Ensure that mylib is linking with the latest version of stub for mylib2
1124 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001125 // ... and not linking to the non-stub (impl) variant of mylib2
1126 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1127
1128 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1129 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1130 // .. and not linking to the stubs variant of mylib3
1131 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1132
1133 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001134 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001135 ensureNotContains(t, mylib2Cflags, "-include ")
1136
Jiyong Park85cc35a2022-07-17 11:30:47 +09001137 // Ensure that genstub is invoked with --systemapi
1138 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001139
1140 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1141 "lib64/mylib.so",
1142 "lib64/mylib3.so",
1143 "lib64/mylib4.so",
1144 })
1145}
1146
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001147func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1148 t.Parallel()
1149 // myapex (Z)
1150 // mylib -----------------.
1151 // |
1152 // otherapex (29) |
1153 // libstub's versions: 29 Z current
1154 // |
1155 // <platform> |
1156 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001157 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001158 apex {
1159 name: "myapex",
1160 key: "myapex.key",
1161 native_shared_libs: ["mylib"],
1162 min_sdk_version: "Z", // non-final
1163 }
1164
1165 cc_library {
1166 name: "mylib",
1167 srcs: ["mylib.cpp"],
1168 shared_libs: ["libstub"],
1169 apex_available: ["myapex"],
1170 min_sdk_version: "Z",
1171 }
1172
1173 apex_key {
1174 name: "myapex.key",
1175 public_key: "testkey.avbpubkey",
1176 private_key: "testkey.pem",
1177 }
1178
1179 apex {
1180 name: "otherapex",
1181 key: "myapex.key",
1182 native_shared_libs: ["libstub"],
1183 min_sdk_version: "29",
1184 }
1185
1186 cc_library {
1187 name: "libstub",
1188 srcs: ["mylib.cpp"],
1189 stubs: {
1190 versions: ["29", "Z", "current"],
1191 },
1192 apex_available: ["otherapex"],
1193 min_sdk_version: "29",
1194 }
1195
1196 // platform module depending on libstub from otherapex should use the latest stub("current")
1197 cc_library {
1198 name: "libplatform",
1199 srcs: ["mylib.cpp"],
1200 shared_libs: ["libstub"],
1201 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001202 `,
1203 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1204 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1205 variables.Platform_sdk_final = proptools.BoolPtr(false)
1206 variables.Platform_version_active_codenames = []string{"Z"}
1207 }),
1208 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001209
Jiyong Park55549df2021-02-26 23:57:23 +09001210 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001211 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001212 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001213 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001214 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001215
1216 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1217 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1218 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1219 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1220 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1221}
1222
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001223func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001224 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001225 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001226 name: "myapex2",
1227 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001228 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001229 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 }
1231
1232 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001233 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234 public_key: "testkey.avbpubkey",
1235 private_key: "testkey.pem",
1236 }
1237
1238 cc_library {
1239 name: "mylib",
1240 srcs: ["mylib.cpp"],
1241 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001242 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001243 system_shared_libs: [],
1244 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001245 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001246 }
1247
1248 cc_library {
1249 name: "libfoo",
1250 srcs: ["mylib.cpp"],
1251 shared_libs: ["libbar"],
1252 system_shared_libs: [],
1253 stl: "none",
1254 stubs: {
1255 versions: ["10", "20", "30"],
1256 },
1257 }
1258
1259 cc_library {
1260 name: "libbar",
1261 srcs: ["mylib.cpp"],
1262 system_shared_libs: [],
1263 stl: "none",
1264 }
1265
Jiyong Park678c8812020-02-07 17:25:49 +09001266 cc_library_static {
1267 name: "libbaz",
1268 srcs: ["mylib.cpp"],
1269 system_shared_libs: [],
1270 stl: "none",
1271 apex_available: [ "myapex2" ],
1272 }
1273
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001274 `)
1275
Jiyong Park83dc74b2020-01-14 18:38:44 +09001276 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001277 copyCmds := apexRule.Args["copy_commands"]
1278
1279 // Ensure that direct non-stubs dep is always included
1280 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1281
1282 // Ensure that indirect stubs dep is not included
1283 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1284
1285 // Ensure that dependency of stubs is not included
1286 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1287
Colin Crossaede88c2020-08-11 12:17:01 -07001288 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289
1290 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001291 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001292 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001293 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001294
Jiyong Park3ff16992019-12-27 14:11:47 +09001295 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001296
1297 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1298 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001299
Artur Satayeva8bd1132020-04-27 18:07:06 +01001300 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001301 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001302
Artur Satayeva8bd1132020-04-27 18:07:06 +01001303 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001304 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001305}
1306
Jooyung Hand3639552019-08-09 12:57:43 +09001307func TestApexWithRuntimeLibsDependency(t *testing.T) {
1308 /*
1309 myapex
1310 |
1311 v (runtime_libs)
1312 mylib ------+------> libfoo [provides stub]
1313 |
1314 `------> libbar
1315 */
Colin Cross1c460562021-02-16 17:55:47 -08001316 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001317 apex {
1318 name: "myapex",
1319 key: "myapex.key",
1320 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001321 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001322 }
1323
1324 apex_key {
1325 name: "myapex.key",
1326 public_key: "testkey.avbpubkey",
1327 private_key: "testkey.pem",
1328 }
1329
1330 cc_library {
1331 name: "mylib",
1332 srcs: ["mylib.cpp"],
1333 runtime_libs: ["libfoo", "libbar"],
1334 system_shared_libs: [],
1335 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001336 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001337 }
1338
1339 cc_library {
1340 name: "libfoo",
1341 srcs: ["mylib.cpp"],
1342 system_shared_libs: [],
1343 stl: "none",
1344 stubs: {
1345 versions: ["10", "20", "30"],
1346 },
1347 }
1348
1349 cc_library {
1350 name: "libbar",
1351 srcs: ["mylib.cpp"],
1352 system_shared_libs: [],
1353 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001354 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001355 }
1356
1357 `)
1358
Sundong Ahnabb64432019-10-22 13:58:29 +09001359 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001360 copyCmds := apexRule.Args["copy_commands"]
1361
1362 // Ensure that direct non-stubs dep is always included
1363 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1364
1365 // Ensure that indirect stubs dep is not included
1366 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1367
1368 // Ensure that runtime_libs dep in included
1369 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1370
Sundong Ahnabb64432019-10-22 13:58:29 +09001371 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001372 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1373 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001374
1375}
1376
Paul Duffina02cae32021-03-09 01:44:06 +00001377var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1378 cc.PrepareForTestWithCcBuildComponents,
1379 PrepareForTestWithApexBuildComponents,
1380 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001381 apex {
1382 name: "com.android.runtime",
1383 key: "com.android.runtime.key",
1384 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001385 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001386 }
1387
1388 apex_key {
1389 name: "com.android.runtime.key",
1390 public_key: "testkey.avbpubkey",
1391 private_key: "testkey.pem",
1392 }
Paul Duffina02cae32021-03-09 01:44:06 +00001393 `),
1394 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1395)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001396
Paul Duffina02cae32021-03-09 01:44:06 +00001397func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001398 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001399 cc_library {
1400 name: "libc",
1401 no_libcrt: true,
1402 nocrt: true,
1403 stl: "none",
1404 system_shared_libs: [],
1405 stubs: { versions: ["1"] },
1406 apex_available: ["com.android.runtime"],
1407
1408 sanitize: {
1409 hwaddress: true,
1410 }
1411 }
1412
1413 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001414 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001415 no_libcrt: true,
1416 nocrt: true,
1417 stl: "none",
1418 system_shared_libs: [],
1419 srcs: [""],
1420 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001421 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001422
1423 sanitize: {
1424 never: true,
1425 },
Paul Duffina02cae32021-03-09 01:44:06 +00001426 } `)
1427 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001428
1429 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1430 "lib64/bionic/libc.so",
1431 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1432 })
1433
Colin Cross4c4c1be2022-02-10 11:41:18 -08001434 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001435
1436 installed := hwasan.Description("install libclang_rt.hwasan")
1437 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1438
1439 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1440 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1441 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1442}
1443
1444func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001445 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001446 prepareForTestOfRuntimeApexWithHwasan,
1447 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1448 variables.SanitizeDevice = []string{"hwaddress"}
1449 }),
1450 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001451 cc_library {
1452 name: "libc",
1453 no_libcrt: true,
1454 nocrt: true,
1455 stl: "none",
1456 system_shared_libs: [],
1457 stubs: { versions: ["1"] },
1458 apex_available: ["com.android.runtime"],
1459 }
1460
1461 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001462 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001463 no_libcrt: true,
1464 nocrt: true,
1465 stl: "none",
1466 system_shared_libs: [],
1467 srcs: [""],
1468 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001469 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001470
1471 sanitize: {
1472 never: true,
1473 },
1474 }
Paul Duffina02cae32021-03-09 01:44:06 +00001475 `)
1476 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477
1478 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1479 "lib64/bionic/libc.so",
1480 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1481 })
1482
Colin Cross4c4c1be2022-02-10 11:41:18 -08001483 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001484
1485 installed := hwasan.Description("install libclang_rt.hwasan")
1486 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1487
1488 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1489 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1490 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1491}
1492
Jooyung Han61b66e92020-03-21 14:21:46 +00001493func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1494 testcases := []struct {
1495 name string
1496 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001497 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001498 shouldLink string
1499 shouldNotLink []string
1500 }{
1501 {
Jiyong Park55549df2021-02-26 23:57:23 +09001502 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001503 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001504 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001505 shouldLink: "current",
1506 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001507 },
1508 {
Jiyong Park55549df2021-02-26 23:57:23 +09001509 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001510 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001511 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001512 shouldLink: "current",
1513 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001514 },
1515 }
1516 for _, tc := range testcases {
1517 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001518 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001519 apex {
1520 name: "myapex",
1521 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001522 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001523 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001524 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001525 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001526
Jooyung Han61b66e92020-03-21 14:21:46 +00001527 apex_key {
1528 name: "myapex.key",
1529 public_key: "testkey.avbpubkey",
1530 private_key: "testkey.pem",
1531 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001532
Jooyung Han61b66e92020-03-21 14:21:46 +00001533 cc_library {
1534 name: "mylib",
1535 srcs: ["mylib.cpp"],
1536 vendor_available: true,
1537 shared_libs: ["libbar"],
1538 system_shared_libs: [],
1539 stl: "none",
1540 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001541 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001542 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001543
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 cc_library {
1545 name: "libbar",
1546 srcs: ["mylib.cpp"],
1547 system_shared_libs: [],
1548 stl: "none",
1549 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001550 llndk: {
1551 symbol_file: "libbar.map.txt",
1552 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001553 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001554 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001555 withUnbundledBuild,
1556 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001557
Jooyung Han61b66e92020-03-21 14:21:46 +00001558 // Ensure that LLNDK dep is not included
1559 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1560 "lib64/mylib.so",
1561 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 // Ensure that LLNDK dep is required
1564 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1565 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1566 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001567
Steven Moreland2c4000c2021-04-27 02:08:49 +00001568 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1569 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001571 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001573
Steven Moreland2c4000c2021-04-27 02:08:49 +00001574 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001575 ver := tc.shouldLink
1576 if tc.shouldLink == "current" {
1577 ver = strconv.Itoa(android.FutureApiLevelInt)
1578 }
1579 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001580 })
1581 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001582}
1583
Jiyong Park25fc6a92018-11-18 18:02:45 +09001584func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001585 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586 apex {
1587 name: "myapex",
1588 key: "myapex.key",
1589 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001590 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001591 }
1592
1593 apex_key {
1594 name: "myapex.key",
1595 public_key: "testkey.avbpubkey",
1596 private_key: "testkey.pem",
1597 }
1598
1599 cc_library {
1600 name: "mylib",
1601 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001602 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001603 shared_libs: ["libdl#27"],
1604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001605 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001606 }
1607
1608 cc_library_shared {
1609 name: "mylib_shared",
1610 srcs: ["mylib.cpp"],
1611 shared_libs: ["libdl#27"],
1612 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001613 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001614 }
1615
1616 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001617 name: "libBootstrap",
1618 srcs: ["mylib.cpp"],
1619 stl: "none",
1620 bootstrap: true,
1621 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622 `)
1623
Sundong Ahnabb64432019-10-22 13:58:29 +09001624 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001625 copyCmds := apexRule.Args["copy_commands"]
1626
1627 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001628 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001629 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1630 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001631
1632 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001633 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001634
Colin Crossaede88c2020-08-11 12:17:01 -07001635 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1636 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1637 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001638
1639 // For dependency to libc
1640 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001641 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001642 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001643 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001645 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1646 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001647
1648 // For dependency to libm
1649 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001650 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001652 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001653 // ... and is not compiling with the stub
1654 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1655 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1656
1657 // For dependency to libdl
1658 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001659 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001661 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1662 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001664 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665 // ... Cflags from stub is correctly exported to mylib
1666 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1667 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001668
1669 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001670 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1671 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1672 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1673 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001675
Jooyung Han749dc692020-04-15 11:03:39 +09001676func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001677 // there are three links between liba --> libz.
1678 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001679 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001680 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001681 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001682 apex {
1683 name: "myapex",
1684 key: "myapex.key",
1685 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001686 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001687 }
1688
1689 apex {
1690 name: "otherapex",
1691 key: "myapex.key",
1692 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001693 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001694 }
1695
1696 apex_key {
1697 name: "myapex.key",
1698 public_key: "testkey.avbpubkey",
1699 private_key: "testkey.pem",
1700 }
1701
1702 cc_library {
1703 name: "libx",
1704 shared_libs: ["liba"],
1705 system_shared_libs: [],
1706 stl: "none",
1707 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001708 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001709 }
1710
1711 cc_library {
1712 name: "liby",
1713 shared_libs: ["liba"],
1714 system_shared_libs: [],
1715 stl: "none",
1716 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001717 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001718 }
1719
1720 cc_library {
1721 name: "liba",
1722 shared_libs: ["libz"],
1723 system_shared_libs: [],
1724 stl: "none",
1725 apex_available: [
1726 "//apex_available:anyapex",
1727 "//apex_available:platform",
1728 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001729 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001730 }
1731
1732 cc_library {
1733 name: "libz",
1734 system_shared_libs: [],
1735 stl: "none",
1736 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001737 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001738 },
1739 }
Jooyung Han749dc692020-04-15 11:03:39 +09001740 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001741
1742 expectLink := func(from, from_variant, to, to_variant string) {
1743 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1744 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1745 }
1746 expectNoLink := func(from, from_variant, to, to_variant string) {
1747 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1748 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1749 }
1750 // platform liba is linked to non-stub version
1751 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001752 // liba in myapex is linked to current
1753 expectLink("liba", "shared_apex29", "libz", "shared_current")
1754 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001755 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001756 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001757 // liba in otherapex is linked to current
1758 expectLink("liba", "shared_apex30", "libz", "shared_current")
1759 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001760 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1761 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001762}
1763
Jooyung Hanaed150d2020-04-02 01:41:41 +09001764func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["libx"],
1770 min_sdk_version: "R",
1771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "libx",
1781 shared_libs: ["libz"],
1782 system_shared_libs: [],
1783 stl: "none",
1784 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001785 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001786 }
1787
1788 cc_library {
1789 name: "libz",
1790 system_shared_libs: [],
1791 stl: "none",
1792 stubs: {
1793 versions: ["29", "R"],
1794 },
1795 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001796 `,
1797 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1798 variables.Platform_version_active_codenames = []string{"R"}
1799 }),
1800 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001801
1802 expectLink := func(from, from_variant, to, to_variant string) {
1803 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1804 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1805 }
1806 expectNoLink := func(from, from_variant, to, to_variant string) {
1807 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1808 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1809 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001810 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1811 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001812 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1813 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001814}
1815
Jooyung Han4c4da062021-06-23 10:23:16 +09001816func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1817 testApex(t, `
1818 apex {
1819 name: "myapex",
1820 key: "myapex.key",
1821 java_libs: ["libx"],
1822 min_sdk_version: "S",
1823 }
1824
1825 apex_key {
1826 name: "myapex.key",
1827 public_key: "testkey.avbpubkey",
1828 private_key: "testkey.pem",
1829 }
1830
1831 java_library {
1832 name: "libx",
1833 srcs: ["a.java"],
1834 apex_available: [ "myapex" ],
1835 sdk_version: "current",
1836 min_sdk_version: "S", // should be okay
1837 }
1838 `,
1839 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1840 variables.Platform_version_active_codenames = []string{"S"}
1841 variables.Platform_sdk_codename = proptools.StringPtr("S")
1842 }),
1843 )
1844}
1845
Jooyung Han749dc692020-04-15 11:03:39 +09001846func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001847 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001852 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 cc_library {
1862 name: "libx",
1863 shared_libs: ["libz"],
1864 system_shared_libs: [],
1865 stl: "none",
1866 apex_available: [ "myapex" ],
1867 }
1868
1869 cc_library {
1870 name: "libz",
1871 system_shared_libs: [],
1872 stl: "none",
1873 stubs: {
1874 versions: ["1", "2"],
1875 },
1876 }
1877 `)
1878
1879 expectLink := func(from, from_variant, to, to_variant string) {
1880 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1881 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1882 }
1883 expectNoLink := func(from, from_variant, to, to_variant string) {
1884 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1885 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1886 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001887 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001888 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001889 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001890 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001891}
1892
Jiyong Park5df7bd32021-08-25 16:18:46 +09001893func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1894 ctx := testApex(t, `
1895 apex {
1896 name: "myapex",
1897 key: "myapex.key",
1898 native_shared_libs: ["mylib"],
1899 updatable: false,
1900 vendor: true,
1901 min_sdk_version: "29",
1902 }
1903
1904 apex_key {
1905 name: "myapex.key",
1906 public_key: "testkey.avbpubkey",
1907 private_key: "testkey.pem",
1908 }
1909
1910 cc_library {
1911 name: "mylib",
1912 vendor_available: true,
1913 system_shared_libs: [],
1914 stl: "none",
1915 apex_available: [ "myapex" ],
1916 min_sdk_version: "29",
1917 }
1918 `)
1919
1920 vendorVariant := "android_vendor.29_arm64_armv8-a"
1921
1922 // First check that the correct variant of crtbegin_so is used.
1923 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1924 crtBegin := names(ldRule.Args["crtBegin"])
1925 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1926
1927 // Ensure that the crtbegin_so used by the APEX is targeting 29
1928 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1929 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1930}
1931
Jooyung Han03b51852020-02-26 22:45:42 +09001932func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001933 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001934 apex {
1935 name: "myapex",
1936 key: "myapex.key",
1937 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001938 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001939 }
1940
1941 apex_key {
1942 name: "myapex.key",
1943 public_key: "testkey.avbpubkey",
1944 private_key: "testkey.pem",
1945 }
1946
1947 cc_library {
1948 name: "libx",
1949 system_shared_libs: [],
1950 stl: "none",
1951 apex_available: [ "myapex" ],
1952 stubs: {
1953 versions: ["1", "2"],
1954 },
1955 }
1956
1957 cc_library {
1958 name: "libz",
1959 shared_libs: ["libx"],
1960 system_shared_libs: [],
1961 stl: "none",
1962 }
1963 `)
1964
1965 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001966 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001967 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1968 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1969 }
1970 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001971 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001972 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1973 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1974 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001975 expectLink("libz", "shared", "libx", "shared_current")
1976 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001977 expectNoLink("libz", "shared", "libz", "shared_1")
1978 expectNoLink("libz", "shared", "libz", "shared")
1979}
1980
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001981var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1982 func(variables android.FixtureProductVariables) {
1983 variables.SanitizeDevice = []string{"hwaddress"}
1984 },
1985)
1986
Jooyung Han75568392020-03-20 04:29:24 +09001987func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001988 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001989 apex {
1990 name: "myapex",
1991 key: "myapex.key",
1992 native_shared_libs: ["libx"],
1993 min_sdk_version: "29",
1994 }
1995
1996 apex_key {
1997 name: "myapex.key",
1998 public_key: "testkey.avbpubkey",
1999 private_key: "testkey.pem",
2000 }
2001
2002 cc_library {
2003 name: "libx",
2004 shared_libs: ["libbar"],
2005 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002006 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002007 }
2008
2009 cc_library {
2010 name: "libbar",
2011 stubs: {
2012 versions: ["29", "30"],
2013 },
2014 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002015 `,
2016 prepareForTestWithSantitizeHwaddress,
2017 )
Jooyung Han03b51852020-02-26 22:45:42 +09002018 expectLink := func(from, from_variant, to, to_variant string) {
2019 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2020 libFlags := ld.Args["libFlags"]
2021 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2022 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002023 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002024}
2025
Jooyung Han75568392020-03-20 04:29:24 +09002026func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002027 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002028 apex {
2029 name: "myapex",
2030 key: "myapex.key",
2031 native_shared_libs: ["libx"],
2032 min_sdk_version: "29",
2033 }
2034
2035 apex_key {
2036 name: "myapex.key",
2037 public_key: "testkey.avbpubkey",
2038 private_key: "testkey.pem",
2039 }
2040
2041 cc_library {
2042 name: "libx",
2043 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002044 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002045 }
Jooyung Han75568392020-03-20 04:29:24 +09002046 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002047
2048 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002049 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002050 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002051 // note that platform variant is not.
2052 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002053 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002054}
2055
Jooyung Han749dc692020-04-15 11:03:39 +09002056func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2057 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002058 apex {
2059 name: "myapex",
2060 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002061 native_shared_libs: ["mylib"],
2062 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002063 }
2064
2065 apex_key {
2066 name: "myapex.key",
2067 public_key: "testkey.avbpubkey",
2068 private_key: "testkey.pem",
2069 }
Jooyung Han749dc692020-04-15 11:03:39 +09002070
2071 cc_library {
2072 name: "mylib",
2073 srcs: ["mylib.cpp"],
2074 system_shared_libs: [],
2075 stl: "none",
2076 apex_available: [
2077 "myapex",
2078 ],
2079 min_sdk_version: "30",
2080 }
2081 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002082
2083 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2084 apex {
2085 name: "myapex",
2086 key: "myapex.key",
2087 native_shared_libs: ["libfoo.ffi"],
2088 min_sdk_version: "29",
2089 }
2090
2091 apex_key {
2092 name: "myapex.key",
2093 public_key: "testkey.avbpubkey",
2094 private_key: "testkey.pem",
2095 }
2096
2097 rust_ffi_shared {
2098 name: "libfoo.ffi",
2099 srcs: ["foo.rs"],
2100 crate_name: "foo",
2101 apex_available: [
2102 "myapex",
2103 ],
2104 min_sdk_version: "30",
2105 }
2106 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002107
2108 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2109 apex {
2110 name: "myapex",
2111 key: "myapex.key",
2112 java_libs: ["libfoo"],
2113 min_sdk_version: "29",
2114 }
2115
2116 apex_key {
2117 name: "myapex.key",
2118 public_key: "testkey.avbpubkey",
2119 private_key: "testkey.pem",
2120 }
2121
2122 java_import {
2123 name: "libfoo",
2124 jars: ["libfoo.jar"],
2125 apex_available: [
2126 "myapex",
2127 ],
2128 min_sdk_version: "30",
2129 }
2130 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002131}
2132
2133func TestApexMinSdkVersion_Okay(t *testing.T) {
2134 testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 native_shared_libs: ["libfoo"],
2139 java_libs: ["libbar"],
2140 min_sdk_version: "29",
2141 }
2142
2143 apex_key {
2144 name: "myapex.key",
2145 public_key: "testkey.avbpubkey",
2146 private_key: "testkey.pem",
2147 }
2148
2149 cc_library {
2150 name: "libfoo",
2151 srcs: ["mylib.cpp"],
2152 shared_libs: ["libfoo_dep"],
2153 apex_available: ["myapex"],
2154 min_sdk_version: "29",
2155 }
2156
2157 cc_library {
2158 name: "libfoo_dep",
2159 srcs: ["mylib.cpp"],
2160 apex_available: ["myapex"],
2161 min_sdk_version: "29",
2162 }
2163
2164 java_library {
2165 name: "libbar",
2166 sdk_version: "current",
2167 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002168 static_libs: [
2169 "libbar_dep",
2170 "libbar_import_dep",
2171 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002172 apex_available: ["myapex"],
2173 min_sdk_version: "29",
2174 }
2175
2176 java_library {
2177 name: "libbar_dep",
2178 sdk_version: "current",
2179 srcs: ["a.java"],
2180 apex_available: ["myapex"],
2181 min_sdk_version: "29",
2182 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002183
2184 java_import {
2185 name: "libbar_import_dep",
2186 jars: ["libbar.jar"],
2187 apex_available: ["myapex"],
2188 min_sdk_version: "29",
2189 }
Jooyung Han03b51852020-02-26 22:45:42 +09002190 `)
2191}
2192
Colin Cross8ca61c12022-10-06 21:00:14 -07002193func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2194 // Tests that an apex dependency with min_sdk_version higher than the
2195 // min_sdk_version of the apex is allowed as long as the dependency's
2196 // min_sdk_version is less than or equal to the api level that the
2197 // architecture was introduced in. In this case, arm64 didn't exist
2198 // until api level 21, so the arm64 code will never need to run on
2199 // an api level 20 device, even if other architectures of the apex
2200 // will.
2201 testApex(t, `
2202 apex {
2203 name: "myapex",
2204 key: "myapex.key",
2205 native_shared_libs: ["libfoo"],
2206 min_sdk_version: "20",
2207 }
2208
2209 apex_key {
2210 name: "myapex.key",
2211 public_key: "testkey.avbpubkey",
2212 private_key: "testkey.pem",
2213 }
2214
2215 cc_library {
2216 name: "libfoo",
2217 srcs: ["mylib.cpp"],
2218 apex_available: ["myapex"],
2219 min_sdk_version: "21",
2220 stl: "none",
2221 }
2222 `)
2223}
2224
Artur Satayev8cf899a2020-04-15 17:29:42 +01002225func TestJavaStableSdkVersion(t *testing.T) {
2226 testCases := []struct {
2227 name string
2228 expectedError string
2229 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002230 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002231 }{
2232 {
2233 name: "Non-updatable apex with non-stable dep",
2234 bp: `
2235 apex {
2236 name: "myapex",
2237 java_libs: ["myjar"],
2238 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002239 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002240 }
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246 java_library {
2247 name: "myjar",
2248 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002249 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002250 apex_available: ["myapex"],
2251 }
2252 `,
2253 },
2254 {
2255 name: "Updatable apex with stable dep",
2256 bp: `
2257 apex {
2258 name: "myapex",
2259 java_libs: ["myjar"],
2260 key: "myapex.key",
2261 updatable: true,
2262 min_sdk_version: "29",
2263 }
2264 apex_key {
2265 name: "myapex.key",
2266 public_key: "testkey.avbpubkey",
2267 private_key: "testkey.pem",
2268 }
2269 java_library {
2270 name: "myjar",
2271 srcs: ["foo/bar/MyClass.java"],
2272 sdk_version: "current",
2273 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002274 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002275 }
2276 `,
2277 },
2278 {
2279 name: "Updatable apex with non-stable dep",
2280 expectedError: "cannot depend on \"myjar\"",
2281 bp: `
2282 apex {
2283 name: "myapex",
2284 java_libs: ["myjar"],
2285 key: "myapex.key",
2286 updatable: true,
2287 }
2288 apex_key {
2289 name: "myapex.key",
2290 public_key: "testkey.avbpubkey",
2291 private_key: "testkey.pem",
2292 }
2293 java_library {
2294 name: "myjar",
2295 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002296 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002297 apex_available: ["myapex"],
2298 }
2299 `,
2300 },
2301 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002302 name: "Updatable apex with non-stable legacy core platform dep",
2303 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2304 bp: `
2305 apex {
2306 name: "myapex",
2307 java_libs: ["myjar-uses-legacy"],
2308 key: "myapex.key",
2309 updatable: true,
2310 }
2311 apex_key {
2312 name: "myapex.key",
2313 public_key: "testkey.avbpubkey",
2314 private_key: "testkey.pem",
2315 }
2316 java_library {
2317 name: "myjar-uses-legacy",
2318 srcs: ["foo/bar/MyClass.java"],
2319 sdk_version: "core_platform",
2320 apex_available: ["myapex"],
2321 }
2322 `,
2323 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2324 },
2325 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002326 name: "Updatable apex with non-stable transitive dep",
2327 // This is not actually detecting that the transitive dependency is unstable, rather it is
2328 // detecting that the transitive dependency is building against a wider API surface than the
2329 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002330 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002331 bp: `
2332 apex {
2333 name: "myapex",
2334 java_libs: ["myjar"],
2335 key: "myapex.key",
2336 updatable: true,
2337 }
2338 apex_key {
2339 name: "myapex.key",
2340 public_key: "testkey.avbpubkey",
2341 private_key: "testkey.pem",
2342 }
2343 java_library {
2344 name: "myjar",
2345 srcs: ["foo/bar/MyClass.java"],
2346 sdk_version: "current",
2347 apex_available: ["myapex"],
2348 static_libs: ["transitive-jar"],
2349 }
2350 java_library {
2351 name: "transitive-jar",
2352 srcs: ["foo/bar/MyClass.java"],
2353 sdk_version: "core_platform",
2354 apex_available: ["myapex"],
2355 }
2356 `,
2357 },
2358 }
2359
2360 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002361 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2362 continue
2363 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002364 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002365 errorHandler := android.FixtureExpectsNoErrors
2366 if test.expectedError != "" {
2367 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002368 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002369 android.GroupFixturePreparers(
2370 java.PrepareForTestWithJavaDefaultModules,
2371 PrepareForTestWithApexBuildComponents,
2372 prepareForTestWithMyapex,
2373 android.OptionalFixturePreparer(test.preparer),
2374 ).
2375 ExtendWithErrorHandler(errorHandler).
2376 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002377 })
2378 }
2379}
2380
Jooyung Han749dc692020-04-15 11:03:39 +09002381func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2382 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2383 apex {
2384 name: "myapex",
2385 key: "myapex.key",
2386 native_shared_libs: ["mylib"],
2387 min_sdk_version: "29",
2388 }
2389
2390 apex_key {
2391 name: "myapex.key",
2392 public_key: "testkey.avbpubkey",
2393 private_key: "testkey.pem",
2394 }
2395
2396 cc_library {
2397 name: "mylib",
2398 srcs: ["mylib.cpp"],
2399 shared_libs: ["mylib2"],
2400 system_shared_libs: [],
2401 stl: "none",
2402 apex_available: [
2403 "myapex",
2404 ],
2405 min_sdk_version: "29",
2406 }
2407
2408 // indirect part of the apex
2409 cc_library {
2410 name: "mylib2",
2411 srcs: ["mylib.cpp"],
2412 system_shared_libs: [],
2413 stl: "none",
2414 apex_available: [
2415 "myapex",
2416 ],
2417 min_sdk_version: "30",
2418 }
2419 `)
2420}
2421
2422func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2423 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2424 apex {
2425 name: "myapex",
2426 key: "myapex.key",
2427 apps: ["AppFoo"],
2428 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002429 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002430 }
2431
2432 apex_key {
2433 name: "myapex.key",
2434 public_key: "testkey.avbpubkey",
2435 private_key: "testkey.pem",
2436 }
2437
2438 android_app {
2439 name: "AppFoo",
2440 srcs: ["foo/bar/MyClass.java"],
2441 sdk_version: "current",
2442 min_sdk_version: "29",
2443 system_modules: "none",
2444 stl: "none",
2445 static_libs: ["bar"],
2446 apex_available: [ "myapex" ],
2447 }
2448
2449 java_library {
2450 name: "bar",
2451 sdk_version: "current",
2452 srcs: ["a.java"],
2453 apex_available: [ "myapex" ],
2454 }
2455 `)
2456}
2457
2458func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002459 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002460 apex {
2461 name: "myapex",
2462 key: "myapex.key",
2463 native_shared_libs: ["mylib"],
2464 min_sdk_version: "29",
2465 }
2466
2467 apex_key {
2468 name: "myapex.key",
2469 public_key: "testkey.avbpubkey",
2470 private_key: "testkey.pem",
2471 }
2472
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002473 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002474 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2475 cc_library {
2476 name: "mylib",
2477 srcs: ["mylib.cpp"],
2478 shared_libs: ["mylib2"],
2479 system_shared_libs: [],
2480 stl: "none",
2481 apex_available: ["myapex", "otherapex"],
2482 min_sdk_version: "29",
2483 }
2484
2485 cc_library {
2486 name: "mylib2",
2487 srcs: ["mylib.cpp"],
2488 system_shared_libs: [],
2489 stl: "none",
2490 apex_available: ["otherapex"],
2491 stubs: { versions: ["29", "30"] },
2492 min_sdk_version: "30",
2493 }
2494
2495 apex {
2496 name: "otherapex",
2497 key: "myapex.key",
2498 native_shared_libs: ["mylib", "mylib2"],
2499 min_sdk_version: "30",
2500 }
2501 `)
2502 expectLink := func(from, from_variant, to, to_variant string) {
2503 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2504 libFlags := ld.Args["libFlags"]
2505 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2506 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002507 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002508 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002509}
2510
Jooyung Haned124c32021-01-26 11:43:46 +09002511func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002512 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2513 func(variables android.FixtureProductVariables) {
2514 variables.Platform_sdk_codename = proptools.StringPtr("S")
2515 variables.Platform_version_active_codenames = []string{"S"}
2516 },
2517 )
Jooyung Haned124c32021-01-26 11:43:46 +09002518 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2519 apex {
2520 name: "myapex",
2521 key: "myapex.key",
2522 native_shared_libs: ["libfoo"],
2523 min_sdk_version: "S",
2524 }
2525 apex_key {
2526 name: "myapex.key",
2527 public_key: "testkey.avbpubkey",
2528 private_key: "testkey.pem",
2529 }
2530 cc_library {
2531 name: "libfoo",
2532 shared_libs: ["libbar"],
2533 apex_available: ["myapex"],
2534 min_sdk_version: "29",
2535 }
2536 cc_library {
2537 name: "libbar",
2538 apex_available: ["myapex"],
2539 }
2540 `, withSAsActiveCodeNames)
2541}
2542
2543func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002544 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2545 variables.Platform_sdk_codename = proptools.StringPtr("S")
2546 variables.Platform_version_active_codenames = []string{"S", "T"}
2547 })
Colin Cross1c460562021-02-16 17:55:47 -08002548 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002549 apex {
2550 name: "myapex",
2551 key: "myapex.key",
2552 native_shared_libs: ["libfoo"],
2553 min_sdk_version: "S",
2554 }
2555 apex_key {
2556 name: "myapex.key",
2557 public_key: "testkey.avbpubkey",
2558 private_key: "testkey.pem",
2559 }
2560 cc_library {
2561 name: "libfoo",
2562 shared_libs: ["libbar"],
2563 apex_available: ["myapex"],
2564 min_sdk_version: "S",
2565 }
2566 cc_library {
2567 name: "libbar",
2568 stubs: {
2569 symbol_file: "libbar.map.txt",
2570 versions: ["30", "S", "T"],
2571 },
2572 }
2573 `, withSAsActiveCodeNames)
2574
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002575 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002576 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2577 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002578 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002579}
2580
Jiyong Park7c2ee712018-12-07 00:42:25 +09002581func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002582 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002583 apex {
2584 name: "myapex",
2585 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002586 native_shared_libs: ["mylib"],
2587 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002588 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002589 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002590 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002591 }
2592
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598
2599 prebuilt_etc {
2600 name: "myetc",
2601 src: "myprebuilt",
2602 sub_dir: "foo/bar",
2603 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002604
2605 cc_library {
2606 name: "mylib",
2607 srcs: ["mylib.cpp"],
2608 relative_install_path: "foo/bar",
2609 system_shared_libs: [],
2610 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002611 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002612 }
2613
2614 cc_binary {
2615 name: "mybin",
2616 srcs: ["mylib.cpp"],
2617 relative_install_path: "foo/bar",
2618 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002619 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002620 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002621 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002622 `)
2623
Sundong Ahnabb64432019-10-22 13:58:29 +09002624 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002625 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002626
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002627 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002628 ensureContains(t, cmd, "/etc ")
2629 ensureContains(t, cmd, "/etc/foo ")
2630 ensureContains(t, cmd, "/etc/foo/bar ")
2631 ensureContains(t, cmd, "/lib64 ")
2632 ensureContains(t, cmd, "/lib64/foo ")
2633 ensureContains(t, cmd, "/lib64/foo/bar ")
2634 ensureContains(t, cmd, "/lib ")
2635 ensureContains(t, cmd, "/lib/foo ")
2636 ensureContains(t, cmd, "/lib/foo/bar ")
2637 ensureContains(t, cmd, "/bin ")
2638 ensureContains(t, cmd, "/bin/foo ")
2639 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002640}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002641
Jooyung Han35155c42020-02-06 17:33:20 +09002642func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002643 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002644 apex {
2645 name: "myapex",
2646 key: "myapex.key",
2647 multilib: {
2648 both: {
2649 native_shared_libs: ["mylib"],
2650 binaries: ["mybin"],
2651 },
2652 },
2653 compile_multilib: "both",
2654 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002655 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002656 }
2657
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663
2664 cc_library {
2665 name: "mylib",
2666 relative_install_path: "foo/bar",
2667 system_shared_libs: [],
2668 stl: "none",
2669 apex_available: [ "myapex" ],
2670 native_bridge_supported: true,
2671 }
2672
2673 cc_binary {
2674 name: "mybin",
2675 relative_install_path: "foo/bar",
2676 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002677 stl: "none",
2678 apex_available: [ "myapex" ],
2679 native_bridge_supported: true,
2680 compile_multilib: "both", // default is "first" for binary
2681 multilib: {
2682 lib64: {
2683 suffix: "64",
2684 },
2685 },
2686 }
2687 `, withNativeBridgeEnabled)
2688 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2689 "bin/foo/bar/mybin",
2690 "bin/foo/bar/mybin64",
2691 "bin/arm/foo/bar/mybin",
2692 "bin/arm64/foo/bar/mybin64",
2693 "lib/foo/bar/mylib.so",
2694 "lib/arm/foo/bar/mylib.so",
2695 "lib64/foo/bar/mylib.so",
2696 "lib64/arm64/foo/bar/mylib.so",
2697 })
2698}
2699
Jooyung Han85d61762020-06-24 23:50:26 +09002700func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002701 result := android.GroupFixturePreparers(
2702 prepareForApexTest,
2703 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2704 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002705 apex {
2706 name: "myapex",
2707 key: "myapex.key",
2708 binaries: ["mybin"],
2709 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002710 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002711 }
2712 apex_key {
2713 name: "myapex.key",
2714 public_key: "testkey.avbpubkey",
2715 private_key: "testkey.pem",
2716 }
2717 cc_binary {
2718 name: "mybin",
2719 vendor: true,
2720 shared_libs: ["libfoo"],
2721 }
2722 cc_library {
2723 name: "libfoo",
2724 proprietary: true,
2725 }
2726 `)
2727
Colin Crossc68db4b2021-11-11 18:59:15 -08002728 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002729 "bin/mybin",
2730 "lib64/libfoo.so",
2731 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2732 "lib64/libc++.so",
2733 })
2734
Colin Crossc68db4b2021-11-11 18:59:15 -08002735 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2736 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002737 name := apexBundle.BaseModuleName()
2738 prefix := "TARGET_"
2739 var builder strings.Builder
2740 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002741 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002742 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002743 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002744
Colin Crossc68db4b2021-11-11 18:59:15 -08002745 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002746 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2747 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002748}
2749
Jooyung Hanc5a96762022-02-04 11:54:50 +09002750func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2751 testApexError(t, `Trying to include a VNDK library`, `
2752 apex {
2753 name: "myapex",
2754 key: "myapex.key",
2755 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2756 vendor: true,
2757 use_vndk_as_stable: true,
2758 updatable: false,
2759 }
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }`)
2765}
2766
Jooyung Handf78e212020-07-22 15:54:47 +09002767func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002768 // myapex myapex2
2769 // | |
2770 // mybin ------. mybin2
2771 // \ \ / |
2772 // (stable) .---\--------` |
2773 // \ / \ |
2774 // \ / \ /
2775 // libvndk libvendor
2776 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002777 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002778 apex {
2779 name: "myapex",
2780 key: "myapex.key",
2781 binaries: ["mybin"],
2782 vendor: true,
2783 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002784 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002785 }
2786 apex_key {
2787 name: "myapex.key",
2788 public_key: "testkey.avbpubkey",
2789 private_key: "testkey.pem",
2790 }
2791 cc_binary {
2792 name: "mybin",
2793 vendor: true,
2794 shared_libs: ["libvndk", "libvendor"],
2795 }
2796 cc_library {
2797 name: "libvndk",
2798 vndk: {
2799 enabled: true,
2800 },
2801 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002802 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002803 }
2804 cc_library {
2805 name: "libvendor",
2806 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002807 stl: "none",
2808 }
2809 apex {
2810 name: "myapex2",
2811 key: "myapex.key",
2812 binaries: ["mybin2"],
2813 vendor: true,
2814 use_vndk_as_stable: false,
2815 updatable: false,
2816 }
2817 cc_binary {
2818 name: "mybin2",
2819 vendor: true,
2820 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002821 }
2822 `)
2823
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002824 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002825
Jooyung Han91f92032022-02-04 12:36:33 +09002826 for _, tc := range []struct {
2827 name string
2828 apexName string
2829 moduleName string
2830 moduleVariant string
2831 libs []string
2832 contents []string
2833 requireVndkNamespace bool
2834 }{
2835 {
2836 name: "use_vndk_as_stable",
2837 apexName: "myapex",
2838 moduleName: "mybin",
2839 moduleVariant: vendorVariant + "_apex10000",
2840 libs: []string{
2841 // should link with vendor variants of VNDK libs(libvndk/libc++)
2842 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2843 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2844 // unstable Vendor libs as APEX variant
2845 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2846 },
2847 contents: []string{
2848 "bin/mybin",
2849 "lib64/libvendor.so",
2850 // VNDK libs (libvndk/libc++) are not included
2851 },
2852 requireVndkNamespace: true,
2853 },
2854 {
2855 name: "!use_vndk_as_stable",
2856 apexName: "myapex2",
2857 moduleName: "mybin2",
2858 moduleVariant: vendorVariant + "_myapex2",
2859 libs: []string{
2860 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2861 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2862 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2863 // unstable vendor libs have "merged" APEX variants
2864 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2865 },
2866 contents: []string{
2867 "bin/mybin2",
2868 "lib64/libvendor.so",
2869 // VNDK libs are included as well
2870 "lib64/libvndk.so",
2871 "lib64/libc++.so",
2872 },
2873 requireVndkNamespace: false,
2874 },
2875 } {
2876 t.Run(tc.name, func(t *testing.T) {
2877 // Check linked libs
2878 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2879 libs := names(ldRule.Args["libFlags"])
2880 for _, lib := range tc.libs {
2881 ensureListContains(t, libs, lib)
2882 }
2883 // Check apex contents
2884 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002885
Jooyung Han91f92032022-02-04 12:36:33 +09002886 // Check "requireNativeLibs"
2887 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2888 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2889 if tc.requireVndkNamespace {
2890 ensureListContains(t, requireNativeLibs, ":vndk")
2891 } else {
2892 ensureListNotContains(t, requireNativeLibs, ":vndk")
2893 }
2894 })
2895 }
Jooyung Handf78e212020-07-22 15:54:47 +09002896}
2897
Justin Yun13decfb2021-03-08 19:25:55 +09002898func TestProductVariant(t *testing.T) {
2899 ctx := testApex(t, `
2900 apex {
2901 name: "myapex",
2902 key: "myapex.key",
2903 updatable: false,
2904 product_specific: true,
2905 binaries: ["foo"],
2906 }
2907
2908 apex_key {
2909 name: "myapex.key",
2910 public_key: "testkey.avbpubkey",
2911 private_key: "testkey.pem",
2912 }
2913
2914 cc_binary {
2915 name: "foo",
2916 product_available: true,
2917 apex_available: ["myapex"],
2918 srcs: ["foo.cpp"],
2919 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002920 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2921 variables.ProductVndkVersion = proptools.StringPtr("current")
2922 }),
2923 )
Justin Yun13decfb2021-03-08 19:25:55 +09002924
2925 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002926 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002927 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2928 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2929 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2930 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2931}
2932
Jooyung Han8e5685d2020-09-21 11:02:57 +09002933func TestApex_withPrebuiltFirmware(t *testing.T) {
2934 testCases := []struct {
2935 name string
2936 additionalProp string
2937 }{
2938 {"system apex with prebuilt_firmware", ""},
2939 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2940 }
2941 for _, tc := range testCases {
2942 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002943 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002944 apex {
2945 name: "myapex",
2946 key: "myapex.key",
2947 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002948 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002949 `+tc.additionalProp+`
2950 }
2951 apex_key {
2952 name: "myapex.key",
2953 public_key: "testkey.avbpubkey",
2954 private_key: "testkey.pem",
2955 }
2956 prebuilt_firmware {
2957 name: "myfirmware",
2958 src: "myfirmware.bin",
2959 filename_from_src: true,
2960 `+tc.additionalProp+`
2961 }
2962 `)
2963 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2964 "etc/firmware/myfirmware.bin",
2965 })
2966 })
2967 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002968}
2969
Jooyung Hanefb184e2020-06-25 17:14:25 +09002970func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002971 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002972 apex {
2973 name: "myapex",
2974 key: "myapex.key",
2975 vendor: true,
2976 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002977 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002978 }
2979
2980 apex_key {
2981 name: "myapex.key",
2982 public_key: "testkey.avbpubkey",
2983 private_key: "testkey.pem",
2984 }
2985
2986 cc_library {
2987 name: "mylib",
2988 vendor_available: true,
2989 }
2990 `)
2991
2992 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002993 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002994 name := apexBundle.BaseModuleName()
2995 prefix := "TARGET_"
2996 var builder strings.Builder
2997 data.Custom(&builder, name, prefix, "", data)
2998 androidMk := builder.String()
2999 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
3000}
3001
Jooyung Han2ed99d02020-06-24 23:26:26 +09003002func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003003 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003004 apex {
3005 name: "myapex",
3006 key: "myapex.key",
3007 vintf_fragments: ["fragment.xml"],
3008 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003009 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003010 }
3011 apex_key {
3012 name: "myapex.key",
3013 public_key: "testkey.avbpubkey",
3014 private_key: "testkey.pem",
3015 }
3016 cc_binary {
3017 name: "mybin",
3018 }
3019 `)
3020
3021 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003022 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003023 name := apexBundle.BaseModuleName()
3024 prefix := "TARGET_"
3025 var builder strings.Builder
3026 data.Custom(&builder, name, prefix, "", data)
3027 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003028 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003029 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003030}
3031
Jiyong Park16e91a02018-12-20 18:18:08 +09003032func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003033 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003034 apex {
3035 name: "myapex",
3036 key: "myapex.key",
3037 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003038 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003039 }
3040
3041 apex_key {
3042 name: "myapex.key",
3043 public_key: "testkey.avbpubkey",
3044 private_key: "testkey.pem",
3045 }
3046
3047 cc_library {
3048 name: "mylib",
3049 srcs: ["mylib.cpp"],
3050 system_shared_libs: [],
3051 stl: "none",
3052 stubs: {
3053 versions: ["1", "2", "3"],
3054 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003055 apex_available: [
3056 "//apex_available:platform",
3057 "myapex",
3058 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003059 }
3060
3061 cc_binary {
3062 name: "not_in_apex",
3063 srcs: ["mylib.cpp"],
3064 static_libs: ["mylib"],
3065 static_executable: true,
3066 system_shared_libs: [],
3067 stl: "none",
3068 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003069 `)
3070
Colin Cross7113d202019-11-20 16:39:12 -08003071 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003072
3073 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003074 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003075}
Jiyong Park9335a262018-12-24 11:31:58 +09003076
3077func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003078 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003079 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003080 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003081 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003082 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003083 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003084 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003085 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003086 }
3087
3088 cc_library {
3089 name: "mylib",
3090 srcs: ["mylib.cpp"],
3091 system_shared_libs: [],
3092 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003093 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003094 }
3095
3096 apex_key {
3097 name: "myapex.key",
3098 public_key: "testkey.avbpubkey",
3099 private_key: "testkey.pem",
3100 }
3101
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003102 android_app_certificate {
3103 name: "myapex.certificate",
3104 certificate: "testkey",
3105 }
3106
3107 android_app_certificate {
3108 name: "myapex.certificate.override",
3109 certificate: "testkey.override",
3110 }
3111
Jiyong Park9335a262018-12-24 11:31:58 +09003112 `)
3113
3114 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003115 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003116
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003117 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3118 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003119 "vendor/foo/devkeys/testkey.avbpubkey")
3120 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003121 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3122 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003123 "vendor/foo/devkeys/testkey.pem")
3124 }
3125
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003126 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003127 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003128 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003129 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003130 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003131 }
3132}
Jiyong Park58e364a2019-01-19 19:24:06 +09003133
Jooyung Hanf121a652019-12-17 14:30:11 +09003134func TestCertificate(t *testing.T) {
3135 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003136 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003137 apex {
3138 name: "myapex",
3139 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003140 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003141 }
3142 apex_key {
3143 name: "myapex.key",
3144 public_key: "testkey.avbpubkey",
3145 private_key: "testkey.pem",
3146 }`)
3147 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3148 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3149 if actual := rule.Args["certificates"]; actual != expected {
3150 t.Errorf("certificates should be %q, not %q", expected, actual)
3151 }
3152 })
3153 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003154 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003155 apex {
3156 name: "myapex_keytest",
3157 key: "myapex.key",
3158 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003159 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003160 }
3161 apex_key {
3162 name: "myapex.key",
3163 public_key: "testkey.avbpubkey",
3164 private_key: "testkey.pem",
3165 }
3166 android_app_certificate {
3167 name: "myapex.certificate.override",
3168 certificate: "testkey.override",
3169 }`)
3170 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3171 expected := "testkey.override.x509.pem testkey.override.pk8"
3172 if actual := rule.Args["certificates"]; actual != expected {
3173 t.Errorf("certificates should be %q, not %q", expected, actual)
3174 }
3175 })
3176 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003177 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003178 apex {
3179 name: "myapex",
3180 key: "myapex.key",
3181 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003182 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003183 }
3184 apex_key {
3185 name: "myapex.key",
3186 public_key: "testkey.avbpubkey",
3187 private_key: "testkey.pem",
3188 }
3189 android_app_certificate {
3190 name: "myapex.certificate",
3191 certificate: "testkey",
3192 }`)
3193 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3194 expected := "testkey.x509.pem testkey.pk8"
3195 if actual := rule.Args["certificates"]; actual != expected {
3196 t.Errorf("certificates should be %q, not %q", expected, actual)
3197 }
3198 })
3199 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003200 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003201 apex {
3202 name: "myapex_keytest",
3203 key: "myapex.key",
3204 file_contexts: ":myapex-file_contexts",
3205 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003206 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003207 }
3208 apex_key {
3209 name: "myapex.key",
3210 public_key: "testkey.avbpubkey",
3211 private_key: "testkey.pem",
3212 }
3213 android_app_certificate {
3214 name: "myapex.certificate.override",
3215 certificate: "testkey.override",
3216 }`)
3217 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3218 expected := "testkey.override.x509.pem testkey.override.pk8"
3219 if actual := rule.Args["certificates"]; actual != expected {
3220 t.Errorf("certificates should be %q, not %q", expected, actual)
3221 }
3222 })
3223 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003224 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003225 apex {
3226 name: "myapex",
3227 key: "myapex.key",
3228 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003229 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003230 }
3231 apex_key {
3232 name: "myapex.key",
3233 public_key: "testkey.avbpubkey",
3234 private_key: "testkey.pem",
3235 }`)
3236 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3237 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3238 if actual := rule.Args["certificates"]; actual != expected {
3239 t.Errorf("certificates should be %q, not %q", expected, actual)
3240 }
3241 })
3242 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003243 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003244 apex {
3245 name: "myapex_keytest",
3246 key: "myapex.key",
3247 file_contexts: ":myapex-file_contexts",
3248 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003249 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003250 }
3251 apex_key {
3252 name: "myapex.key",
3253 public_key: "testkey.avbpubkey",
3254 private_key: "testkey.pem",
3255 }
3256 android_app_certificate {
3257 name: "myapex.certificate.override",
3258 certificate: "testkey.override",
3259 }`)
3260 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3261 expected := "testkey.override.x509.pem testkey.override.pk8"
3262 if actual := rule.Args["certificates"]; actual != expected {
3263 t.Errorf("certificates should be %q, not %q", expected, actual)
3264 }
3265 })
3266}
3267
Jiyong Park58e364a2019-01-19 19:24:06 +09003268func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003269 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003270 apex {
3271 name: "myapex",
3272 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003273 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003274 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003275 }
3276
3277 apex {
3278 name: "otherapex",
3279 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003280 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003281 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003282 }
3283
3284 apex_key {
3285 name: "myapex.key",
3286 public_key: "testkey.avbpubkey",
3287 private_key: "testkey.pem",
3288 }
3289
3290 cc_library {
3291 name: "mylib",
3292 srcs: ["mylib.cpp"],
3293 system_shared_libs: [],
3294 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003295 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003296 "myapex",
3297 "otherapex",
3298 ],
Jooyung Han24282772020-03-21 23:20:55 +09003299 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003300 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003301 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003302 cc_library {
3303 name: "mylib2",
3304 srcs: ["mylib.cpp"],
3305 system_shared_libs: [],
3306 stl: "none",
3307 apex_available: [
3308 "myapex",
3309 "otherapex",
3310 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003311 static_libs: ["mylib3"],
3312 recovery_available: true,
3313 min_sdk_version: "29",
3314 }
3315 cc_library {
3316 name: "mylib3",
3317 srcs: ["mylib.cpp"],
3318 system_shared_libs: [],
3319 stl: "none",
3320 apex_available: [
3321 "myapex",
3322 "otherapex",
3323 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003324 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003325 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003326 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003327 `)
3328
Jooyung Hanc87a0592020-03-02 17:44:33 +09003329 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003330 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003331 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003332 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003333
Jooyung Hanccce2f22020-03-07 03:45:53 +09003334 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003335 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003336 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003337 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003338
Jooyung Hanccce2f22020-03-07 03:45:53 +09003339 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003340 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003341 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003342 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003343
Colin Crossaede88c2020-08-11 12:17:01 -07003344 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3345 // each variant defines additional macros to distinguish which apex variant it is built for
3346
3347 // non-APEX variant does not have __ANDROID_APEX__ defined
3348 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3349 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3350
Dan Albertb19953d2020-11-17 15:29:36 -08003351 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003352 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3353 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003354 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003355
Jooyung Hanc87a0592020-03-02 17:44:33 +09003356 // non-APEX variant does not have __ANDROID_APEX__ defined
3357 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3358 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3359
Dan Albertb19953d2020-11-17 15:29:36 -08003360 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003361 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003362 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003363 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003364}
Jiyong Park7e636d02019-01-28 16:16:54 +09003365
3366func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003367 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003368 apex {
3369 name: "myapex",
3370 key: "myapex.key",
3371 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003372 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003373 }
3374
3375 apex_key {
3376 name: "myapex.key",
3377 public_key: "testkey.avbpubkey",
3378 private_key: "testkey.pem",
3379 }
3380
3381 cc_library_headers {
3382 name: "mylib_headers",
3383 export_include_dirs: ["my_include"],
3384 system_shared_libs: [],
3385 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003386 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003387 }
3388
3389 cc_library {
3390 name: "mylib",
3391 srcs: ["mylib.cpp"],
3392 system_shared_libs: [],
3393 stl: "none",
3394 header_libs: ["mylib_headers"],
3395 export_header_lib_headers: ["mylib_headers"],
3396 stubs: {
3397 versions: ["1", "2", "3"],
3398 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003399 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003400 }
3401
3402 cc_library {
3403 name: "otherlib",
3404 srcs: ["mylib.cpp"],
3405 system_shared_libs: [],
3406 stl: "none",
3407 shared_libs: ["mylib"],
3408 }
3409 `)
3410
Colin Cross7113d202019-11-20 16:39:12 -08003411 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003412
3413 // Ensure that the include path of the header lib is exported to 'otherlib'
3414 ensureContains(t, cFlags, "-Imy_include")
3415}
Alex Light9670d332019-01-29 18:07:33 -08003416
Jiyong Park7cd10e32020-01-14 09:22:18 +09003417type fileInApex struct {
3418 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003419 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003420 isLink bool
3421}
3422
Jooyung Hana57af4a2020-01-23 05:36:59 +00003423func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003424 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003425 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003426 copyCmds := apexRule.Args["copy_commands"]
3427 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003428 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003429 for _, cmd := range strings.Split(copyCmds, "&&") {
3430 cmd = strings.TrimSpace(cmd)
3431 if cmd == "" {
3432 continue
3433 }
3434 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003435 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003436 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003437 switch terms[0] {
3438 case "mkdir":
3439 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003440 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003441 t.Fatal("copyCmds contains invalid cp command", cmd)
3442 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003443 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003444 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003445 isLink = false
3446 case "ln":
3447 if len(terms) != 3 && len(terms) != 4 {
3448 // ln LINK TARGET or ln -s LINK TARGET
3449 t.Fatal("copyCmds contains invalid ln command", cmd)
3450 }
3451 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003452 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003453 isLink = true
3454 default:
3455 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3456 }
3457 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003458 index := strings.Index(dst, imageApexDir)
3459 if index == -1 {
3460 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3461 }
3462 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003463 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003464 }
3465 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003466 return ret
3467}
3468
Jooyung Hana57af4a2020-01-23 05:36:59 +00003469func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3470 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003471 var failed bool
3472 var surplus []string
3473 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003474 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003475 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003476 for _, expected := range files {
3477 if matched, _ := path.Match(expected, file.path); matched {
3478 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003479 mactchFound = true
3480 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003481 }
3482 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003483 if !mactchFound {
3484 surplus = append(surplus, file.path)
3485 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003486 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003487
Jooyung Han31c470b2019-10-18 16:26:59 +09003488 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003489 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003490 t.Log("surplus files", surplus)
3491 failed = true
3492 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003493
3494 if len(files) > len(filesMatched) {
3495 var missing []string
3496 for _, expected := range files {
3497 if !filesMatched[expected] {
3498 missing = append(missing, expected)
3499 }
3500 }
3501 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003502 t.Log("missing files", missing)
3503 failed = true
3504 }
3505 if failed {
3506 t.Fail()
3507 }
3508}
3509
Jooyung Han344d5432019-08-23 11:17:39 +09003510func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003511 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003512 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003513 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003514 "etc/llndk.libraries.29.txt",
3515 "etc/vndkcore.libraries.29.txt",
3516 "etc/vndksp.libraries.29.txt",
3517 "etc/vndkprivate.libraries.29.txt",
3518 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003519 }
3520 testCases := []struct {
3521 vndkVersion string
3522 expectedFiles []string
3523 }{
3524 {
3525 vndkVersion: "current",
3526 expectedFiles: append(commonFiles,
3527 "lib/libvndk.so",
3528 "lib/libvndksp.so",
3529 "lib64/libvndk.so",
3530 "lib64/libvndksp.so"),
3531 },
3532 {
3533 vndkVersion: "",
3534 expectedFiles: append(commonFiles,
3535 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3536 "lib/libvndksp.so",
3537 "lib64/libvndksp.so"),
3538 },
3539 }
3540 for _, tc := range testCases {
3541 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3542 ctx := testApex(t, `
3543 apex_vndk {
3544 name: "com.android.vndk.current",
3545 key: "com.android.vndk.current.key",
3546 updatable: false,
3547 }
3548
3549 apex_key {
3550 name: "com.android.vndk.current.key",
3551 public_key: "testkey.avbpubkey",
3552 private_key: "testkey.pem",
3553 }
3554
3555 cc_library {
3556 name: "libvndk",
3557 srcs: ["mylib.cpp"],
3558 vendor_available: true,
3559 product_available: true,
3560 vndk: {
3561 enabled: true,
3562 },
3563 system_shared_libs: [],
3564 stl: "none",
3565 apex_available: [ "com.android.vndk.current" ],
3566 }
3567
3568 cc_library {
3569 name: "libvndksp",
3570 srcs: ["mylib.cpp"],
3571 vendor_available: true,
3572 product_available: true,
3573 vndk: {
3574 enabled: true,
3575 support_system_process: true,
3576 },
3577 system_shared_libs: [],
3578 stl: "none",
3579 apex_available: [ "com.android.vndk.current" ],
3580 }
3581
3582 // VNDK-Ext should not cause any problems
3583
3584 cc_library {
3585 name: "libvndk.ext",
3586 srcs: ["mylib2.cpp"],
3587 vendor: true,
3588 vndk: {
3589 enabled: true,
3590 extends: "libvndk",
3591 },
3592 system_shared_libs: [],
3593 stl: "none",
3594 }
3595
3596 cc_library {
3597 name: "libvndksp.ext",
3598 srcs: ["mylib2.cpp"],
3599 vendor: true,
3600 vndk: {
3601 enabled: true,
3602 support_system_process: true,
3603 extends: "libvndksp",
3604 },
3605 system_shared_libs: [],
3606 stl: "none",
3607 }
3608 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3609 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3610 }))
3611 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3612 })
3613 }
Jooyung Han344d5432019-08-23 11:17:39 +09003614}
3615
3616func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003617 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003618 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003619 name: "com.android.vndk.current",
3620 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003621 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003622 }
3623
3624 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003625 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003626 public_key: "testkey.avbpubkey",
3627 private_key: "testkey.pem",
3628 }
3629
3630 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003631 name: "libvndk",
3632 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003633 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003634 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003635 vndk: {
3636 enabled: true,
3637 },
3638 system_shared_libs: [],
3639 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003640 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003641 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003642
3643 cc_prebuilt_library_shared {
3644 name: "libvndk.arm",
3645 srcs: ["libvndk.arm.so"],
3646 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003647 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003648 vndk: {
3649 enabled: true,
3650 },
3651 enabled: false,
3652 arch: {
3653 arm: {
3654 enabled: true,
3655 },
3656 },
3657 system_shared_libs: [],
3658 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003659 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003660 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003661 `+vndkLibrariesTxtFiles("current"),
3662 withFiles(map[string][]byte{
3663 "libvndk.so": nil,
3664 "libvndk.arm.so": nil,
3665 }))
Colin Cross2807f002021-03-02 10:15:29 -08003666 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003667 "lib/libvndk.so",
3668 "lib/libvndk.arm.so",
3669 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003670 "lib/libc++.so",
3671 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003672 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003673 })
Jooyung Han344d5432019-08-23 11:17:39 +09003674}
3675
Jooyung Han39edb6c2019-11-06 16:53:07 +09003676func vndkLibrariesTxtFiles(vers ...string) (result string) {
3677 for _, v := range vers {
3678 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003679 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003680 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003681 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003682 name: "` + txt + `.libraries.txt",
3683 }
3684 `
3685 }
3686 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003687 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003688 result += `
3689 prebuilt_etc {
3690 name: "` + txt + `.libraries.` + v + `.txt",
3691 src: "dummy.txt",
3692 }
3693 `
3694 }
3695 }
3696 }
3697 return
3698}
3699
Jooyung Han344d5432019-08-23 11:17:39 +09003700func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003701 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003702 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003703 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003704 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003705 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003706 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003707 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003708 }
3709
3710 apex_key {
3711 name: "myapex.key",
3712 public_key: "testkey.avbpubkey",
3713 private_key: "testkey.pem",
3714 }
3715
Jooyung Han31c470b2019-10-18 16:26:59 +09003716 vndk_prebuilt_shared {
3717 name: "libvndk27",
3718 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003719 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003720 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003721 vndk: {
3722 enabled: true,
3723 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003724 target_arch: "arm64",
3725 arch: {
3726 arm: {
3727 srcs: ["libvndk27_arm.so"],
3728 },
3729 arm64: {
3730 srcs: ["libvndk27_arm64.so"],
3731 },
3732 },
Colin Cross2807f002021-03-02 10:15:29 -08003733 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003734 }
3735
3736 vndk_prebuilt_shared {
3737 name: "libvndk27",
3738 version: "27",
3739 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003740 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003741 vndk: {
3742 enabled: true,
3743 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003744 target_arch: "x86_64",
3745 arch: {
3746 x86: {
3747 srcs: ["libvndk27_x86.so"],
3748 },
3749 x86_64: {
3750 srcs: ["libvndk27_x86_64.so"],
3751 },
3752 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003753 }
3754 `+vndkLibrariesTxtFiles("27"),
3755 withFiles(map[string][]byte{
3756 "libvndk27_arm.so": nil,
3757 "libvndk27_arm64.so": nil,
3758 "libvndk27_x86.so": nil,
3759 "libvndk27_x86_64.so": nil,
3760 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003761
Colin Cross2807f002021-03-02 10:15:29 -08003762 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003763 "lib/libvndk27_arm.so",
3764 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003765 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003766 })
Jooyung Han344d5432019-08-23 11:17:39 +09003767}
3768
Jooyung Han90eee022019-10-01 20:02:42 +09003769func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003770 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003771 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003772 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003773 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003774 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003775 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003776 }
3777 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003778 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003779 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003780 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003781 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003782 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003783 }
3784 apex_key {
3785 name: "myapex.key",
3786 public_key: "testkey.avbpubkey",
3787 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003788 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003789
3790 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003791 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003792 actual := proptools.String(bundle.properties.Apex_name)
3793 if !reflect.DeepEqual(actual, expected) {
3794 t.Errorf("Got '%v', expected '%v'", actual, expected)
3795 }
3796 }
3797
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003798 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003799 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003800}
3801
Jooyung Han344d5432019-08-23 11:17:39 +09003802func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003803 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003804 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003805 name: "com.android.vndk.current",
3806 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003807 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003808 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003809 }
3810
3811 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003812 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003813 public_key: "testkey.avbpubkey",
3814 private_key: "testkey.pem",
3815 }
3816
3817 cc_library {
3818 name: "libvndk",
3819 srcs: ["mylib.cpp"],
3820 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003821 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003822 native_bridge_supported: true,
3823 host_supported: true,
3824 vndk: {
3825 enabled: true,
3826 },
3827 system_shared_libs: [],
3828 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003829 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003830 }
Colin Cross2807f002021-03-02 10:15:29 -08003831 `+vndkLibrariesTxtFiles("current"),
3832 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003833
Colin Cross2807f002021-03-02 10:15:29 -08003834 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003835 "lib/libvndk.so",
3836 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003837 "lib/libc++.so",
3838 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003839 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003840 })
Jooyung Han344d5432019-08-23 11:17:39 +09003841}
3842
3843func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003844 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003845 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003846 name: "com.android.vndk.current",
3847 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003848 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003849 native_bridge_supported: true,
3850 }
3851
3852 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003853 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003854 public_key: "testkey.avbpubkey",
3855 private_key: "testkey.pem",
3856 }
3857
3858 cc_library {
3859 name: "libvndk",
3860 srcs: ["mylib.cpp"],
3861 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003862 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003863 native_bridge_supported: true,
3864 host_supported: true,
3865 vndk: {
3866 enabled: true,
3867 },
3868 system_shared_libs: [],
3869 stl: "none",
3870 }
3871 `)
3872}
3873
Jooyung Han31c470b2019-10-18 16:26:59 +09003874func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003875 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003876 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003877 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003878 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003879 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003880 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003881 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003882 }
3883
3884 apex_key {
3885 name: "myapex.key",
3886 public_key: "testkey.avbpubkey",
3887 private_key: "testkey.pem",
3888 }
3889
3890 vndk_prebuilt_shared {
3891 name: "libvndk27",
3892 version: "27",
3893 target_arch: "arm",
3894 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003895 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003896 vndk: {
3897 enabled: true,
3898 },
3899 arch: {
3900 arm: {
3901 srcs: ["libvndk27.so"],
3902 }
3903 },
3904 }
3905
3906 vndk_prebuilt_shared {
3907 name: "libvndk27",
3908 version: "27",
3909 target_arch: "arm",
3910 binder32bit: true,
3911 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003912 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003913 vndk: {
3914 enabled: true,
3915 },
3916 arch: {
3917 arm: {
3918 srcs: ["libvndk27binder32.so"],
3919 }
3920 },
Colin Cross2807f002021-03-02 10:15:29 -08003921 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003922 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003923 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003924 withFiles(map[string][]byte{
3925 "libvndk27.so": nil,
3926 "libvndk27binder32.so": nil,
3927 }),
3928 withBinder32bit,
3929 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003930 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003931 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3932 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003933 },
3934 }),
3935 )
3936
Colin Cross2807f002021-03-02 10:15:29 -08003937 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003938 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003939 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003940 })
3941}
3942
Jooyung Han45a96772020-06-15 14:59:42 +09003943func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003944 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003945 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003946 name: "com.android.vndk.current",
3947 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003948 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003949 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003950 }
3951
3952 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003953 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003954 public_key: "testkey.avbpubkey",
3955 private_key: "testkey.pem",
3956 }
3957
3958 cc_library {
3959 name: "libz",
3960 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003961 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003962 vndk: {
3963 enabled: true,
3964 },
3965 stubs: {
3966 symbol_file: "libz.map.txt",
3967 versions: ["30"],
3968 }
3969 }
3970 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3971 "libz.map.txt": nil,
3972 }))
3973
Colin Cross2807f002021-03-02 10:15:29 -08003974 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003975 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3976 ensureListEmpty(t, provideNativeLibs)
3977}
3978
Jooyung Hane1633032019-08-01 17:41:43 +09003979func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003980 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003981 apex {
3982 name: "myapex_nodep",
3983 key: "myapex.key",
3984 native_shared_libs: ["lib_nodep"],
3985 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003986 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003987 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003988 }
3989
3990 apex {
3991 name: "myapex_dep",
3992 key: "myapex.key",
3993 native_shared_libs: ["lib_dep"],
3994 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003995 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003996 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003997 }
3998
3999 apex {
4000 name: "myapex_provider",
4001 key: "myapex.key",
4002 native_shared_libs: ["libfoo"],
4003 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004004 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004005 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004006 }
4007
4008 apex {
4009 name: "myapex_selfcontained",
4010 key: "myapex.key",
4011 native_shared_libs: ["lib_dep", "libfoo"],
4012 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004013 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004014 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004015 }
4016
4017 apex_key {
4018 name: "myapex.key",
4019 public_key: "testkey.avbpubkey",
4020 private_key: "testkey.pem",
4021 }
4022
4023 cc_library {
4024 name: "lib_nodep",
4025 srcs: ["mylib.cpp"],
4026 system_shared_libs: [],
4027 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004028 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004029 }
4030
4031 cc_library {
4032 name: "lib_dep",
4033 srcs: ["mylib.cpp"],
4034 shared_libs: ["libfoo"],
4035 system_shared_libs: [],
4036 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004037 apex_available: [
4038 "myapex_dep",
4039 "myapex_provider",
4040 "myapex_selfcontained",
4041 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004042 }
4043
4044 cc_library {
4045 name: "libfoo",
4046 srcs: ["mytest.cpp"],
4047 stubs: {
4048 versions: ["1"],
4049 },
4050 system_shared_libs: [],
4051 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004052 apex_available: [
4053 "myapex_provider",
4054 "myapex_selfcontained",
4055 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004056 }
4057 `)
4058
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004059 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004060 var provideNativeLibs, requireNativeLibs []string
4061
Sundong Ahnabb64432019-10-22 13:58:29 +09004062 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004063 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4064 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004065 ensureListEmpty(t, provideNativeLibs)
4066 ensureListEmpty(t, requireNativeLibs)
4067
Sundong Ahnabb64432019-10-22 13:58:29 +09004068 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004069 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4070 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004071 ensureListEmpty(t, provideNativeLibs)
4072 ensureListContains(t, requireNativeLibs, "libfoo.so")
4073
Sundong Ahnabb64432019-10-22 13:58:29 +09004074 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004075 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4076 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004077 ensureListContains(t, provideNativeLibs, "libfoo.so")
4078 ensureListEmpty(t, requireNativeLibs)
4079
Sundong Ahnabb64432019-10-22 13:58:29 +09004080 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004081 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4082 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004083 ensureListContains(t, provideNativeLibs, "libfoo.so")
4084 ensureListEmpty(t, requireNativeLibs)
4085}
4086
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004087func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004088 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004089 apex {
4090 name: "myapex",
4091 key: "myapex.key",
4092 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004093 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004094 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004095 }
4096
4097 apex_key {
4098 name: "myapex.key",
4099 public_key: "testkey.avbpubkey",
4100 private_key: "testkey.pem",
4101 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004102
4103 cc_library {
4104 name: "mylib",
4105 srcs: ["mylib.cpp"],
4106 system_shared_libs: [],
4107 stl: "none",
4108 apex_available: [
4109 "//apex_available:platform",
4110 "myapex",
4111 ],
4112 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004113 `)
4114
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004115 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004116 apexManifestRule := module.Rule("apexManifestRule")
4117 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4118 apexRule := module.Rule("apexRule")
4119 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004120
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004121 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004122 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004123 name := apexBundle.BaseModuleName()
4124 prefix := "TARGET_"
4125 var builder strings.Builder
4126 data.Custom(&builder, name, prefix, "", data)
4127 androidMk := builder.String()
Jiyong Parkdb334862020-02-05 17:19:28 +09004128 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004129}
4130
Vinh Tran8f5310f2022-10-07 18:16:47 -04004131func TestCompileMultilibProp(t *testing.T) {
4132 testCases := []struct {
4133 compileMultiLibProp string
4134 containedLibs []string
4135 notContainedLibs []string
4136 }{
4137 {
4138 containedLibs: []string{
4139 "image.apex/lib64/mylib.so",
4140 "image.apex/lib/mylib.so",
4141 },
4142 compileMultiLibProp: `compile_multilib: "both",`,
4143 },
4144 {
4145 containedLibs: []string{"image.apex/lib64/mylib.so"},
4146 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4147 compileMultiLibProp: `compile_multilib: "first",`,
4148 },
4149 {
4150 containedLibs: []string{"image.apex/lib64/mylib.so"},
4151 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4152 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4153 },
4154 {
4155 containedLibs: []string{"image.apex/lib64/mylib.so"},
4156 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4157 compileMultiLibProp: `compile_multilib: "64",`,
4158 },
4159 {
4160 containedLibs: []string{"image.apex/lib/mylib.so"},
4161 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4162 compileMultiLibProp: `compile_multilib: "32",`,
4163 },
4164 }
4165 for _, testCase := range testCases {
4166 ctx := testApex(t, fmt.Sprintf(`
4167 apex {
4168 name: "myapex",
4169 key: "myapex.key",
4170 %s
4171 native_shared_libs: ["mylib"],
4172 updatable: false,
4173 }
4174 apex_key {
4175 name: "myapex.key",
4176 public_key: "testkey.avbpubkey",
4177 private_key: "testkey.pem",
4178 }
4179 cc_library {
4180 name: "mylib",
4181 srcs: ["mylib.cpp"],
4182 apex_available: [
4183 "//apex_available:platform",
4184 "myapex",
4185 ],
4186 }
4187 `, testCase.compileMultiLibProp),
4188 )
4189 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4190 apexRule := module.Rule("apexRule")
4191 copyCmds := apexRule.Args["copy_commands"]
4192 for _, containedLib := range testCase.containedLibs {
4193 ensureContains(t, copyCmds, containedLib)
4194 }
4195 for _, notContainedLib := range testCase.notContainedLibs {
4196 ensureNotContains(t, copyCmds, notContainedLib)
4197 }
4198 }
4199}
4200
Alex Light0851b882019-02-07 13:20:53 -08004201func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004202 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004203 apex {
4204 name: "myapex",
4205 key: "myapex.key",
4206 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004207 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004208 }
4209
4210 apex_key {
4211 name: "myapex.key",
4212 public_key: "testkey.avbpubkey",
4213 private_key: "testkey.pem",
4214 }
4215
4216 cc_library {
4217 name: "mylib_common",
4218 srcs: ["mylib.cpp"],
4219 system_shared_libs: [],
4220 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004221 apex_available: [
4222 "//apex_available:platform",
4223 "myapex",
4224 ],
Alex Light0851b882019-02-07 13:20:53 -08004225 }
4226 `)
4227
Sundong Ahnabb64432019-10-22 13:58:29 +09004228 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004229 apexRule := module.Rule("apexRule")
4230 copyCmds := apexRule.Args["copy_commands"]
4231
4232 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4233 t.Log("Apex was a test apex!")
4234 t.Fail()
4235 }
4236 // Ensure that main rule creates an output
4237 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4238
4239 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004240 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004241
4242 // Ensure that both direct and indirect deps are copied into apex
4243 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4244
Colin Cross7113d202019-11-20 16:39:12 -08004245 // Ensure that the platform variant ends with _shared
4246 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004247
Colin Cross56a83212020-09-15 18:30:11 -07004248 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004249 t.Log("Found mylib_common not in any apex!")
4250 t.Fail()
4251 }
4252}
4253
4254func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004255 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004256 apex_test {
4257 name: "myapex",
4258 key: "myapex.key",
4259 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004260 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004261 }
4262
4263 apex_key {
4264 name: "myapex.key",
4265 public_key: "testkey.avbpubkey",
4266 private_key: "testkey.pem",
4267 }
4268
4269 cc_library {
4270 name: "mylib_common_test",
4271 srcs: ["mylib.cpp"],
4272 system_shared_libs: [],
4273 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004274 // TODO: remove //apex_available:platform
4275 apex_available: [
4276 "//apex_available:platform",
4277 "myapex",
4278 ],
Alex Light0851b882019-02-07 13:20:53 -08004279 }
4280 `)
4281
Sundong Ahnabb64432019-10-22 13:58:29 +09004282 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004283 apexRule := module.Rule("apexRule")
4284 copyCmds := apexRule.Args["copy_commands"]
4285
4286 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4287 t.Log("Apex was not a test apex!")
4288 t.Fail()
4289 }
4290 // Ensure that main rule creates an output
4291 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4292
4293 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004294 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004295
4296 // Ensure that both direct and indirect deps are copied into apex
4297 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4298
Colin Cross7113d202019-11-20 16:39:12 -08004299 // Ensure that the platform variant ends with _shared
4300 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004301}
4302
Alex Light9670d332019-01-29 18:07:33 -08004303func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004304 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004305 apex {
4306 name: "myapex",
4307 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004308 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004309 multilib: {
4310 first: {
4311 native_shared_libs: ["mylib_common"],
4312 }
4313 },
4314 target: {
4315 android: {
4316 multilib: {
4317 first: {
4318 native_shared_libs: ["mylib"],
4319 }
4320 }
4321 },
4322 host: {
4323 multilib: {
4324 first: {
4325 native_shared_libs: ["mylib2"],
4326 }
4327 }
4328 }
4329 }
4330 }
4331
4332 apex_key {
4333 name: "myapex.key",
4334 public_key: "testkey.avbpubkey",
4335 private_key: "testkey.pem",
4336 }
4337
4338 cc_library {
4339 name: "mylib",
4340 srcs: ["mylib.cpp"],
4341 system_shared_libs: [],
4342 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004343 // TODO: remove //apex_available:platform
4344 apex_available: [
4345 "//apex_available:platform",
4346 "myapex",
4347 ],
Alex Light9670d332019-01-29 18:07:33 -08004348 }
4349
4350 cc_library {
4351 name: "mylib_common",
4352 srcs: ["mylib.cpp"],
4353 system_shared_libs: [],
4354 stl: "none",
4355 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004356 // TODO: remove //apex_available:platform
4357 apex_available: [
4358 "//apex_available:platform",
4359 "myapex",
4360 ],
Alex Light9670d332019-01-29 18:07:33 -08004361 }
4362
4363 cc_library {
4364 name: "mylib2",
4365 srcs: ["mylib.cpp"],
4366 system_shared_libs: [],
4367 stl: "none",
4368 compile_multilib: "first",
4369 }
4370 `)
4371
Sundong Ahnabb64432019-10-22 13:58:29 +09004372 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004373 copyCmds := apexRule.Args["copy_commands"]
4374
4375 // Ensure that main rule creates an output
4376 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4377
4378 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004379 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4380 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4381 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004382
4383 // Ensure that both direct and indirect deps are copied into apex
4384 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4385 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4386 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4387
Colin Cross7113d202019-11-20 16:39:12 -08004388 // Ensure that the platform variant ends with _shared
4389 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4390 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4391 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004392}
Jiyong Park04480cf2019-02-06 00:16:29 +09004393
Jiyong Park59140302020-12-14 18:44:04 +09004394func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004395 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004396 apex {
4397 name: "myapex",
4398 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004399 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004400 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004401 arch: {
4402 arm64: {
4403 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004404 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004405 },
4406 x86_64: {
4407 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004408 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004409 },
4410 }
4411 }
4412
4413 apex_key {
4414 name: "myapex.key",
4415 public_key: "testkey.avbpubkey",
4416 private_key: "testkey.pem",
4417 }
4418
4419 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004420 name: "mylib.generic",
4421 srcs: ["mylib.cpp"],
4422 system_shared_libs: [],
4423 stl: "none",
4424 // TODO: remove //apex_available:platform
4425 apex_available: [
4426 "//apex_available:platform",
4427 "myapex",
4428 ],
4429 }
4430
4431 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004432 name: "mylib.arm64",
4433 srcs: ["mylib.cpp"],
4434 system_shared_libs: [],
4435 stl: "none",
4436 // TODO: remove //apex_available:platform
4437 apex_available: [
4438 "//apex_available:platform",
4439 "myapex",
4440 ],
4441 }
4442
4443 cc_library {
4444 name: "mylib.x64",
4445 srcs: ["mylib.cpp"],
4446 system_shared_libs: [],
4447 stl: "none",
4448 // TODO: remove //apex_available:platform
4449 apex_available: [
4450 "//apex_available:platform",
4451 "myapex",
4452 ],
4453 }
4454 `)
4455
4456 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4457 copyCmds := apexRule.Args["copy_commands"]
4458
4459 // Ensure that apex variant is created for the direct dep
4460 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004461 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004462 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4463
4464 // Ensure that both direct and indirect deps are copied into apex
4465 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4466 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4467}
4468
Jiyong Park04480cf2019-02-06 00:16:29 +09004469func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004470 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004471 apex {
4472 name: "myapex",
4473 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004474 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004475 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004476 }
4477
4478 apex_key {
4479 name: "myapex.key",
4480 public_key: "testkey.avbpubkey",
4481 private_key: "testkey.pem",
4482 }
4483
4484 sh_binary {
4485 name: "myscript",
4486 src: "mylib.cpp",
4487 filename: "myscript.sh",
4488 sub_dir: "script",
4489 }
4490 `)
4491
Sundong Ahnabb64432019-10-22 13:58:29 +09004492 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004493 copyCmds := apexRule.Args["copy_commands"]
4494
4495 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4496}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004497
Jooyung Han91df2082019-11-20 01:49:42 +09004498func TestApexInVariousPartition(t *testing.T) {
4499 testcases := []struct {
4500 propName, parition, flattenedPartition string
4501 }{
4502 {"", "system", "system_ext"},
4503 {"product_specific: true", "product", "product"},
4504 {"soc_specific: true", "vendor", "vendor"},
4505 {"proprietary: true", "vendor", "vendor"},
4506 {"vendor: true", "vendor", "vendor"},
4507 {"system_ext_specific: true", "system_ext", "system_ext"},
4508 }
4509 for _, tc := range testcases {
4510 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004511 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004512 apex {
4513 name: "myapex",
4514 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004515 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004516 `+tc.propName+`
4517 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004518
Jooyung Han91df2082019-11-20 01:49:42 +09004519 apex_key {
4520 name: "myapex.key",
4521 public_key: "testkey.avbpubkey",
4522 private_key: "testkey.pem",
4523 }
4524 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004525
Jooyung Han91df2082019-11-20 01:49:42 +09004526 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004527 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4528 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004529 if actual != expected {
4530 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4531 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004532
Jooyung Han91df2082019-11-20 01:49:42 +09004533 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004534 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4535 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004536 if actual != expected {
4537 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4538 }
4539 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004540 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004541}
Jiyong Park67882562019-03-21 01:11:21 +09004542
Jooyung Han580eb4f2020-06-24 19:33:06 +09004543func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004544 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004545 apex {
4546 name: "myapex",
4547 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004548 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004549 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004550
Jooyung Han580eb4f2020-06-24 19:33:06 +09004551 apex_key {
4552 name: "myapex.key",
4553 public_key: "testkey.avbpubkey",
4554 private_key: "testkey.pem",
4555 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004556 `)
4557 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004558 rule := module.Output("file_contexts")
4559 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4560}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004561
Jooyung Han580eb4f2020-06-24 19:33:06 +09004562func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004563 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004564 apex {
4565 name: "myapex",
4566 key: "myapex.key",
4567 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004568 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004569 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004570
Jooyung Han580eb4f2020-06-24 19:33:06 +09004571 apex_key {
4572 name: "myapex.key",
4573 public_key: "testkey.avbpubkey",
4574 private_key: "testkey.pem",
4575 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004576 `, withFiles(map[string][]byte{
4577 "my_own_file_contexts": nil,
4578 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004579}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004580
Jooyung Han580eb4f2020-06-24 19:33:06 +09004581func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004582 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004583 apex {
4584 name: "myapex",
4585 key: "myapex.key",
4586 product_specific: true,
4587 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004588 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004589 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004590
Jooyung Han580eb4f2020-06-24 19:33:06 +09004591 apex_key {
4592 name: "myapex.key",
4593 public_key: "testkey.avbpubkey",
4594 private_key: "testkey.pem",
4595 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004596 `)
4597
Colin Cross1c460562021-02-16 17:55:47 -08004598 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004599 apex {
4600 name: "myapex",
4601 key: "myapex.key",
4602 product_specific: true,
4603 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004604 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004605 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004606
Jooyung Han580eb4f2020-06-24 19:33:06 +09004607 apex_key {
4608 name: "myapex.key",
4609 public_key: "testkey.avbpubkey",
4610 private_key: "testkey.pem",
4611 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004612 `, withFiles(map[string][]byte{
4613 "product_specific_file_contexts": nil,
4614 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004615 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4616 rule := module.Output("file_contexts")
4617 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4618}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004619
Jooyung Han580eb4f2020-06-24 19:33:06 +09004620func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004621 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004622 apex {
4623 name: "myapex",
4624 key: "myapex.key",
4625 product_specific: true,
4626 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004627 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004628 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004629
Jooyung Han580eb4f2020-06-24 19:33:06 +09004630 apex_key {
4631 name: "myapex.key",
4632 public_key: "testkey.avbpubkey",
4633 private_key: "testkey.pem",
4634 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004635
Jooyung Han580eb4f2020-06-24 19:33:06 +09004636 filegroup {
4637 name: "my-file-contexts",
4638 srcs: ["product_specific_file_contexts"],
4639 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004640 `, withFiles(map[string][]byte{
4641 "product_specific_file_contexts": nil,
4642 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004643 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4644 rule := module.Output("file_contexts")
4645 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004646}
4647
Jiyong Park67882562019-03-21 01:11:21 +09004648func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004649 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004650 apex_key {
4651 name: "myapex.key",
4652 public_key: ":my.avbpubkey",
4653 private_key: ":my.pem",
4654 product_specific: true,
4655 }
4656
4657 filegroup {
4658 name: "my.avbpubkey",
4659 srcs: ["testkey2.avbpubkey"],
4660 }
4661
4662 filegroup {
4663 name: "my.pem",
4664 srcs: ["testkey2.pem"],
4665 }
4666 `)
4667
4668 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4669 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004670 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004671 if actual_pubkey != expected_pubkey {
4672 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4673 }
4674 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004675 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004676 if actual_privkey != expected_privkey {
4677 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4678 }
4679}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004680
4681func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004682 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004683 prebuilt_apex {
4684 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004685 arch: {
4686 arm64: {
4687 src: "myapex-arm64.apex",
4688 },
4689 arm: {
4690 src: "myapex-arm.apex",
4691 },
4692 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004693 }
4694 `)
4695
Wei Li340ee8e2022-03-18 17:33:24 -07004696 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4697 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004698
Jiyong Parkc95714e2019-03-29 14:23:10 +09004699 expectedInput := "myapex-arm64.apex"
4700 if prebuilt.inputApex.String() != expectedInput {
4701 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4702 }
Wei Li340ee8e2022-03-18 17:33:24 -07004703 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4704 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4705 rule := testingModule.Rule("genProvenanceMetaData")
4706 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4707 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4708 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4709 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004710}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004711
Paul Duffinc0609c62021-03-01 17:27:16 +00004712func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004713 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004714 prebuilt_apex {
4715 name: "myapex",
4716 }
4717 `)
4718}
4719
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004720func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004721 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004722 prebuilt_apex {
4723 name: "myapex",
4724 src: "myapex-arm.apex",
4725 filename: "notmyapex.apex",
4726 }
4727 `)
4728
Wei Li340ee8e2022-03-18 17:33:24 -07004729 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4730 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004731
4732 expected := "notmyapex.apex"
4733 if p.installFilename != expected {
4734 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4735 }
Wei Li340ee8e2022-03-18 17:33:24 -07004736 rule := testingModule.Rule("genProvenanceMetaData")
4737 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4738 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4739 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4740 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004741}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004742
Samiul Islam7c02e262021-09-08 17:48:28 +01004743func TestApexSetFilenameOverride(t *testing.T) {
4744 testApex(t, `
4745 apex_set {
4746 name: "com.company.android.myapex",
4747 apex_name: "com.android.myapex",
4748 set: "company-myapex.apks",
4749 filename: "com.company.android.myapex.apex"
4750 }
4751 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4752
4753 testApex(t, `
4754 apex_set {
4755 name: "com.company.android.myapex",
4756 apex_name: "com.android.myapex",
4757 set: "company-myapex.apks",
4758 filename: "com.company.android.myapex.capex"
4759 }
4760 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4761
4762 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4763 apex_set {
4764 name: "com.company.android.myapex",
4765 apex_name: "com.android.myapex",
4766 set: "company-myapex.apks",
4767 filename: "some-random-suffix"
4768 }
4769 `)
4770}
4771
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004772func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004773 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004774 prebuilt_apex {
4775 name: "myapex.prebuilt",
4776 src: "myapex-arm.apex",
4777 overrides: [
4778 "myapex",
4779 ],
4780 }
4781 `)
4782
Wei Li340ee8e2022-03-18 17:33:24 -07004783 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4784 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004785
4786 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004787 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004788 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004789 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004790 }
Wei Li340ee8e2022-03-18 17:33:24 -07004791 rule := testingModule.Rule("genProvenanceMetaData")
4792 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4793 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4794 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4795 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004796}
4797
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004798func TestPrebuiltApexName(t *testing.T) {
4799 testApex(t, `
4800 prebuilt_apex {
4801 name: "com.company.android.myapex",
4802 apex_name: "com.android.myapex",
4803 src: "company-myapex-arm.apex",
4804 }
4805 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4806
4807 testApex(t, `
4808 apex_set {
4809 name: "com.company.android.myapex",
4810 apex_name: "com.android.myapex",
4811 set: "company-myapex.apks",
4812 }
4813 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4814}
4815
4816func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4817 _ = android.GroupFixturePreparers(
4818 java.PrepareForTestWithJavaDefaultModules,
4819 PrepareForTestWithApexBuildComponents,
4820 android.FixtureWithRootAndroidBp(`
4821 platform_bootclasspath {
4822 name: "platform-bootclasspath",
4823 fragments: [
4824 {
4825 apex: "com.android.art",
4826 module: "art-bootclasspath-fragment",
4827 },
4828 ],
4829 }
4830
4831 prebuilt_apex {
4832 name: "com.company.android.art",
4833 apex_name: "com.android.art",
4834 src: "com.company.android.art-arm.apex",
4835 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4836 }
4837
4838 prebuilt_bootclasspath_fragment {
4839 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004840 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004841 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004842 hidden_api: {
4843 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4844 metadata: "my-bootclasspath-fragment/metadata.csv",
4845 index: "my-bootclasspath-fragment/index.csv",
4846 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4847 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4848 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004849 }
4850
4851 java_import {
4852 name: "core-oj",
4853 jars: ["prebuilt.jar"],
4854 }
4855 `),
4856 ).RunTest(t)
4857}
4858
Paul Duffin092153d2021-01-26 11:42:39 +00004859// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4860// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004861func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004862 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004863
Paul Duffin89886cb2021-02-05 16:44:03 +00004864 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004865 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004866 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004867 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004868 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004869 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004870 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4871 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4872 android.NormalizePathForTesting(dexJarBuildPath))
4873 }
4874
4875 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004876 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004877 // Make sure the import has been given the correct path to the dex jar.
4878 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4879 dexJarBuildPath := p.DexJarInstallPath()
4880 stem := android.RemoveOptionalPrebuiltPrefix(name)
4881 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4882 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4883 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004884 }
4885
Paul Duffin39853512021-02-26 11:09:39 +00004886 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004887 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004888 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004889 android.AssertArrayString(t, "Check if there is no source variant",
4890 []string{"android_common"},
4891 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004892 }
4893
4894 t.Run("prebuilt only", func(t *testing.T) {
4895 bp := `
4896 prebuilt_apex {
4897 name: "myapex",
4898 arch: {
4899 arm64: {
4900 src: "myapex-arm64.apex",
4901 },
4902 arm: {
4903 src: "myapex-arm.apex",
4904 },
4905 },
Paul Duffin39853512021-02-26 11:09:39 +00004906 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004907 }
4908
4909 java_import {
4910 name: "libfoo",
4911 jars: ["libfoo.jar"],
4912 }
Paul Duffin39853512021-02-26 11:09:39 +00004913
4914 java_sdk_library_import {
4915 name: "libbar",
4916 public: {
4917 jars: ["libbar.jar"],
4918 },
4919 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004920 `
4921
4922 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4923 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4924
Martin Stjernholm44825602021-09-17 01:44:12 +01004925 deapexerName := deapexerModuleName("myapex")
4926 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4927
Paul Duffinf6932af2021-02-26 18:21:56 +00004928 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004929 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004930 rule := deapexer.Rule("deapexer")
4931 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4932 t.Errorf("expected: %q, found: %q", expected, actual)
4933 }
4934
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004935 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004936 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004937 rule = prebuiltApex.Rule("android/soong/android.Cp")
4938 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4939 t.Errorf("expected: %q, found: %q", expected, actual)
4940 }
4941
Paul Duffin89886cb2021-02-05 16:44:03 +00004942 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004943 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004944
4945 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004946 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004947 })
4948
4949 t.Run("prebuilt with source preferred", func(t *testing.T) {
4950
4951 bp := `
4952 prebuilt_apex {
4953 name: "myapex",
4954 arch: {
4955 arm64: {
4956 src: "myapex-arm64.apex",
4957 },
4958 arm: {
4959 src: "myapex-arm.apex",
4960 },
4961 },
Paul Duffin39853512021-02-26 11:09:39 +00004962 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004963 }
4964
4965 java_import {
4966 name: "libfoo",
4967 jars: ["libfoo.jar"],
4968 }
4969
4970 java_library {
4971 name: "libfoo",
4972 }
Paul Duffin39853512021-02-26 11:09:39 +00004973
4974 java_sdk_library_import {
4975 name: "libbar",
4976 public: {
4977 jars: ["libbar.jar"],
4978 },
4979 }
4980
4981 java_sdk_library {
4982 name: "libbar",
4983 srcs: ["foo/bar/MyClass.java"],
4984 unsafe_ignore_missing_latest_api: true,
4985 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004986 `
4987
4988 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4989 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4990
Paul Duffin89886cb2021-02-05 16:44:03 +00004991 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004992 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004993 ensureNoSourceVariant(t, ctx, "libfoo")
4994
4995 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004996 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004997 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004998 })
4999
5000 t.Run("prebuilt preferred with source", func(t *testing.T) {
5001 bp := `
5002 prebuilt_apex {
5003 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005004 arch: {
5005 arm64: {
5006 src: "myapex-arm64.apex",
5007 },
5008 arm: {
5009 src: "myapex-arm.apex",
5010 },
5011 },
Paul Duffin39853512021-02-26 11:09:39 +00005012 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005013 }
5014
5015 java_import {
5016 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005017 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005018 jars: ["libfoo.jar"],
5019 }
5020
5021 java_library {
5022 name: "libfoo",
5023 }
Paul Duffin39853512021-02-26 11:09:39 +00005024
5025 java_sdk_library_import {
5026 name: "libbar",
5027 prefer: true,
5028 public: {
5029 jars: ["libbar.jar"],
5030 },
5031 }
5032
5033 java_sdk_library {
5034 name: "libbar",
5035 srcs: ["foo/bar/MyClass.java"],
5036 unsafe_ignore_missing_latest_api: true,
5037 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005038 `
5039
5040 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5041 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5042
Paul Duffin89886cb2021-02-05 16:44:03 +00005043 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005044 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005045 ensureNoSourceVariant(t, ctx, "libfoo")
5046
5047 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005048 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005049 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005050 })
5051}
5052
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005053func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005054 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005055 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005056 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5057 // is disabled.
5058 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5059 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005060
Paul Duffin37856732021-02-26 14:24:15 +00005061 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5062 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005063 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005064 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005065 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005066 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005067 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005068 foundLibfooJar = true
5069 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005070 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005071 }
5072 }
5073 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005074 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 +00005075 }
5076 }
5077
Paul Duffin40a3f652021-07-19 13:11:24 +01005078 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005079 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005080 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005081 var rule android.TestingBuildParams
5082
5083 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5084 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005085 }
5086
Paul Duffin40a3f652021-07-19 13:11:24 +01005087 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5088 t.Helper()
5089 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5090 var rule android.TestingBuildParams
5091
5092 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5093 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5094 }
5095
Paul Duffin89f570a2021-06-16 01:42:33 +01005096 fragment := java.ApexVariantReference{
5097 Apex: proptools.StringPtr("myapex"),
5098 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5099 }
5100
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005101 t.Run("prebuilt only", func(t *testing.T) {
5102 bp := `
5103 prebuilt_apex {
5104 name: "myapex",
5105 arch: {
5106 arm64: {
5107 src: "myapex-arm64.apex",
5108 },
5109 arm: {
5110 src: "myapex-arm.apex",
5111 },
5112 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005113 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5114 }
5115
5116 prebuilt_bootclasspath_fragment {
5117 name: "my-bootclasspath-fragment",
5118 contents: ["libfoo", "libbar"],
5119 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005120 hidden_api: {
5121 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5122 metadata: "my-bootclasspath-fragment/metadata.csv",
5123 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005124 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5125 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5126 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005127 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005128 }
5129
5130 java_import {
5131 name: "libfoo",
5132 jars: ["libfoo.jar"],
5133 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005134 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005135 }
Paul Duffin37856732021-02-26 14:24:15 +00005136
5137 java_sdk_library_import {
5138 name: "libbar",
5139 public: {
5140 jars: ["libbar.jar"],
5141 },
5142 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005143 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005144 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005145 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005146 `
5147
Paul Duffin89f570a2021-06-16 01:42:33 +01005148 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005149 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5150 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005151
Paul Duffin537ea3d2021-05-14 10:38:00 +01005152 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005153 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005154 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005155 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005156 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5157 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005158 })
5159
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005160 t.Run("apex_set only", func(t *testing.T) {
5161 bp := `
5162 apex_set {
5163 name: "myapex",
5164 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005165 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5166 }
5167
5168 prebuilt_bootclasspath_fragment {
5169 name: "my-bootclasspath-fragment",
5170 contents: ["libfoo", "libbar"],
5171 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005172 hidden_api: {
5173 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5174 metadata: "my-bootclasspath-fragment/metadata.csv",
5175 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005176 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5177 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5178 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005179 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005180 }
5181
5182 java_import {
5183 name: "libfoo",
5184 jars: ["libfoo.jar"],
5185 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005186 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005187 }
5188
5189 java_sdk_library_import {
5190 name: "libbar",
5191 public: {
5192 jars: ["libbar.jar"],
5193 },
5194 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005195 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005196 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005197 }
5198 `
5199
Paul Duffin89f570a2021-06-16 01:42:33 +01005200 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005201 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5202 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5203
Paul Duffin537ea3d2021-05-14 10:38:00 +01005204 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005205 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005206 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005207 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005208 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5209 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005210 })
5211
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005212 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5213 bp := `
5214 prebuilt_apex {
5215 name: "myapex",
5216 arch: {
5217 arm64: {
5218 src: "myapex-arm64.apex",
5219 },
5220 arm: {
5221 src: "myapex-arm.apex",
5222 },
5223 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005224 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5225 }
5226
5227 prebuilt_bootclasspath_fragment {
5228 name: "my-bootclasspath-fragment",
5229 contents: ["libfoo", "libbar"],
5230 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005231 hidden_api: {
5232 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5233 metadata: "my-bootclasspath-fragment/metadata.csv",
5234 index: "my-bootclasspath-fragment/index.csv",
5235 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5236 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5237 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005238 }
5239
5240 java_import {
5241 name: "libfoo",
5242 jars: ["libfoo.jar"],
5243 apex_available: ["myapex"],
5244 }
5245
5246 java_library {
5247 name: "libfoo",
5248 srcs: ["foo/bar/MyClass.java"],
5249 apex_available: ["myapex"],
5250 }
Paul Duffin37856732021-02-26 14:24:15 +00005251
5252 java_sdk_library_import {
5253 name: "libbar",
5254 public: {
5255 jars: ["libbar.jar"],
5256 },
5257 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005258 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005259 }
5260
5261 java_sdk_library {
5262 name: "libbar",
5263 srcs: ["foo/bar/MyClass.java"],
5264 unsafe_ignore_missing_latest_api: true,
5265 apex_available: ["myapex"],
5266 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005267 `
5268
5269 // In this test the source (java_library) libfoo is active since the
5270 // prebuilt (java_import) defaults to prefer:false. However the
5271 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5272 // find the dex boot jar in it. We either need to disable the source libfoo
5273 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005274 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005275 // dexbootjar check is skipped if AllowMissingDependencies is true
5276 preparerAllowMissingDeps := android.GroupFixturePreparers(
5277 preparer,
5278 android.PrepareForTestWithAllowMissingDependencies,
5279 )
5280 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005281 })
5282
5283 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5284 bp := `
5285 prebuilt_apex {
5286 name: "myapex",
5287 arch: {
5288 arm64: {
5289 src: "myapex-arm64.apex",
5290 },
5291 arm: {
5292 src: "myapex-arm.apex",
5293 },
5294 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005295 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5296 }
5297
5298 prebuilt_bootclasspath_fragment {
5299 name: "my-bootclasspath-fragment",
5300 contents: ["libfoo", "libbar"],
5301 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005302 hidden_api: {
5303 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5304 metadata: "my-bootclasspath-fragment/metadata.csv",
5305 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005306 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5307 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5308 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005309 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005310 }
5311
5312 java_import {
5313 name: "libfoo",
5314 prefer: true,
5315 jars: ["libfoo.jar"],
5316 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005317 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005318 }
5319
5320 java_library {
5321 name: "libfoo",
5322 srcs: ["foo/bar/MyClass.java"],
5323 apex_available: ["myapex"],
5324 }
Paul Duffin37856732021-02-26 14:24:15 +00005325
5326 java_sdk_library_import {
5327 name: "libbar",
5328 prefer: true,
5329 public: {
5330 jars: ["libbar.jar"],
5331 },
5332 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005333 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005334 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005335 }
5336
5337 java_sdk_library {
5338 name: "libbar",
5339 srcs: ["foo/bar/MyClass.java"],
5340 unsafe_ignore_missing_latest_api: true,
5341 apex_available: ["myapex"],
5342 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005343 `
5344
Paul Duffin89f570a2021-06-16 01:42:33 +01005345 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005346 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5347 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005348
Paul Duffin537ea3d2021-05-14 10:38:00 +01005349 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005350 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005351 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005352 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005353 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5354 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005355 })
5356
5357 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5358 bp := `
5359 apex {
5360 name: "myapex",
5361 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005362 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005363 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005364 }
5365
5366 apex_key {
5367 name: "myapex.key",
5368 public_key: "testkey.avbpubkey",
5369 private_key: "testkey.pem",
5370 }
5371
5372 prebuilt_apex {
5373 name: "myapex",
5374 arch: {
5375 arm64: {
5376 src: "myapex-arm64.apex",
5377 },
5378 arm: {
5379 src: "myapex-arm.apex",
5380 },
5381 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005382 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5383 }
5384
5385 prebuilt_bootclasspath_fragment {
5386 name: "my-bootclasspath-fragment",
5387 contents: ["libfoo", "libbar"],
5388 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005389 hidden_api: {
5390 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5391 metadata: "my-bootclasspath-fragment/metadata.csv",
5392 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005393 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5394 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5395 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005396 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005397 }
5398
5399 java_import {
5400 name: "libfoo",
5401 jars: ["libfoo.jar"],
5402 apex_available: ["myapex"],
5403 }
5404
5405 java_library {
5406 name: "libfoo",
5407 srcs: ["foo/bar/MyClass.java"],
5408 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005409 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005410 }
Paul Duffin37856732021-02-26 14:24:15 +00005411
5412 java_sdk_library_import {
5413 name: "libbar",
5414 public: {
5415 jars: ["libbar.jar"],
5416 },
5417 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005418 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005419 }
5420
5421 java_sdk_library {
5422 name: "libbar",
5423 srcs: ["foo/bar/MyClass.java"],
5424 unsafe_ignore_missing_latest_api: true,
5425 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005426 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005427 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005428 `
5429
Paul Duffin89f570a2021-06-16 01:42:33 +01005430 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005431 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5432 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005433
Paul Duffin537ea3d2021-05-14 10:38:00 +01005434 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005435 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005436 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005437 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005438 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5439 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005440 })
5441
5442 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5443 bp := `
5444 apex {
5445 name: "myapex",
5446 enabled: false,
5447 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005448 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005449 }
5450
5451 apex_key {
5452 name: "myapex.key",
5453 public_key: "testkey.avbpubkey",
5454 private_key: "testkey.pem",
5455 }
5456
5457 prebuilt_apex {
5458 name: "myapex",
5459 arch: {
5460 arm64: {
5461 src: "myapex-arm64.apex",
5462 },
5463 arm: {
5464 src: "myapex-arm.apex",
5465 },
5466 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005467 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5468 }
5469
5470 prebuilt_bootclasspath_fragment {
5471 name: "my-bootclasspath-fragment",
5472 contents: ["libfoo", "libbar"],
5473 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005474 hidden_api: {
5475 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5476 metadata: "my-bootclasspath-fragment/metadata.csv",
5477 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005478 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5479 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5480 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005481 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005482 }
5483
5484 java_import {
5485 name: "libfoo",
5486 prefer: true,
5487 jars: ["libfoo.jar"],
5488 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005489 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005490 }
5491
5492 java_library {
5493 name: "libfoo",
5494 srcs: ["foo/bar/MyClass.java"],
5495 apex_available: ["myapex"],
5496 }
Paul Duffin37856732021-02-26 14:24:15 +00005497
5498 java_sdk_library_import {
5499 name: "libbar",
5500 prefer: true,
5501 public: {
5502 jars: ["libbar.jar"],
5503 },
5504 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005505 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005506 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005507 }
5508
5509 java_sdk_library {
5510 name: "libbar",
5511 srcs: ["foo/bar/MyClass.java"],
5512 unsafe_ignore_missing_latest_api: true,
5513 apex_available: ["myapex"],
5514 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005515 `
5516
Paul Duffin89f570a2021-06-16 01:42:33 +01005517 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005518 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5519 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005520
Paul Duffin537ea3d2021-05-14 10:38:00 +01005521 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005522 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005523 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005524 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005525 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5526 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005527 })
5528}
5529
Roland Levillain630846d2019-06-26 12:48:34 +01005530func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005531 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005532 apex_test {
5533 name: "myapex",
5534 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005535 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005536 tests: [
5537 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005538 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005539 ],
5540 }
5541
5542 apex_key {
5543 name: "myapex.key",
5544 public_key: "testkey.avbpubkey",
5545 private_key: "testkey.pem",
5546 }
5547
Liz Kammer1c14a212020-05-12 15:26:55 -07005548 filegroup {
5549 name: "fg",
5550 srcs: [
5551 "baz",
5552 "bar/baz"
5553 ],
5554 }
5555
Roland Levillain630846d2019-06-26 12:48:34 +01005556 cc_test {
5557 name: "mytest",
5558 gtest: false,
5559 srcs: ["mytest.cpp"],
5560 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005561 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005562 system_shared_libs: [],
5563 static_executable: true,
5564 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005565 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005566 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005567
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005568 cc_library {
5569 name: "mylib",
5570 srcs: ["mylib.cpp"],
5571 system_shared_libs: [],
5572 stl: "none",
5573 }
5574
Liz Kammer5bd365f2020-05-27 15:15:11 -07005575 filegroup {
5576 name: "fg2",
5577 srcs: [
5578 "testdata/baz"
5579 ],
5580 }
5581
Roland Levillain9b5fde92019-06-28 15:41:19 +01005582 cc_test {
5583 name: "mytests",
5584 gtest: false,
5585 srcs: [
5586 "mytest1.cpp",
5587 "mytest2.cpp",
5588 "mytest3.cpp",
5589 ],
5590 test_per_src: true,
5591 relative_install_path: "test",
5592 system_shared_libs: [],
5593 static_executable: true,
5594 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005595 data: [
5596 ":fg",
5597 ":fg2",
5598 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005599 }
Roland Levillain630846d2019-06-26 12:48:34 +01005600 `)
5601
Sundong Ahnabb64432019-10-22 13:58:29 +09005602 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005603 copyCmds := apexRule.Args["copy_commands"]
5604
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005605 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005606 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005607 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005608
Liz Kammer1c14a212020-05-12 15:26:55 -07005609 //Ensure that test data are copied into apex.
5610 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5611 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5612
Roland Levillain9b5fde92019-06-28 15:41:19 +01005613 // Ensure that test deps built with `test_per_src` are copied into apex.
5614 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5615 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5616 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005617
5618 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005619 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005620 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005621 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005622 prefix := "TARGET_"
5623 var builder strings.Builder
5624 data.Custom(&builder, name, prefix, "", data)
5625 androidMk := builder.String()
Roland Levillainf89cd092019-07-29 16:22:59 +01005626 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005627
5628 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005629 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005630 data.Custom(&builder, name, prefix, "", data)
5631 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005632 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5633 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005634}
5635
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005636func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005637 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005638 apex {
5639 name: "myapex",
5640 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005641 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005642 }
5643 apex_key {
5644 name: "myapex.key",
5645 public_key: "testkey.avbpubkey",
5646 private_key: "testkey.pem",
5647 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005648 `,
5649 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5650 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5651 }),
5652 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005653 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005654 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005655 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005656 var builder strings.Builder
5657 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5658 androidMk := builder.String()
5659 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5660}
5661
Jooyung Hand48f3c32019-08-23 11:18:57 +09005662func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5663 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5664 apex {
5665 name: "myapex",
5666 key: "myapex.key",
5667 native_shared_libs: ["libfoo"],
5668 }
5669
5670 apex_key {
5671 name: "myapex.key",
5672 public_key: "testkey.avbpubkey",
5673 private_key: "testkey.pem",
5674 }
5675
5676 cc_library {
5677 name: "libfoo",
5678 stl: "none",
5679 system_shared_libs: [],
5680 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005681 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005682 }
5683 `)
5684 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5685 apex {
5686 name: "myapex",
5687 key: "myapex.key",
5688 java_libs: ["myjar"],
5689 }
5690
5691 apex_key {
5692 name: "myapex.key",
5693 public_key: "testkey.avbpubkey",
5694 private_key: "testkey.pem",
5695 }
5696
5697 java_library {
5698 name: "myjar",
5699 srcs: ["foo/bar/MyClass.java"],
5700 sdk_version: "none",
5701 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005702 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005703 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005704 }
5705 `)
5706}
5707
Bill Peckhama41a6962021-01-11 10:58:54 -08005708func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005709 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005710 apex {
5711 name: "myapex",
5712 key: "myapex.key",
5713 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005714 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005715 }
5716
5717 apex_key {
5718 name: "myapex.key",
5719 public_key: "testkey.avbpubkey",
5720 private_key: "testkey.pem",
5721 }
5722
5723 java_import {
5724 name: "myjavaimport",
5725 apex_available: ["myapex"],
5726 jars: ["my.jar"],
5727 compile_dex: true,
5728 }
5729 `)
5730
5731 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5732 apexRule := module.Rule("apexRule")
5733 copyCmds := apexRule.Args["copy_commands"]
5734 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5735}
5736
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005737func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005738 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005739 apex {
5740 name: "myapex",
5741 key: "myapex.key",
5742 apps: [
5743 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005744 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005745 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005746 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005747 }
5748
5749 apex_key {
5750 name: "myapex.key",
5751 public_key: "testkey.avbpubkey",
5752 private_key: "testkey.pem",
5753 }
5754
5755 android_app {
5756 name: "AppFoo",
5757 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005758 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005759 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005760 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005761 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005762 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005763 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005764
5765 android_app {
5766 name: "AppFooPriv",
5767 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005768 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005769 system_modules: "none",
5770 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005771 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005772 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005773 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005774
5775 cc_library_shared {
5776 name: "libjni",
5777 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005778 shared_libs: ["libfoo"],
5779 stl: "none",
5780 system_shared_libs: [],
5781 apex_available: [ "myapex" ],
5782 sdk_version: "current",
5783 }
5784
5785 cc_library_shared {
5786 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005787 stl: "none",
5788 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005789 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005790 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005791 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005792 `)
5793
Sundong Ahnabb64432019-10-22 13:58:29 +09005794 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005795 apexRule := module.Rule("apexRule")
5796 copyCmds := apexRule.Args["copy_commands"]
5797
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005798 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5799 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005800
Colin Crossaede88c2020-08-11 12:17:01 -07005801 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005802 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005803 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005804 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005805 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005806 // JNI libraries including transitive deps are
5807 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005808 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005809 // ... embedded inside APK (jnilibs.zip)
5810 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5811 // ... and not directly inside the APEX
5812 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5813 }
Dario Frenicde2a032019-10-27 00:29:22 +01005814}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005815
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005816func TestApexWithAppImportBuildId(t *testing.T) {
5817 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5818 for _, id := range invalidBuildIds {
5819 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5820 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5821 variables.BuildId = proptools.StringPtr(id)
5822 })
5823 testApexError(t, message, `apex {
5824 name: "myapex",
5825 key: "myapex.key",
5826 apps: ["AppFooPrebuilt"],
5827 updatable: false,
5828 }
5829
5830 apex_key {
5831 name: "myapex.key",
5832 public_key: "testkey.avbpubkey",
5833 private_key: "testkey.pem",
5834 }
5835
5836 android_app_import {
5837 name: "AppFooPrebuilt",
5838 apk: "PrebuiltAppFoo.apk",
5839 presigned: true,
5840 apex_available: ["myapex"],
5841 }
5842 `, fixture)
5843 }
5844}
5845
Dario Frenicde2a032019-10-27 00:29:22 +01005846func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005847 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005848 apex {
5849 name: "myapex",
5850 key: "myapex.key",
5851 apps: [
5852 "AppFooPrebuilt",
5853 "AppFooPrivPrebuilt",
5854 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005855 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005856 }
5857
5858 apex_key {
5859 name: "myapex.key",
5860 public_key: "testkey.avbpubkey",
5861 private_key: "testkey.pem",
5862 }
5863
5864 android_app_import {
5865 name: "AppFooPrebuilt",
5866 apk: "PrebuiltAppFoo.apk",
5867 presigned: true,
5868 dex_preopt: {
5869 enabled: false,
5870 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005871 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005872 }
5873
5874 android_app_import {
5875 name: "AppFooPrivPrebuilt",
5876 apk: "PrebuiltAppFooPriv.apk",
5877 privileged: true,
5878 presigned: true,
5879 dex_preopt: {
5880 enabled: false,
5881 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005882 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005883 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005884 }
5885 `)
5886
Sundong Ahnabb64432019-10-22 13:58:29 +09005887 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005888 apexRule := module.Rule("apexRule")
5889 copyCmds := apexRule.Args["copy_commands"]
5890
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005891 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5892 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005893}
5894
5895func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005896 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005897 apex {
5898 name: "myapex",
5899 key: "myapex.key",
5900 apps: [
5901 "AppFoo",
5902 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005903 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005904 }
5905
5906 apex_key {
5907 name: "myapex.key",
5908 public_key: "testkey.avbpubkey",
5909 private_key: "testkey.pem",
5910 }
5911
5912 android_app {
5913 name: "AppFoo",
5914 srcs: ["foo/bar/MyClass.java"],
5915 sdk_version: "none",
5916 system_modules: "none",
5917 apex_available: [ "myapex" ],
5918 }
5919
5920 android_app_import {
5921 name: "AppFoo",
5922 apk: "AppFooPrebuilt.apk",
5923 filename: "AppFooPrebuilt.apk",
5924 presigned: true,
5925 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005926 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005927 }
5928 `, withFiles(map[string][]byte{
5929 "AppFooPrebuilt.apk": nil,
5930 }))
5931
5932 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005933 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005934 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005935}
5936
Dario Freni6f3937c2019-12-20 22:58:03 +00005937func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005938 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005939 apex {
5940 name: "myapex",
5941 key: "myapex.key",
5942 apps: [
5943 "TesterHelpAppFoo",
5944 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005945 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005946 }
5947
5948 apex_key {
5949 name: "myapex.key",
5950 public_key: "testkey.avbpubkey",
5951 private_key: "testkey.pem",
5952 }
5953
5954 android_test_helper_app {
5955 name: "TesterHelpAppFoo",
5956 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005957 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005958 }
5959
5960 `)
5961
5962 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5963 apexRule := module.Rule("apexRule")
5964 copyCmds := apexRule.Args["copy_commands"]
5965
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005966 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005967}
5968
Jooyung Han18020ea2019-11-13 10:50:48 +09005969func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5970 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005971 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005972 apex {
5973 name: "myapex",
5974 key: "myapex.key",
5975 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005976 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005977 }
5978
5979 apex_key {
5980 name: "myapex.key",
5981 public_key: "testkey.avbpubkey",
5982 private_key: "testkey.pem",
5983 }
5984
5985 apex {
5986 name: "otherapex",
5987 key: "myapex.key",
5988 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005989 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005990 }
5991
5992 cc_defaults {
5993 name: "libfoo-defaults",
5994 apex_available: ["otherapex"],
5995 }
5996
5997 cc_library {
5998 name: "libfoo",
5999 defaults: ["libfoo-defaults"],
6000 stl: "none",
6001 system_shared_libs: [],
6002 }`)
6003}
6004
Paul Duffine52e66f2020-03-30 17:54:29 +01006005func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006006 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006007 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006008 apex {
6009 name: "myapex",
6010 key: "myapex.key",
6011 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006012 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006013 }
6014
6015 apex_key {
6016 name: "myapex.key",
6017 public_key: "testkey.avbpubkey",
6018 private_key: "testkey.pem",
6019 }
6020
6021 apex {
6022 name: "otherapex",
6023 key: "otherapex.key",
6024 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006025 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006026 }
6027
6028 apex_key {
6029 name: "otherapex.key",
6030 public_key: "testkey.avbpubkey",
6031 private_key: "testkey.pem",
6032 }
6033
6034 cc_library {
6035 name: "libfoo",
6036 stl: "none",
6037 system_shared_libs: [],
6038 apex_available: ["otherapex"],
6039 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006040}
Jiyong Park127b40b2019-09-30 16:04:35 +09006041
Paul Duffine52e66f2020-03-30 17:54:29 +01006042func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006043 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006044 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006045.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006046.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006047.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006048.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006049.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006050.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006051 apex {
6052 name: "myapex",
6053 key: "myapex.key",
6054 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006055 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006056 }
6057
6058 apex_key {
6059 name: "myapex.key",
6060 public_key: "testkey.avbpubkey",
6061 private_key: "testkey.pem",
6062 }
6063
Jiyong Park127b40b2019-09-30 16:04:35 +09006064 cc_library {
6065 name: "libfoo",
6066 stl: "none",
6067 shared_libs: ["libbar"],
6068 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006069 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006070 }
6071
6072 cc_library {
6073 name: "libbar",
6074 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006075 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006076 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006077 apex_available: ["myapex"],
6078 }
6079
6080 cc_library {
6081 name: "libbaz",
6082 stl: "none",
6083 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006084 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006085}
Jiyong Park127b40b2019-09-30 16:04:35 +09006086
Paul Duffine52e66f2020-03-30 17:54:29 +01006087func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006088 testApexError(t, "\"otherapex\" is not a valid module name", `
6089 apex {
6090 name: "myapex",
6091 key: "myapex.key",
6092 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006093 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006094 }
6095
6096 apex_key {
6097 name: "myapex.key",
6098 public_key: "testkey.avbpubkey",
6099 private_key: "testkey.pem",
6100 }
6101
6102 cc_library {
6103 name: "libfoo",
6104 stl: "none",
6105 system_shared_libs: [],
6106 apex_available: ["otherapex"],
6107 }`)
6108
Paul Duffine52e66f2020-03-30 17:54:29 +01006109 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006110 apex {
6111 name: "myapex",
6112 key: "myapex.key",
6113 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006114 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006115 }
6116
6117 apex_key {
6118 name: "myapex.key",
6119 public_key: "testkey.avbpubkey",
6120 private_key: "testkey.pem",
6121 }
6122
6123 cc_library {
6124 name: "libfoo",
6125 stl: "none",
6126 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006127 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006128 apex_available: ["myapex"],
6129 }
6130
6131 cc_library {
6132 name: "libbar",
6133 stl: "none",
6134 system_shared_libs: [],
6135 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006136 }
6137
6138 cc_library {
6139 name: "libbaz",
6140 stl: "none",
6141 system_shared_libs: [],
6142 stubs: {
6143 versions: ["10", "20", "30"],
6144 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006145 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006146}
Jiyong Park127b40b2019-09-30 16:04:35 +09006147
Jiyong Park89e850a2020-04-07 16:37:39 +09006148func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006149 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006150 apex {
6151 name: "myapex",
6152 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006153 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006154 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006155 }
6156
6157 apex_key {
6158 name: "myapex.key",
6159 public_key: "testkey.avbpubkey",
6160 private_key: "testkey.pem",
6161 }
6162
6163 cc_library {
6164 name: "libfoo",
6165 stl: "none",
6166 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006167 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006168 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006169 }
6170
6171 cc_library {
6172 name: "libfoo2",
6173 stl: "none",
6174 system_shared_libs: [],
6175 shared_libs: ["libbaz"],
6176 apex_available: ["//apex_available:platform"],
6177 }
6178
6179 cc_library {
6180 name: "libbar",
6181 stl: "none",
6182 system_shared_libs: [],
6183 apex_available: ["myapex"],
6184 }
6185
6186 cc_library {
6187 name: "libbaz",
6188 stl: "none",
6189 system_shared_libs: [],
6190 apex_available: ["myapex"],
6191 stubs: {
6192 versions: ["1"],
6193 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006194 }`)
6195
Jiyong Park89e850a2020-04-07 16:37:39 +09006196 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6197 // because it depends on libbar which isn't available to platform
6198 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6199 if libfoo.NotAvailableForPlatform() != true {
6200 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6201 }
6202
6203 // libfoo2 however can be available to platform because it depends on libbaz which provides
6204 // stubs
6205 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6206 if libfoo2.NotAvailableForPlatform() == true {
6207 t.Errorf("%q should be available to platform", libfoo2.String())
6208 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006209}
Jiyong Parka90ca002019-10-07 15:47:24 +09006210
Paul Duffine52e66f2020-03-30 17:54:29 +01006211func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006212 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006213 apex {
6214 name: "myapex",
6215 key: "myapex.key",
6216 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006217 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006218 }
6219
6220 apex_key {
6221 name: "myapex.key",
6222 public_key: "testkey.avbpubkey",
6223 private_key: "testkey.pem",
6224 }
6225
6226 cc_library {
6227 name: "libfoo",
6228 stl: "none",
6229 system_shared_libs: [],
6230 apex_available: ["myapex"],
6231 static: {
6232 apex_available: ["//apex_available:platform"],
6233 },
6234 }`)
6235
Jiyong Park89e850a2020-04-07 16:37:39 +09006236 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6237 if libfooShared.NotAvailableForPlatform() != true {
6238 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6239 }
6240 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6241 if libfooStatic.NotAvailableForPlatform() != false {
6242 t.Errorf("%q should be available to platform", libfooStatic.String())
6243 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006244}
6245
Jiyong Park5d790c32019-11-15 18:40:32 +09006246func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006247 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006248 apex {
6249 name: "myapex",
6250 key: "myapex.key",
6251 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006252 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006253 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006254 bootclasspath_fragments: ["mybootclasspath_fragment"],
6255 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6256 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006257 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006258 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006259 }
6260
6261 override_apex {
6262 name: "override_myapex",
6263 base: "myapex",
6264 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006265 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006266 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006267 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6268 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6269 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006270 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006271 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006272 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006273 key: "mynewapex.key",
6274 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006275 }
6276
6277 apex_key {
6278 name: "myapex.key",
6279 public_key: "testkey.avbpubkey",
6280 private_key: "testkey.pem",
6281 }
6282
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006283 apex_key {
6284 name: "mynewapex.key",
6285 public_key: "testkey2.avbpubkey",
6286 private_key: "testkey2.pem",
6287 }
6288
6289 android_app_certificate {
6290 name: "myapex.certificate",
6291 certificate: "testkey",
6292 }
6293
Jiyong Park5d790c32019-11-15 18:40:32 +09006294 android_app {
6295 name: "app",
6296 srcs: ["foo/bar/MyClass.java"],
6297 package_name: "foo",
6298 sdk_version: "none",
6299 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006300 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006301 }
6302
6303 override_android_app {
6304 name: "override_app",
6305 base: "app",
6306 package_name: "bar",
6307 }
markchien7c803b82021-08-26 22:10:06 +08006308
6309 bpf {
6310 name: "bpf",
6311 srcs: ["bpf.c"],
6312 }
6313
6314 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006315 name: "overrideBpf",
6316 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006317 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006318
6319 prebuilt_etc {
6320 name: "myetc",
6321 src: "myprebuilt",
6322 }
6323
6324 prebuilt_etc {
6325 name: "override_myetc",
6326 src: "override_myprebuilt",
6327 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006328
6329 java_library {
6330 name: "bcplib",
6331 srcs: ["a.java"],
6332 compile_dex: true,
6333 apex_available: ["myapex"],
6334 permitted_packages: ["bcp.lib"],
6335 }
6336
6337 bootclasspath_fragment {
6338 name: "mybootclasspath_fragment",
6339 contents: ["bcplib"],
6340 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006341 hidden_api: {
6342 split_packages: ["*"],
6343 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006344 }
6345
6346 java_library {
6347 name: "override_bcplib",
6348 srcs: ["a.java"],
6349 compile_dex: true,
6350 apex_available: ["myapex"],
6351 permitted_packages: ["override.bcp.lib"],
6352 }
6353
6354 bootclasspath_fragment {
6355 name: "override_bootclasspath_fragment",
6356 contents: ["override_bcplib"],
6357 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006358 hidden_api: {
6359 split_packages: ["*"],
6360 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006361 }
6362
6363 java_library {
6364 name: "systemserverlib",
6365 srcs: ["a.java"],
6366 apex_available: ["myapex"],
6367 }
6368
6369 systemserverclasspath_fragment {
6370 name: "mysystemserverclasspath_fragment",
6371 standalone_contents: ["systemserverlib"],
6372 apex_available: ["myapex"],
6373 }
6374
6375 java_library {
6376 name: "override_systemserverlib",
6377 srcs: ["a.java"],
6378 apex_available: ["myapex"],
6379 }
6380
6381 systemserverclasspath_fragment {
6382 name: "override_systemserverclasspath_fragment",
6383 standalone_contents: ["override_systemserverlib"],
6384 apex_available: ["myapex"],
6385 }
6386
6387 java_library {
6388 name: "myjava_library",
6389 srcs: ["a.java"],
6390 compile_dex: true,
6391 apex_available: ["myapex"],
6392 }
6393
6394 java_library {
6395 name: "override_java_library",
6396 srcs: ["a.java"],
6397 compile_dex: true,
6398 apex_available: ["myapex"],
6399 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006400 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006401
Jiyong Park317645e2019-12-05 13:20:58 +09006402 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6403 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6404 if originalVariant.GetOverriddenBy() != "" {
6405 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6406 }
6407 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6408 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6409 }
6410
Jiyong Park5d790c32019-11-15 18:40:32 +09006411 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6412 apexRule := module.Rule("apexRule")
6413 copyCmds := apexRule.Args["copy_commands"]
6414
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006415 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6416 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006417
markchien7c803b82021-08-26 22:10:06 +08006418 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006419 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006420
Daniel Norman5a3ce132021-08-26 15:44:43 -07006421 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6422 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6423
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006424 apexBundle := module.Module().(*apexBundle)
6425 name := apexBundle.Name()
6426 if name != "override_myapex" {
6427 t.Errorf("name should be \"override_myapex\", but was %q", name)
6428 }
6429
Baligh Uddin004d7172020-02-19 21:29:28 -08006430 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6431 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6432 }
6433
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006434 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6435 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6436 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6437 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6438 android.AssertArrayString(t, "Java_libs does not match",
6439 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6440
Jiyong Park20bacab2020-03-03 11:45:41 +09006441 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006442 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006443 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6444
6445 signApkRule := module.Rule("signapk")
6446 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006447
Colin Crossaa255532020-07-03 13:18:24 -07006448 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006449 var builder strings.Builder
6450 data.Custom(&builder, name, "TARGET_", "", data)
6451 androidMk := builder.String()
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006452 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006453 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006454 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006455 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006456 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006457 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006458 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6459 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6460 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006461 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006462}
6463
Albert Martineefabcf2022-03-21 20:11:16 +00006464func TestMinSdkVersionOverride(t *testing.T) {
6465 // Override from 29 to 31
6466 minSdkOverride31 := "31"
6467 ctx := testApex(t, `
6468 apex {
6469 name: "myapex",
6470 key: "myapex.key",
6471 native_shared_libs: ["mylib"],
6472 updatable: true,
6473 min_sdk_version: "29"
6474 }
6475
6476 override_apex {
6477 name: "override_myapex",
6478 base: "myapex",
6479 logging_parent: "com.foo.bar",
6480 package_name: "test.overridden.package"
6481 }
6482
6483 apex_key {
6484 name: "myapex.key",
6485 public_key: "testkey.avbpubkey",
6486 private_key: "testkey.pem",
6487 }
6488
6489 cc_library {
6490 name: "mylib",
6491 srcs: ["mylib.cpp"],
6492 runtime_libs: ["libbar"],
6493 system_shared_libs: [],
6494 stl: "none",
6495 apex_available: [ "myapex" ],
6496 min_sdk_version: "apex_inherit"
6497 }
6498
6499 cc_library {
6500 name: "libbar",
6501 srcs: ["mylib.cpp"],
6502 system_shared_libs: [],
6503 stl: "none",
6504 apex_available: [ "myapex" ],
6505 min_sdk_version: "apex_inherit"
6506 }
6507
6508 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6509
6510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6511 copyCmds := apexRule.Args["copy_commands"]
6512
6513 // Ensure that direct non-stubs dep is always included
6514 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6515
6516 // Ensure that runtime_libs dep in included
6517 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6518
6519 // Ensure libraries target overridden min_sdk_version value
6520 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6521}
6522
6523func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6524 // Attempt to override from 31 to 29, should be a NOOP
6525 minSdkOverride29 := "29"
6526 ctx := testApex(t, `
6527 apex {
6528 name: "myapex",
6529 key: "myapex.key",
6530 native_shared_libs: ["mylib"],
6531 updatable: true,
6532 min_sdk_version: "31"
6533 }
6534
6535 override_apex {
6536 name: "override_myapex",
6537 base: "myapex",
6538 logging_parent: "com.foo.bar",
6539 package_name: "test.overridden.package"
6540 }
6541
6542 apex_key {
6543 name: "myapex.key",
6544 public_key: "testkey.avbpubkey",
6545 private_key: "testkey.pem",
6546 }
6547
6548 cc_library {
6549 name: "mylib",
6550 srcs: ["mylib.cpp"],
6551 runtime_libs: ["libbar"],
6552 system_shared_libs: [],
6553 stl: "none",
6554 apex_available: [ "myapex" ],
6555 min_sdk_version: "apex_inherit"
6556 }
6557
6558 cc_library {
6559 name: "libbar",
6560 srcs: ["mylib.cpp"],
6561 system_shared_libs: [],
6562 stl: "none",
6563 apex_available: [ "myapex" ],
6564 min_sdk_version: "apex_inherit"
6565 }
6566
6567 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6568
6569 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6570 copyCmds := apexRule.Args["copy_commands"]
6571
6572 // Ensure that direct non-stubs dep is always included
6573 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6574
6575 // Ensure that runtime_libs dep in included
6576 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6577
6578 // Ensure libraries target the original min_sdk_version value rather than the overridden
6579 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6580}
6581
Jooyung Han214bf372019-11-12 13:03:50 +09006582func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006583 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006584 apex {
6585 name: "myapex",
6586 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006587 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006588 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006589 }
6590
6591 apex_key {
6592 name: "myapex.key",
6593 public_key: "testkey.avbpubkey",
6594 private_key: "testkey.pem",
6595 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006596
6597 cc_library {
6598 name: "mylib",
6599 srcs: ["mylib.cpp"],
6600 stl: "libc++",
6601 system_shared_libs: [],
6602 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006603 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006604 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006605 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006606
6607 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6608 args := module.Rule("apexRule").Args
6609 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006610 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006611
6612 // The copies of the libraries in the apex should have one more dependency than
6613 // the ones outside the apex, namely the unwinder. Ideally we should check
6614 // the dependency names directly here but for some reason the names are blank in
6615 // this test.
6616 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006617 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006618 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6619 if len(apexImplicits) != len(nonApexImplicits)+1 {
6620 t.Errorf("%q missing unwinder dep", lib)
6621 }
6622 }
Jooyung Han214bf372019-11-12 13:03:50 +09006623}
6624
Paul Duffine05480a2021-03-08 15:07:14 +00006625var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006626 "api/current.txt": nil,
6627 "api/removed.txt": nil,
6628 "api/system-current.txt": nil,
6629 "api/system-removed.txt": nil,
6630 "api/test-current.txt": nil,
6631 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006632
Anton Hanssondff2c782020-12-21 17:10:01 +00006633 "100/public/api/foo.txt": nil,
6634 "100/public/api/foo-removed.txt": nil,
6635 "100/system/api/foo.txt": nil,
6636 "100/system/api/foo-removed.txt": nil,
6637
Paul Duffineedc5d52020-06-12 17:46:39 +01006638 // For java_sdk_library_import
6639 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006640}
6641
Jooyung Han58f26ab2019-12-18 15:34:32 +09006642func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006643 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006644 apex {
6645 name: "myapex",
6646 key: "myapex.key",
6647 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006648 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006649 }
6650
6651 apex_key {
6652 name: "myapex.key",
6653 public_key: "testkey.avbpubkey",
6654 private_key: "testkey.pem",
6655 }
6656
6657 java_sdk_library {
6658 name: "foo",
6659 srcs: ["a.java"],
6660 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006661 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006662 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006663
6664 prebuilt_apis {
6665 name: "sdk",
6666 api_dirs: ["100"],
6667 }
Paul Duffin9b879592020-05-26 13:21:35 +01006668 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006669
6670 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006671 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006672 "javalib/foo.jar",
6673 "etc/permissions/foo.xml",
6674 })
6675 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006676 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006677 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 +09006678}
6679
Paul Duffin9b879592020-05-26 13:21:35 +01006680func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006681 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006682 apex {
6683 name: "myapex",
6684 key: "myapex.key",
6685 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006686 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006687 }
6688
6689 apex_key {
6690 name: "myapex.key",
6691 public_key: "testkey.avbpubkey",
6692 private_key: "testkey.pem",
6693 }
6694
6695 java_sdk_library {
6696 name: "foo",
6697 srcs: ["a.java"],
6698 api_packages: ["foo"],
6699 apex_available: ["myapex"],
6700 sdk_version: "none",
6701 system_modules: "none",
6702 }
6703
6704 java_library {
6705 name: "bar",
6706 srcs: ["a.java"],
6707 libs: ["foo"],
6708 apex_available: ["myapex"],
6709 sdk_version: "none",
6710 system_modules: "none",
6711 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006712
6713 prebuilt_apis {
6714 name: "sdk",
6715 api_dirs: ["100"],
6716 }
Paul Duffin9b879592020-05-26 13:21:35 +01006717 `, withFiles(filesForSdkLibrary))
6718
6719 // java_sdk_library installs both impl jar and permission XML
6720 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6721 "javalib/bar.jar",
6722 "javalib/foo.jar",
6723 "etc/permissions/foo.xml",
6724 })
6725
6726 // The bar library should depend on the implementation jar.
6727 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006728 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006729 t.Errorf("expected %q, found %#q", expected, actual)
6730 }
6731}
6732
6733func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006734 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006735 apex {
6736 name: "myapex",
6737 key: "myapex.key",
6738 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006739 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006740 }
6741
6742 apex_key {
6743 name: "myapex.key",
6744 public_key: "testkey.avbpubkey",
6745 private_key: "testkey.pem",
6746 }
6747
6748 java_sdk_library {
6749 name: "foo",
6750 srcs: ["a.java"],
6751 api_packages: ["foo"],
6752 apex_available: ["myapex"],
6753 sdk_version: "none",
6754 system_modules: "none",
6755 }
6756
6757 java_library {
6758 name: "bar",
6759 srcs: ["a.java"],
6760 libs: ["foo"],
6761 sdk_version: "none",
6762 system_modules: "none",
6763 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006764
6765 prebuilt_apis {
6766 name: "sdk",
6767 api_dirs: ["100"],
6768 }
Paul Duffin9b879592020-05-26 13:21:35 +01006769 `, withFiles(filesForSdkLibrary))
6770
6771 // java_sdk_library installs both impl jar and permission XML
6772 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6773 "javalib/foo.jar",
6774 "etc/permissions/foo.xml",
6775 })
6776
6777 // The bar library should depend on the stubs jar.
6778 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006779 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006780 t.Errorf("expected %q, found %#q", expected, actual)
6781 }
6782}
6783
Paul Duffineedc5d52020-06-12 17:46:39 +01006784func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006785 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006786 prebuilt_apis {
6787 name: "sdk",
6788 api_dirs: ["100"],
6789 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006790 withFiles(map[string][]byte{
6791 "apex/a.java": nil,
6792 "apex/apex_manifest.json": nil,
6793 "apex/Android.bp": []byte(`
6794 package {
6795 default_visibility: ["//visibility:private"],
6796 }
6797
6798 apex {
6799 name: "myapex",
6800 key: "myapex.key",
6801 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006802 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006803 }
6804
6805 apex_key {
6806 name: "myapex.key",
6807 public_key: "testkey.avbpubkey",
6808 private_key: "testkey.pem",
6809 }
6810
6811 java_library {
6812 name: "bar",
6813 srcs: ["a.java"],
6814 libs: ["foo"],
6815 apex_available: ["myapex"],
6816 sdk_version: "none",
6817 system_modules: "none",
6818 }
6819`),
6820 "source/a.java": nil,
6821 "source/api/current.txt": nil,
6822 "source/api/removed.txt": nil,
6823 "source/Android.bp": []byte(`
6824 package {
6825 default_visibility: ["//visibility:private"],
6826 }
6827
6828 java_sdk_library {
6829 name: "foo",
6830 visibility: ["//apex"],
6831 srcs: ["a.java"],
6832 api_packages: ["foo"],
6833 apex_available: ["myapex"],
6834 sdk_version: "none",
6835 system_modules: "none",
6836 public: {
6837 enabled: true,
6838 },
6839 }
6840`),
6841 "prebuilt/a.jar": nil,
6842 "prebuilt/Android.bp": []byte(`
6843 package {
6844 default_visibility: ["//visibility:private"],
6845 }
6846
6847 java_sdk_library_import {
6848 name: "foo",
6849 visibility: ["//apex", "//source"],
6850 apex_available: ["myapex"],
6851 prefer: true,
6852 public: {
6853 jars: ["a.jar"],
6854 },
6855 }
6856`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006857 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006858 )
6859
6860 // java_sdk_library installs both impl jar and permission XML
6861 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6862 "javalib/bar.jar",
6863 "javalib/foo.jar",
6864 "etc/permissions/foo.xml",
6865 })
6866
6867 // The bar library should depend on the implementation jar.
6868 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006869 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006870 t.Errorf("expected %q, found %#q", expected, actual)
6871 }
6872}
6873
6874func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6875 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6876 apex {
6877 name: "myapex",
6878 key: "myapex.key",
6879 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006880 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006881 }
6882
6883 apex_key {
6884 name: "myapex.key",
6885 public_key: "testkey.avbpubkey",
6886 private_key: "testkey.pem",
6887 }
6888
6889 java_sdk_library_import {
6890 name: "foo",
6891 apex_available: ["myapex"],
6892 prefer: true,
6893 public: {
6894 jars: ["a.jar"],
6895 },
6896 }
6897
6898 `, withFiles(filesForSdkLibrary))
6899}
6900
atrost6e126252020-01-27 17:01:16 +00006901func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006902 result := android.GroupFixturePreparers(
6903 prepareForApexTest,
6904 java.PrepareForTestWithPlatformCompatConfig,
6905 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006906 apex {
6907 name: "myapex",
6908 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006909 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006910 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006911 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006912 }
6913
6914 apex_key {
6915 name: "myapex.key",
6916 public_key: "testkey.avbpubkey",
6917 private_key: "testkey.pem",
6918 }
6919
6920 platform_compat_config {
6921 name: "myjar-platform-compat-config",
6922 src: ":myjar",
6923 }
6924
6925 java_library {
6926 name: "myjar",
6927 srcs: ["foo/bar/MyClass.java"],
6928 sdk_version: "none",
6929 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006930 apex_available: [ "myapex" ],
6931 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006932
6933 // Make sure that a preferred prebuilt does not affect the apex contents.
6934 prebuilt_platform_compat_config {
6935 name: "myjar-platform-compat-config",
6936 metadata: "compat-config/metadata.xml",
6937 prefer: true,
6938 }
atrost6e126252020-01-27 17:01:16 +00006939 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006940 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006941 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6942 "etc/compatconfig/myjar-platform-compat-config.xml",
6943 "javalib/myjar.jar",
6944 })
6945}
6946
Jiyong Park479321d2019-12-16 11:47:12 +09006947func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6948 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6949 apex {
6950 name: "myapex",
6951 key: "myapex.key",
6952 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006953 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006954 }
6955
6956 apex_key {
6957 name: "myapex.key",
6958 public_key: "testkey.avbpubkey",
6959 private_key: "testkey.pem",
6960 }
6961
6962 java_library {
6963 name: "myjar",
6964 srcs: ["foo/bar/MyClass.java"],
6965 sdk_version: "none",
6966 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006967 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006968 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006969 }
6970 `)
6971}
6972
Jiyong Park7afd1072019-12-30 16:56:33 +09006973func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006974 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006975 apex {
6976 name: "myapex",
6977 key: "myapex.key",
6978 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006979 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006980 }
6981
6982 apex_key {
6983 name: "myapex.key",
6984 public_key: "testkey.avbpubkey",
6985 private_key: "testkey.pem",
6986 }
6987
6988 cc_library {
6989 name: "mylib",
6990 srcs: ["mylib.cpp"],
6991 system_shared_libs: [],
6992 stl: "none",
6993 required: ["a", "b"],
6994 host_required: ["c", "d"],
6995 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006996 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006997 }
6998 `)
6999
7000 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007001 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007002 name := apexBundle.BaseModuleName()
7003 prefix := "TARGET_"
7004 var builder strings.Builder
7005 data.Custom(&builder, name, prefix, "", data)
7006 androidMk := builder.String()
7007 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
7008 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
7009 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
7010}
7011
Jiyong Park7cd10e32020-01-14 09:22:18 +09007012func TestSymlinksFromApexToSystem(t *testing.T) {
7013 bp := `
7014 apex {
7015 name: "myapex",
7016 key: "myapex.key",
7017 native_shared_libs: ["mylib"],
7018 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007019 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007020 }
7021
Jiyong Park9d677202020-02-19 16:29:35 +09007022 apex {
7023 name: "myapex.updatable",
7024 key: "myapex.key",
7025 native_shared_libs: ["mylib"],
7026 java_libs: ["myjar"],
7027 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007028 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007029 }
7030
Jiyong Park7cd10e32020-01-14 09:22:18 +09007031 apex_key {
7032 name: "myapex.key",
7033 public_key: "testkey.avbpubkey",
7034 private_key: "testkey.pem",
7035 }
7036
7037 cc_library {
7038 name: "mylib",
7039 srcs: ["mylib.cpp"],
7040 shared_libs: ["myotherlib"],
7041 system_shared_libs: [],
7042 stl: "none",
7043 apex_available: [
7044 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007045 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007046 "//apex_available:platform",
7047 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007048 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007049 }
7050
7051 cc_library {
7052 name: "myotherlib",
7053 srcs: ["mylib.cpp"],
7054 system_shared_libs: [],
7055 stl: "none",
7056 apex_available: [
7057 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007058 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007059 "//apex_available:platform",
7060 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007061 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007062 }
7063
7064 java_library {
7065 name: "myjar",
7066 srcs: ["foo/bar/MyClass.java"],
7067 sdk_version: "none",
7068 system_modules: "none",
7069 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007070 apex_available: [
7071 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007072 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007073 "//apex_available:platform",
7074 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007075 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007076 }
7077
7078 java_library {
7079 name: "myotherjar",
7080 srcs: ["foo/bar/MyClass.java"],
7081 sdk_version: "none",
7082 system_modules: "none",
7083 apex_available: [
7084 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007085 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007086 "//apex_available:platform",
7087 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007088 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007089 }
7090 `
7091
7092 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7093 for _, f := range files {
7094 if f.path == file {
7095 if f.isLink {
7096 t.Errorf("%q is not a real file", file)
7097 }
7098 return
7099 }
7100 }
7101 t.Errorf("%q is not found", file)
7102 }
7103
7104 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7105 for _, f := range files {
7106 if f.path == file {
7107 if !f.isLink {
7108 t.Errorf("%q is not a symlink", file)
7109 }
7110 return
7111 }
7112 }
7113 t.Errorf("%q is not found", file)
7114 }
7115
Jiyong Park9d677202020-02-19 16:29:35 +09007116 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7117 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007118 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007119 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007120 ensureRealfileExists(t, files, "javalib/myjar.jar")
7121 ensureRealfileExists(t, files, "lib64/mylib.so")
7122 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7123
Jiyong Park9d677202020-02-19 16:29:35 +09007124 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7125 ensureRealfileExists(t, files, "javalib/myjar.jar")
7126 ensureRealfileExists(t, files, "lib64/mylib.so")
7127 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7128
7129 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007130 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007131 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007132 ensureRealfileExists(t, files, "javalib/myjar.jar")
7133 ensureRealfileExists(t, files, "lib64/mylib.so")
7134 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007135
7136 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7137 ensureRealfileExists(t, files, "javalib/myjar.jar")
7138 ensureRealfileExists(t, files, "lib64/mylib.so")
7139 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007140}
7141
Yo Chiange8128052020-07-23 20:09:18 +08007142func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007143 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007144 apex {
7145 name: "myapex",
7146 key: "myapex.key",
7147 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007148 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007149 }
7150
7151 apex_key {
7152 name: "myapex.key",
7153 public_key: "testkey.avbpubkey",
7154 private_key: "testkey.pem",
7155 }
7156
7157 cc_library_shared {
7158 name: "mylib",
7159 srcs: ["mylib.cpp"],
7160 shared_libs: ["myotherlib"],
7161 system_shared_libs: [],
7162 stl: "none",
7163 apex_available: [
7164 "myapex",
7165 "//apex_available:platform",
7166 ],
7167 }
7168
7169 cc_prebuilt_library_shared {
7170 name: "myotherlib",
7171 srcs: ["prebuilt.so"],
7172 system_shared_libs: [],
7173 stl: "none",
7174 apex_available: [
7175 "myapex",
7176 "//apex_available:platform",
7177 ],
7178 }
7179 `)
7180
Cole Faustb81814a2022-11-03 16:39:21 -07007181 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007182 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007183 var builder strings.Builder
7184 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7185 androidMk := builder.String()
7186 // `myotherlib` is added to `myapex` as symlink
Cole Faustb81814a2022-11-03 16:39:21 -07007187 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex.flattened\n")
Yo Chiange8128052020-07-23 20:09:18 +08007188 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7189 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7190 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Cole Faustb81814a2022-11-03 16:39:21 -07007191 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex.flattened:64 myotherlib:64 apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened\n")
Yo Chiange8128052020-07-23 20:09:18 +08007192}
7193
Jooyung Han643adc42020-02-27 13:50:06 +09007194func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007195 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007196 apex {
7197 name: "myapex",
7198 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007199 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007200 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007201 }
7202
7203 apex_key {
7204 name: "myapex.key",
7205 public_key: "testkey.avbpubkey",
7206 private_key: "testkey.pem",
7207 }
7208
7209 cc_library {
7210 name: "mylib",
7211 srcs: ["mylib.cpp"],
7212 shared_libs: ["mylib2"],
7213 system_shared_libs: [],
7214 stl: "none",
7215 apex_available: [ "myapex" ],
7216 }
7217
7218 cc_library {
7219 name: "mylib2",
7220 srcs: ["mylib.cpp"],
7221 system_shared_libs: [],
7222 stl: "none",
7223 apex_available: [ "myapex" ],
7224 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007225
7226 rust_ffi_shared {
7227 name: "libfoo.rust",
7228 crate_name: "foo",
7229 srcs: ["foo.rs"],
7230 shared_libs: ["libfoo.shared_from_rust"],
7231 prefer_rlib: true,
7232 apex_available: ["myapex"],
7233 }
7234
7235 cc_library_shared {
7236 name: "libfoo.shared_from_rust",
7237 srcs: ["mylib.cpp"],
7238 system_shared_libs: [],
7239 stl: "none",
7240 stubs: {
7241 versions: ["10", "11", "12"],
7242 },
7243 }
7244
Jooyung Han643adc42020-02-27 13:50:06 +09007245 `)
7246
7247 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7248 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007249 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007250 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7251 "lib64/mylib.so",
7252 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007253 "lib64/libfoo.rust.so",
7254 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7255 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007256 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007257
7258 // b/220397949
7259 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007260}
7261
Jooyung Han49f67012020-04-17 13:43:10 +09007262func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007263 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007264 apex {
7265 name: "myapex",
7266 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007267 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007268 }
7269 apex_key {
7270 name: "myapex.key",
7271 public_key: "testkey.avbpubkey",
7272 private_key: "testkey.pem",
7273 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007274 `,
7275 android.FixtureModifyConfig(func(config android.Config) {
7276 delete(config.Targets, android.Android)
7277 config.AndroidCommonTarget = android.Target{}
7278 }),
7279 )
Jooyung Han49f67012020-04-17 13:43:10 +09007280
7281 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7282 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7283 }
7284}
7285
Jiyong Parkbd159612020-02-28 15:22:21 +09007286func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007287 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007288 apex {
7289 name: "myapex",
7290 key: "myapex.key",
7291 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007292 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007293 }
7294
7295 apex_key {
7296 name: "myapex.key",
7297 public_key: "testkey.avbpubkey",
7298 private_key: "testkey.pem",
7299 }
7300
7301 android_app {
7302 name: "AppFoo",
7303 srcs: ["foo/bar/MyClass.java"],
7304 sdk_version: "none",
7305 system_modules: "none",
7306 apex_available: [ "myapex" ],
7307 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007308 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007309
Colin Crosscf371cc2020-11-13 11:48:42 -08007310 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007311 content := bundleConfigRule.Args["content"]
7312
7313 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007314 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 +09007315}
7316
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007317func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007318 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007319 apex {
7320 name: "myapex",
7321 key: "myapex.key",
7322 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007323 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007324 }
7325
7326 apex_key {
7327 name: "myapex.key",
7328 public_key: "testkey.avbpubkey",
7329 private_key: "testkey.pem",
7330 }
7331
7332 android_app_set {
7333 name: "AppSet",
7334 set: "AppSet.apks",
7335 }`)
7336 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007337 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007338 content := bundleConfigRule.Args["content"]
7339 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7340 s := mod.Rule("apexRule").Args["copy_commands"]
7341 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007342 if len(copyCmds) != 4 {
7343 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007344 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007345 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7346 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007347 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7348 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007349
7350 // Ensure that canned_fs_config has an entry for the app set zip file
7351 generateFsRule := mod.Rule("generateFsConfig")
7352 cmd := generateFsRule.RuleParams.Command
7353 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007354}
7355
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007356func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007357 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007358 apex_set {
7359 name: "myapex",
7360 filename: "foo_v2.apex",
7361 sanitized: {
7362 none: { set: "myapex.apks", },
7363 hwaddress: { set: "myapex.hwasan.apks", },
7364 },
Paul Duffin24704672021-04-06 16:09:30 +01007365 }
7366 `
7367 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007368
Paul Duffin24704672021-04-06 16:09:30 +01007369 // Check that the extractor produces the correct output file from the correct input file.
7370 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007371
Paul Duffin24704672021-04-06 16:09:30 +01007372 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7373 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007374
Paul Duffin24704672021-04-06 16:09:30 +01007375 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7376
7377 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007378 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7379 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007380
7381 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007382}
7383
Pranav Guptaeba03b02022-09-27 00:27:08 +00007384func TestApexSetApksModuleAssignment(t *testing.T) {
7385 ctx := testApex(t, `
7386 apex_set {
7387 name: "myapex",
7388 set: ":myapex_apks_file",
7389 }
7390
7391 filegroup {
7392 name: "myapex_apks_file",
7393 srcs: ["myapex.apks"],
7394 }
7395 `)
7396
7397 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7398
7399 // Check that the extractor produces the correct apks file from the input module
7400 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7401 extractedApex := m.Output(extractorOutput)
7402
7403 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7404}
7405
Paul Duffin89f570a2021-06-16 01:42:33 +01007406func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007407 t.Helper()
7408
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007409 bp := `
7410 java_library {
7411 name: "some-updatable-apex-lib",
7412 srcs: ["a.java"],
7413 sdk_version: "current",
7414 apex_available: [
7415 "some-updatable-apex",
7416 ],
satayevabcd5972021-08-06 17:49:46 +01007417 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007418 }
7419
7420 java_library {
7421 name: "some-non-updatable-apex-lib",
7422 srcs: ["a.java"],
7423 apex_available: [
7424 "some-non-updatable-apex",
7425 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007426 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007427 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007428 }
7429
7430 bootclasspath_fragment {
7431 name: "some-non-updatable-fragment",
7432 contents: ["some-non-updatable-apex-lib"],
7433 apex_available: [
7434 "some-non-updatable-apex",
7435 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007436 hidden_api: {
7437 split_packages: ["*"],
7438 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007439 }
7440
7441 java_library {
7442 name: "some-platform-lib",
7443 srcs: ["a.java"],
7444 sdk_version: "current",
7445 installable: true,
7446 }
7447
7448 java_library {
7449 name: "some-art-lib",
7450 srcs: ["a.java"],
7451 sdk_version: "current",
7452 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007453 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007454 ],
7455 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007456 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007457 }
7458
7459 apex {
7460 name: "some-updatable-apex",
7461 key: "some-updatable-apex.key",
7462 java_libs: ["some-updatable-apex-lib"],
7463 updatable: true,
7464 min_sdk_version: "current",
7465 }
7466
7467 apex {
7468 name: "some-non-updatable-apex",
7469 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007470 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007471 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007472 }
7473
7474 apex_key {
7475 name: "some-updatable-apex.key",
7476 }
7477
7478 apex_key {
7479 name: "some-non-updatable-apex.key",
7480 }
7481
7482 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007483 name: "com.android.art.debug",
7484 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007485 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007486 updatable: true,
7487 min_sdk_version: "current",
7488 }
7489
Paul Duffinf23bc472021-04-27 12:42:20 +01007490 bootclasspath_fragment {
7491 name: "art-bootclasspath-fragment",
7492 image_name: "art",
7493 contents: ["some-art-lib"],
7494 apex_available: [
7495 "com.android.art.debug",
7496 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007497 hidden_api: {
7498 split_packages: ["*"],
7499 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007500 }
7501
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007502 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007503 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007504 }
7505
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007506 filegroup {
7507 name: "some-updatable-apex-file_contexts",
7508 srcs: [
7509 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7510 ],
7511 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007512
7513 filegroup {
7514 name: "some-non-updatable-apex-file_contexts",
7515 srcs: [
7516 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7517 ],
7518 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007519 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007520
Paul Duffin89f570a2021-06-16 01:42:33 +01007521 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007522}
7523
Paul Duffin89f570a2021-06-16 01:42:33 +01007524func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007525 t.Helper()
7526
Paul Duffin55607122021-03-30 23:32:51 +01007527 fs := android.MockFS{
7528 "a.java": nil,
7529 "a.jar": nil,
7530 "apex_manifest.json": nil,
7531 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007532 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007533 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7534 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7535 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007536 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007537 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007538
Paul Duffin55607122021-03-30 23:32:51 +01007539 errorHandler := android.FixtureExpectsNoErrors
7540 if errmsg != "" {
7541 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007542 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007543
Paul Duffin55607122021-03-30 23:32:51 +01007544 result := android.GroupFixturePreparers(
7545 cc.PrepareForTestWithCcDefaultModules,
7546 java.PrepareForTestWithHiddenApiBuildComponents,
7547 java.PrepareForTestWithJavaDefaultModules,
7548 java.PrepareForTestWithJavaSdkLibraryFiles,
7549 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007550 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007551 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007552 android.FixtureModifyMockFS(func(fs android.MockFS) {
7553 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7554 insert := ""
7555 for _, fragment := range fragments {
7556 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7557 }
7558 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7559 platform_bootclasspath {
7560 name: "platform-bootclasspath",
7561 fragments: [
7562 %s
7563 ],
7564 }
7565 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007566 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007567 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007568 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007569 ).
7570 ExtendWithErrorHandler(errorHandler).
7571 RunTestWithBp(t, bp)
7572
7573 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007574}
7575
Paul Duffin5556c5f2022-06-09 17:32:21 +00007576func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007577 preparers := android.GroupFixturePreparers(
7578 java.PrepareForTestWithJavaDefaultModules,
7579 PrepareForTestWithApexBuildComponents,
7580 ).
7581 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7582 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7583
7584 bpBase := `
7585 apex_set {
7586 name: "com.android.myapex",
7587 installable: true,
7588 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7589 set: "myapex.apks",
7590 }
7591
7592 apex_set {
7593 name: "com.mycompany.android.myapex",
7594 apex_name: "com.android.myapex",
7595 installable: true,
7596 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7597 set: "company-myapex.apks",
7598 }
7599
7600 prebuilt_bootclasspath_fragment {
7601 name: "my-bootclasspath-fragment",
7602 apex_available: ["com.android.myapex"],
7603 %s
7604 }
7605 `
7606
7607 t.Run("java_import", func(t *testing.T) {
7608 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7609 java_import {
7610 name: "libfoo",
7611 jars: ["libfoo.jar"],
7612 apex_available: ["com.android.myapex"],
7613 }
7614 `)
7615 })
7616
7617 t.Run("java_sdk_library_import", func(t *testing.T) {
7618 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7619 java_sdk_library_import {
7620 name: "libfoo",
7621 public: {
7622 jars: ["libbar.jar"],
7623 },
7624 apex_available: ["com.android.myapex"],
7625 }
7626 `)
7627 })
7628
7629 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7630 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7631 image_name: "art",
7632 contents: ["libfoo"],
7633 `)+`
7634 java_sdk_library_import {
7635 name: "libfoo",
7636 public: {
7637 jars: ["libbar.jar"],
7638 },
7639 apex_available: ["com.android.myapex"],
7640 }
7641 `)
7642 })
7643}
7644
Paul Duffin5556c5f2022-06-09 17:32:21 +00007645func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7646 preparers := android.GroupFixturePreparers(
7647 java.PrepareForTestWithJavaDefaultModules,
7648 PrepareForTestWithApexBuildComponents,
7649 )
7650
7651 bpBase := `
7652 apex_set {
7653 name: "com.android.myapex",
7654 installable: true,
7655 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7656 set: "myapex.apks",
7657 }
7658
7659 apex_set {
7660 name: "com.android.myapex_compressed",
7661 apex_name: "com.android.myapex",
7662 installable: true,
7663 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7664 set: "myapex_compressed.apks",
7665 }
7666
7667 prebuilt_bootclasspath_fragment {
7668 name: "my-bootclasspath-fragment",
7669 apex_available: [
7670 "com.android.myapex",
7671 "com.android.myapex_compressed",
7672 ],
7673 hidden_api: {
7674 annotation_flags: "annotation-flags.csv",
7675 metadata: "metadata.csv",
7676 index: "index.csv",
7677 signature_patterns: "signature_patterns.csv",
7678 },
7679 %s
7680 }
7681 `
7682
7683 t.Run("java_import", func(t *testing.T) {
7684 result := preparers.RunTestWithBp(t,
7685 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7686 java_import {
7687 name: "libfoo",
7688 jars: ["libfoo.jar"],
7689 apex_available: [
7690 "com.android.myapex",
7691 "com.android.myapex_compressed",
7692 ],
7693 }
7694 `)
7695
7696 module := result.Module("libfoo", "android_common_com.android.myapex")
7697 usesLibraryDep := module.(java.UsesLibraryDependency)
7698 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7699 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7700 usesLibraryDep.DexJarBuildPath().Path())
7701 })
7702
7703 t.Run("java_sdk_library_import", func(t *testing.T) {
7704 result := preparers.RunTestWithBp(t,
7705 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7706 java_sdk_library_import {
7707 name: "libfoo",
7708 public: {
7709 jars: ["libbar.jar"],
7710 },
7711 apex_available: [
7712 "com.android.myapex",
7713 "com.android.myapex_compressed",
7714 ],
7715 compile_dex: true,
7716 }
7717 `)
7718
7719 module := result.Module("libfoo", "android_common_com.android.myapex")
7720 usesLibraryDep := module.(java.UsesLibraryDependency)
7721 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7722 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7723 usesLibraryDep.DexJarBuildPath().Path())
7724 })
7725
7726 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7727 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7728 image_name: "art",
7729 contents: ["libfoo"],
7730 `)+`
7731 java_sdk_library_import {
7732 name: "libfoo",
7733 public: {
7734 jars: ["libbar.jar"],
7735 },
7736 apex_available: [
7737 "com.android.myapex",
7738 "com.android.myapex_compressed",
7739 ],
7740 compile_dex: true,
7741 }
7742 `)
7743 })
7744}
7745
Jooyung Han548640b2020-04-27 12:10:30 +09007746func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7747 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7748 apex {
7749 name: "myapex",
7750 key: "myapex.key",
7751 updatable: true,
7752 }
7753
7754 apex_key {
7755 name: "myapex.key",
7756 public_key: "testkey.avbpubkey",
7757 private_key: "testkey.pem",
7758 }
7759 `)
7760}
7761
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007762func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7763 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7764 apex {
7765 name: "myapex",
7766 key: "myapex.key",
7767 }
7768
7769 apex_key {
7770 name: "myapex.key",
7771 public_key: "testkey.avbpubkey",
7772 private_key: "testkey.pem",
7773 }
7774 `)
7775}
7776
Daniel Norman69109112021-12-02 12:52:42 -08007777func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7778 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7779 apex {
7780 name: "myapex",
7781 key: "myapex.key",
7782 updatable: true,
7783 soc_specific: true,
7784 }
7785
7786 apex_key {
7787 name: "myapex.key",
7788 public_key: "testkey.avbpubkey",
7789 private_key: "testkey.pem",
7790 }
7791 `)
7792}
7793
satayevb98371c2021-06-15 16:49:50 +01007794func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7795 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7796 apex {
7797 name: "myapex",
7798 key: "myapex.key",
7799 systemserverclasspath_fragments: [
7800 "mysystemserverclasspathfragment",
7801 ],
7802 min_sdk_version: "29",
7803 updatable: true,
7804 }
7805
7806 apex_key {
7807 name: "myapex.key",
7808 public_key: "testkey.avbpubkey",
7809 private_key: "testkey.pem",
7810 }
7811
7812 java_library {
7813 name: "foo",
7814 srcs: ["b.java"],
7815 min_sdk_version: "29",
7816 installable: true,
7817 apex_available: [
7818 "myapex",
7819 ],
7820 }
7821
7822 systemserverclasspath_fragment {
7823 name: "mysystemserverclasspathfragment",
7824 generate_classpaths_proto: false,
7825 contents: [
7826 "foo",
7827 ],
7828 apex_available: [
7829 "myapex",
7830 ],
7831 }
satayevabcd5972021-08-06 17:49:46 +01007832 `,
7833 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7834 )
satayevb98371c2021-06-15 16:49:50 +01007835}
7836
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007837func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007838 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7839 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7840 // modules to be included in the BootJars.
7841 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7842 return android.GroupFixturePreparers(
7843 dexpreopt.FixtureSetBootJars(bootJars...),
7844 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7845 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7846 }),
7847 )
7848 }
7849
7850 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7851 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7852 // specified in the ArtApexJars configuration.
7853 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7854 return android.GroupFixturePreparers(
7855 dexpreopt.FixtureSetArtBootJars(bootJars...),
7856 dexpreopt.FixtureSetBootJars(bootJars...),
7857 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7858 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7859 }),
7860 )
7861 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007862
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007863 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007864 preparer := android.GroupFixturePreparers(
7865 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7866 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7867 )
7868 fragments := []java.ApexVariantReference{
7869 {
7870 Apex: proptools.StringPtr("com.android.art.debug"),
7871 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7872 },
7873 {
7874 Apex: proptools.StringPtr("some-non-updatable-apex"),
7875 Module: proptools.StringPtr("some-non-updatable-fragment"),
7876 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007877 }
satayevabcd5972021-08-06 17:49:46 +01007878 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007879 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007880
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007881 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007882 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7883 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007884 preparer := android.GroupFixturePreparers(
7885 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7886 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7887 )
Paul Duffin60264a02021-04-12 20:02:36 +01007888 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007889 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007890
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007891 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 +01007892 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 +01007893 // Update the dexpreopt ArtApexJars directly.
7894 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7895 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007896 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007897
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007898 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 +01007899 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 +01007900 // Update the dexpreopt ArtApexJars directly.
7901 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7902 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007903 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007904
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007905 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 +01007906 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 +01007907 preparer := android.GroupFixturePreparers(
7908 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7909 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7910 )
Paul Duffin60264a02021-04-12 20:02:36 +01007911 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007912 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007913
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007914 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 +01007915 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007916 fragment := java.ApexVariantReference{
7917 Apex: proptools.StringPtr("some-non-updatable-apex"),
7918 Module: proptools.StringPtr("some-non-updatable-fragment"),
7919 }
7920 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007921 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007922
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007923 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007924 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007925 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7926 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007927 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007928
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007929 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007930 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007931 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7932 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007933 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007934
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007935 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007936 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007937 // Update the dexpreopt ArtApexJars directly.
7938 preparer := prepareSetArtJars("platform:some-platform-lib")
7939 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007940 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007941
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007942 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007943 preparer := android.GroupFixturePreparers(
7944 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7945 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7946 )
7947 fragments := []java.ApexVariantReference{
7948 {
7949 Apex: proptools.StringPtr("some-non-updatable-apex"),
7950 Module: proptools.StringPtr("some-non-updatable-fragment"),
7951 },
7952 }
7953 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007954 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007955}
7956
7957func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007958 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007959 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007960 fragment := java.ApexVariantReference{
7961 Apex: proptools.StringPtr("myapex"),
7962 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7963 }
7964
Paul Duffin064b70c2020-11-02 17:32:38 +00007965 testDexpreoptWithApexes(t, `
7966 prebuilt_apex {
7967 name: "myapex" ,
7968 arch: {
7969 arm64: {
7970 src: "myapex-arm64.apex",
7971 },
7972 arm: {
7973 src: "myapex-arm.apex",
7974 },
7975 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007976 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7977 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007978
Paul Duffin89f570a2021-06-16 01:42:33 +01007979 prebuilt_bootclasspath_fragment {
7980 name: "my-bootclasspath-fragment",
7981 contents: ["libfoo"],
7982 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007983 hidden_api: {
7984 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7985 metadata: "my-bootclasspath-fragment/metadata.csv",
7986 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007987 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7988 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7989 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007990 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007991 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007992
Paul Duffin89f570a2021-06-16 01:42:33 +01007993 java_import {
7994 name: "libfoo",
7995 jars: ["libfoo.jar"],
7996 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007997 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007998 }
7999 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008000 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008001}
8002
Spandan Dasf14e2542021-11-12 00:01:37 +00008003func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008004 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008005 bp += `
8006 apex_key {
8007 name: "myapex.key",
8008 public_key: "testkey.avbpubkey",
8009 private_key: "testkey.pem",
8010 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008011 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008012 "lib1/src/A.java": nil,
8013 "lib2/src/B.java": nil,
8014 "system/sepolicy/apex/myapex-file_contexts": nil,
8015 }
8016
Paul Duffin45338f02021-03-30 23:07:52 +01008017 errorHandler := android.FixtureExpectsNoErrors
8018 if errmsg != "" {
8019 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008020 }
Colin Crossae8600b2020-10-29 17:09:13 -07008021
Paul Duffin45338f02021-03-30 23:07:52 +01008022 android.GroupFixturePreparers(
8023 android.PrepareForTestWithAndroidBuildComponents,
8024 java.PrepareForTestWithJavaBuildComponents,
8025 PrepareForTestWithApexBuildComponents,
8026 android.PrepareForTestWithNeverallowRules(rules),
8027 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008028 apexBootJars := make([]string, 0, len(bootJars))
8029 for _, apexBootJar := range bootJars {
8030 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008031 }
satayevd604b212021-07-21 14:23:52 +01008032 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008033 }),
8034 fs.AddToFixture(),
8035 ).
8036 ExtendWithErrorHandler(errorHandler).
8037 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008038}
8039
8040func TestApexPermittedPackagesRules(t *testing.T) {
8041 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008042 name string
8043 expectedError string
8044 bp string
8045 bootJars []string
8046 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008047 }{
8048
8049 {
8050 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8051 expectedError: "",
8052 bp: `
8053 java_library {
8054 name: "bcp_lib1",
8055 srcs: ["lib1/src/*.java"],
8056 permitted_packages: ["foo.bar"],
8057 apex_available: ["myapex"],
8058 sdk_version: "none",
8059 system_modules: "none",
8060 }
8061 java_library {
8062 name: "nonbcp_lib2",
8063 srcs: ["lib2/src/*.java"],
8064 apex_available: ["myapex"],
8065 permitted_packages: ["a.b"],
8066 sdk_version: "none",
8067 system_modules: "none",
8068 }
8069 apex {
8070 name: "myapex",
8071 key: "myapex.key",
8072 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008073 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008074 }`,
8075 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008076 bcpPermittedPackages: map[string][]string{
8077 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008078 "foo.bar",
8079 },
8080 },
8081 },
8082 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008083 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008084 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 +01008085 bp: `
8086 java_library {
8087 name: "bcp_lib1",
8088 srcs: ["lib1/src/*.java"],
8089 apex_available: ["myapex"],
8090 permitted_packages: ["foo.bar"],
8091 sdk_version: "none",
8092 system_modules: "none",
8093 }
8094 java_library {
8095 name: "bcp_lib2",
8096 srcs: ["lib2/src/*.java"],
8097 apex_available: ["myapex"],
8098 permitted_packages: ["foo.bar", "bar.baz"],
8099 sdk_version: "none",
8100 system_modules: "none",
8101 }
8102 apex {
8103 name: "myapex",
8104 key: "myapex.key",
8105 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008106 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008107 }
8108 `,
8109 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008110 bcpPermittedPackages: map[string][]string{
8111 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008112 "foo.bar",
8113 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008114 "bcp_lib2": []string{
8115 "foo.bar",
8116 },
8117 },
8118 },
8119 {
8120 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8121 expectedError: "",
8122 bp: `
8123 java_library {
8124 name: "bcp_lib_restricted",
8125 srcs: ["lib1/src/*.java"],
8126 apex_available: ["myapex"],
8127 permitted_packages: ["foo.bar"],
8128 sdk_version: "none",
8129 min_sdk_version: "29",
8130 system_modules: "none",
8131 }
8132 java_library {
8133 name: "bcp_lib_unrestricted",
8134 srcs: ["lib2/src/*.java"],
8135 apex_available: ["myapex"],
8136 permitted_packages: ["foo.bar", "bar.baz"],
8137 sdk_version: "none",
8138 min_sdk_version: "29",
8139 system_modules: "none",
8140 }
8141 apex {
8142 name: "myapex",
8143 key: "myapex.key",
8144 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8145 updatable: true,
8146 min_sdk_version: "29",
8147 }
8148 `,
8149 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8150 bcpPermittedPackages: map[string][]string{
8151 "bcp_lib1_non_updateable": []string{
8152 "foo.bar",
8153 },
8154 // 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 +01008155 },
8156 },
8157 }
8158 for _, tc := range testcases {
8159 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008160 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8161 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008162 })
8163 }
8164}
8165
Jiyong Park62304bb2020-04-13 16:19:48 +09008166func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008167 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008168 apex {
8169 name: "myapex",
8170 key: "myapex.key",
8171 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008172 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008173 }
8174
8175 apex_key {
8176 name: "myapex.key",
8177 public_key: "testkey.avbpubkey",
8178 private_key: "testkey.pem",
8179 }
8180
8181 cc_library {
8182 name: "mylib",
8183 srcs: ["mylib.cpp"],
8184 system_shared_libs: [],
8185 stl: "none",
8186 stubs: {
8187 versions: ["1"],
8188 },
8189 apex_available: ["myapex"],
8190 }
8191
8192 cc_library {
8193 name: "myprivlib",
8194 srcs: ["mylib.cpp"],
8195 system_shared_libs: [],
8196 stl: "none",
8197 apex_available: ["myapex"],
8198 }
8199
8200
8201 cc_test {
8202 name: "mytest",
8203 gtest: false,
8204 srcs: ["mylib.cpp"],
8205 system_shared_libs: [],
8206 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008207 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008208 test_for: ["myapex"]
8209 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008210
8211 cc_library {
8212 name: "mytestlib",
8213 srcs: ["mylib.cpp"],
8214 system_shared_libs: [],
8215 shared_libs: ["mylib", "myprivlib"],
8216 stl: "none",
8217 test_for: ["myapex"],
8218 }
8219
8220 cc_benchmark {
8221 name: "mybench",
8222 srcs: ["mylib.cpp"],
8223 system_shared_libs: [],
8224 shared_libs: ["mylib", "myprivlib"],
8225 stl: "none",
8226 test_for: ["myapex"],
8227 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008228 `)
8229
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008230 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008231 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008232 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8233 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8234 }
8235
8236 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008237 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008238 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8239 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8240 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8241}
Jiyong Park46a512f2020-12-04 18:02:13 +09008242
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008243func TestIndirectTestFor(t *testing.T) {
8244 ctx := testApex(t, `
8245 apex {
8246 name: "myapex",
8247 key: "myapex.key",
8248 native_shared_libs: ["mylib", "myprivlib"],
8249 updatable: false,
8250 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008251
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008252 apex_key {
8253 name: "myapex.key",
8254 public_key: "testkey.avbpubkey",
8255 private_key: "testkey.pem",
8256 }
8257
8258 cc_library {
8259 name: "mylib",
8260 srcs: ["mylib.cpp"],
8261 system_shared_libs: [],
8262 stl: "none",
8263 stubs: {
8264 versions: ["1"],
8265 },
8266 apex_available: ["myapex"],
8267 }
8268
8269 cc_library {
8270 name: "myprivlib",
8271 srcs: ["mylib.cpp"],
8272 system_shared_libs: [],
8273 stl: "none",
8274 shared_libs: ["mylib"],
8275 apex_available: ["myapex"],
8276 }
8277
8278 cc_library {
8279 name: "mytestlib",
8280 srcs: ["mylib.cpp"],
8281 system_shared_libs: [],
8282 shared_libs: ["myprivlib"],
8283 stl: "none",
8284 test_for: ["myapex"],
8285 }
8286 `)
8287
8288 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008289 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008290 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8291 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8292 }
8293
8294 // The platform variant of mytestlib links to the platform variant of the
8295 // internal myprivlib.
8296 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8297
8298 // The platform variant of myprivlib links to the platform variant of mylib
8299 // and bypasses its stubs.
8300 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 +09008301}
8302
Martin Stjernholmec009002021-03-27 15:18:31 +00008303func TestTestForForLibInOtherApex(t *testing.T) {
8304 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8305 _ = testApex(t, `
8306 apex {
8307 name: "com.android.art",
8308 key: "myapex.key",
8309 native_shared_libs: ["mylib"],
8310 updatable: false,
8311 }
8312
8313 apex {
8314 name: "com.android.art.debug",
8315 key: "myapex.key",
8316 native_shared_libs: ["mylib", "mytestlib"],
8317 updatable: false,
8318 }
8319
8320 apex_key {
8321 name: "myapex.key",
8322 public_key: "testkey.avbpubkey",
8323 private_key: "testkey.pem",
8324 }
8325
8326 cc_library {
8327 name: "mylib",
8328 srcs: ["mylib.cpp"],
8329 system_shared_libs: [],
8330 stl: "none",
8331 stubs: {
8332 versions: ["1"],
8333 },
8334 apex_available: ["com.android.art", "com.android.art.debug"],
8335 }
8336
8337 cc_library {
8338 name: "mytestlib",
8339 srcs: ["mylib.cpp"],
8340 system_shared_libs: [],
8341 shared_libs: ["mylib"],
8342 stl: "none",
8343 apex_available: ["com.android.art.debug"],
8344 test_for: ["com.android.art"],
8345 }
8346 `,
8347 android.MockFS{
8348 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8349 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8350 }.AddToFixture())
8351}
8352
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008353// TODO(jungjw): Move this to proptools
8354func intPtr(i int) *int {
8355 return &i
8356}
8357
8358func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008359 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008360 apex_set {
8361 name: "myapex",
8362 set: "myapex.apks",
8363 filename: "foo_v2.apex",
8364 overrides: ["foo"],
8365 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008366 `,
8367 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8368 variables.Platform_sdk_version = intPtr(30)
8369 }),
8370 android.FixtureModifyConfig(func(config android.Config) {
8371 config.Targets[android.Android] = []android.Target{
8372 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8373 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8374 }
8375 }),
8376 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008377
Paul Duffin24704672021-04-06 16:09:30 +01008378 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008379
8380 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008381 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008382 actual := extractedApex.Args["abis"]
8383 expected := "ARMEABI_V7A,ARM64_V8A"
8384 if actual != expected {
8385 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8386 }
8387 actual = extractedApex.Args["sdk-version"]
8388 expected = "30"
8389 if actual != expected {
8390 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8391 }
8392
Paul Duffin6717d882021-06-15 19:09:41 +01008393 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008394 a := m.Module().(*ApexSet)
8395 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008396 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008397 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8398 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8399 }
8400}
8401
Jiyong Park7d95a512020-05-10 15:16:24 +09008402func TestNoStaticLinkingToStubsLib(t *testing.T) {
8403 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8404 apex {
8405 name: "myapex",
8406 key: "myapex.key",
8407 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008408 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008409 }
8410
8411 apex_key {
8412 name: "myapex.key",
8413 public_key: "testkey.avbpubkey",
8414 private_key: "testkey.pem",
8415 }
8416
8417 cc_library {
8418 name: "mylib",
8419 srcs: ["mylib.cpp"],
8420 static_libs: ["otherlib"],
8421 system_shared_libs: [],
8422 stl: "none",
8423 apex_available: [ "myapex" ],
8424 }
8425
8426 cc_library {
8427 name: "otherlib",
8428 srcs: ["mylib.cpp"],
8429 system_shared_libs: [],
8430 stl: "none",
8431 stubs: {
8432 versions: ["1", "2", "3"],
8433 },
8434 apex_available: [ "myapex" ],
8435 }
8436 `)
8437}
8438
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008439func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008440 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008441 apex {
8442 name: "myapex",
8443 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008444 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008445 custom_sign_tool: "sign_myapex",
8446 }
8447
8448 apex_key {
8449 name: "myapex.key",
8450 public_key: "testkey.avbpubkey",
8451 private_key: "testkey.pem",
8452 }
8453 `)
8454
8455 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8456 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8457 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"`)
8458}
8459
8460func TestApexKeysTxtOverrides(t *testing.T) {
8461 ctx := testApex(t, `
8462 apex {
8463 name: "myapex",
8464 key: "myapex.key",
8465 updatable: false,
8466 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008467 }
8468
8469 apex_key {
8470 name: "myapex.key",
8471 public_key: "testkey.avbpubkey",
8472 private_key: "testkey.pem",
8473 }
8474
8475 prebuilt_apex {
8476 name: "myapex",
8477 prefer: true,
8478 arch: {
8479 arm64: {
8480 src: "myapex-arm64.apex",
8481 },
8482 arm: {
8483 src: "myapex-arm.apex",
8484 },
8485 },
8486 }
8487
8488 apex_set {
8489 name: "myapex_set",
8490 set: "myapex.apks",
8491 filename: "myapex_set.apex",
8492 overrides: ["myapex"],
8493 }
8494 `)
8495
8496 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8497 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8498 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 +09008499 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 +09008500}
8501
Jooyung Han938b5932020-06-20 12:47:47 +09008502func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008503 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008504 apex {
8505 name: "myapex",
8506 key: "myapex.key",
8507 apps: ["app"],
8508 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008509 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008510 }
8511
8512 apex_key {
8513 name: "myapex.key",
8514 public_key: "testkey.avbpubkey",
8515 private_key: "testkey.pem",
8516 }
8517
8518 android_app {
8519 name: "app",
8520 srcs: ["foo/bar/MyClass.java"],
8521 package_name: "foo",
8522 sdk_version: "none",
8523 system_modules: "none",
8524 apex_available: [ "myapex" ],
8525 }
8526 `, withFiles(map[string][]byte{
8527 "sub/Android.bp": []byte(`
8528 override_apex {
8529 name: "override_myapex",
8530 base: "myapex",
8531 apps: ["override_app"],
8532 allowed_files: ":allowed",
8533 }
8534 // Overridable "path" property should be referenced indirectly
8535 filegroup {
8536 name: "allowed",
8537 srcs: ["allowed.txt"],
8538 }
8539 override_android_app {
8540 name: "override_app",
8541 base: "app",
8542 package_name: "bar",
8543 }
8544 `),
8545 }))
8546
8547 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8548 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8549 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8550 }
8551
8552 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8553 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8554 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8555 }
8556}
8557
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008558func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008559 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008560 apex {
8561 name: "myapex",
8562 key: "myapex.key",
8563 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008564 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008565 }
8566
8567 apex_key {
8568 name: "myapex.key",
8569 public_key: "testkey.avbpubkey",
8570 private_key: "testkey.pem",
8571 }
8572
8573 cc_library {
8574 name: "mylib",
8575 srcs: ["mylib.cpp"],
8576 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008577 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008578 },
8579 apex_available: ["myapex"],
8580 }
8581
8582 cc_prebuilt_library_shared {
8583 name: "mylib",
8584 prefer: false,
8585 srcs: ["prebuilt.so"],
8586 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008587 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008588 },
8589 apex_available: ["myapex"],
8590 }
8591 `)
8592}
8593
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008594func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008595 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008596 apex {
8597 name: "myapex",
8598 key: "myapex.key",
8599 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008600 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008601 }
8602 apex_key {
8603 name: "myapex.key",
8604 public_key: "testkey.avbpubkey",
8605 private_key: "testkey.pem",
8606 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008607 `,
8608 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8609 variables.CompressedApex = proptools.BoolPtr(true)
8610 }),
8611 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008612
8613 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8614 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8615
8616 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8617 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8618
8619 // Make sure output of bundle is .capex
8620 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8621 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8622
8623 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008624 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008625 var builder strings.Builder
8626 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8627 androidMk := builder.String()
8628 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8629}
8630
Martin Stjernholm2856c662020-12-02 15:03:42 +00008631func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008632 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008633 apex {
8634 name: "myapex",
8635 key: "myapex.key",
8636 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008637 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008638 }
8639
8640 apex_key {
8641 name: "myapex.key",
8642 public_key: "testkey.avbpubkey",
8643 private_key: "testkey.pem",
8644 }
8645
8646 cc_library {
8647 name: "mylib",
8648 srcs: ["mylib.cpp"],
8649 apex_available: ["myapex"],
8650 shared_libs: ["otherlib"],
8651 system_shared_libs: [],
8652 }
8653
8654 cc_library {
8655 name: "otherlib",
8656 srcs: ["mylib.cpp"],
8657 stubs: {
8658 versions: ["current"],
8659 },
8660 }
8661
8662 cc_prebuilt_library_shared {
8663 name: "otherlib",
8664 prefer: true,
8665 srcs: ["prebuilt.so"],
8666 stubs: {
8667 versions: ["current"],
8668 },
8669 }
8670 `)
8671
8672 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008673 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008674 var builder strings.Builder
8675 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8676 androidMk := builder.String()
8677
8678 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8679 // a thing there.
8680 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8681}
8682
Jiyong Parke3867542020-12-03 17:28:25 +09008683func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008684 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008685 apex {
8686 name: "myapex",
8687 key: "myapex.key",
8688 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008689 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008690 }
8691
8692 apex_key {
8693 name: "myapex.key",
8694 public_key: "testkey.avbpubkey",
8695 private_key: "testkey.pem",
8696 }
8697
8698 cc_library {
8699 name: "mylib",
8700 srcs: ["mylib.cpp"],
8701 system_shared_libs: [],
8702 stl: "none",
8703 apex_available: ["myapex"],
8704 shared_libs: ["mylib2"],
8705 target: {
8706 apex: {
8707 exclude_shared_libs: ["mylib2"],
8708 },
8709 },
8710 }
8711
8712 cc_library {
8713 name: "mylib2",
8714 srcs: ["mylib.cpp"],
8715 system_shared_libs: [],
8716 stl: "none",
8717 }
8718 `)
8719
8720 // Check if mylib is linked to mylib2 for the non-apex target
8721 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8722 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8723
8724 // Make sure that the link doesn't occur for the apex target
8725 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8726 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8727
8728 // It shouldn't appear in the copy cmd as well.
8729 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8730 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8731}
8732
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008733func TestPrebuiltStubLibDep(t *testing.T) {
8734 bpBase := `
8735 apex {
8736 name: "myapex",
8737 key: "myapex.key",
8738 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008739 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008740 }
8741 apex_key {
8742 name: "myapex.key",
8743 public_key: "testkey.avbpubkey",
8744 private_key: "testkey.pem",
8745 }
8746 cc_library {
8747 name: "mylib",
8748 srcs: ["mylib.cpp"],
8749 apex_available: ["myapex"],
8750 shared_libs: ["stublib"],
8751 system_shared_libs: [],
8752 }
8753 apex {
8754 name: "otherapex",
8755 enabled: %s,
8756 key: "myapex.key",
8757 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008758 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008759 }
8760 `
8761
8762 stublibSourceBp := `
8763 cc_library {
8764 name: "stublib",
8765 srcs: ["mylib.cpp"],
8766 apex_available: ["otherapex"],
8767 system_shared_libs: [],
8768 stl: "none",
8769 stubs: {
8770 versions: ["1"],
8771 },
8772 }
8773 `
8774
8775 stublibPrebuiltBp := `
8776 cc_prebuilt_library_shared {
8777 name: "stublib",
8778 srcs: ["prebuilt.so"],
8779 apex_available: ["otherapex"],
8780 stubs: {
8781 versions: ["1"],
8782 },
8783 %s
8784 }
8785 `
8786
8787 tests := []struct {
8788 name string
8789 stublibBp string
8790 usePrebuilt bool
8791 modNames []string // Modules to collect AndroidMkEntries for
8792 otherApexEnabled []string
8793 }{
8794 {
8795 name: "only_source",
8796 stublibBp: stublibSourceBp,
8797 usePrebuilt: false,
8798 modNames: []string{"stublib"},
8799 otherApexEnabled: []string{"true", "false"},
8800 },
8801 {
8802 name: "source_preferred",
8803 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8804 usePrebuilt: false,
8805 modNames: []string{"stublib", "prebuilt_stublib"},
8806 otherApexEnabled: []string{"true", "false"},
8807 },
8808 {
8809 name: "prebuilt_preferred",
8810 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8811 usePrebuilt: true,
8812 modNames: []string{"stublib", "prebuilt_stublib"},
8813 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8814 },
8815 {
8816 name: "only_prebuilt",
8817 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8818 usePrebuilt: true,
8819 modNames: []string{"stublib"},
8820 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8821 },
8822 }
8823
8824 for _, test := range tests {
8825 t.Run(test.name, func(t *testing.T) {
8826 for _, otherApexEnabled := range test.otherApexEnabled {
8827 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008828 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008829
8830 type modAndMkEntries struct {
8831 mod *cc.Module
8832 mkEntries android.AndroidMkEntries
8833 }
8834 entries := []*modAndMkEntries{}
8835
8836 // Gather shared lib modules that are installable
8837 for _, modName := range test.modNames {
8838 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8839 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8840 continue
8841 }
8842 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008843 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008844 continue
8845 }
Colin Crossaa255532020-07-03 13:18:24 -07008846 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008847 if ent.Disabled {
8848 continue
8849 }
8850 entries = append(entries, &modAndMkEntries{
8851 mod: mod,
8852 mkEntries: ent,
8853 })
8854 }
8855 }
8856 }
8857
8858 var entry *modAndMkEntries = nil
8859 for _, ent := range entries {
8860 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8861 if entry != nil {
8862 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8863 } else {
8864 entry = ent
8865 }
8866 }
8867 }
8868
8869 if entry == nil {
8870 t.Errorf("AndroidMk entry for \"stublib\" missing")
8871 } else {
8872 isPrebuilt := entry.mod.Prebuilt() != nil
8873 if isPrebuilt != test.usePrebuilt {
8874 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8875 }
8876 if !entry.mod.IsStubs() {
8877 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8878 }
8879 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8880 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8881 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008882 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008883 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008884 if !android.InList(expected, cflags) {
8885 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8886 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008887 }
8888 })
8889 }
8890 })
8891 }
8892}
8893
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008894func TestHostApexInHostOnlyBuild(t *testing.T) {
8895 testApex(t, `
8896 apex {
8897 name: "myapex",
8898 host_supported: true,
8899 key: "myapex.key",
8900 updatable: false,
8901 payload_type: "zip",
8902 }
8903 apex_key {
8904 name: "myapex.key",
8905 public_key: "testkey.avbpubkey",
8906 private_key: "testkey.pem",
8907 }
8908 `,
8909 android.FixtureModifyConfig(func(config android.Config) {
8910 // We may not have device targets in all builds, e.g. in
8911 // prebuilts/build-tools/build-prebuilts.sh
8912 config.Targets[android.Android] = []android.Target{}
8913 }))
8914}
8915
Colin Crossc33e5212021-05-25 18:16:02 -07008916func TestApexJavaCoverage(t *testing.T) {
8917 bp := `
8918 apex {
8919 name: "myapex",
8920 key: "myapex.key",
8921 java_libs: ["mylib"],
8922 bootclasspath_fragments: ["mybootclasspathfragment"],
8923 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8924 updatable: false,
8925 }
8926
8927 apex_key {
8928 name: "myapex.key",
8929 public_key: "testkey.avbpubkey",
8930 private_key: "testkey.pem",
8931 }
8932
8933 java_library {
8934 name: "mylib",
8935 srcs: ["mylib.java"],
8936 apex_available: ["myapex"],
8937 compile_dex: true,
8938 }
8939
8940 bootclasspath_fragment {
8941 name: "mybootclasspathfragment",
8942 contents: ["mybootclasspathlib"],
8943 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01008944 hidden_api: {
8945 split_packages: ["*"],
8946 },
Colin Crossc33e5212021-05-25 18:16:02 -07008947 }
8948
8949 java_library {
8950 name: "mybootclasspathlib",
8951 srcs: ["mybootclasspathlib.java"],
8952 apex_available: ["myapex"],
8953 compile_dex: true,
8954 }
8955
8956 systemserverclasspath_fragment {
8957 name: "mysystemserverclasspathfragment",
8958 contents: ["mysystemserverclasspathlib"],
8959 apex_available: ["myapex"],
8960 }
8961
8962 java_library {
8963 name: "mysystemserverclasspathlib",
8964 srcs: ["mysystemserverclasspathlib.java"],
8965 apex_available: ["myapex"],
8966 compile_dex: true,
8967 }
8968 `
8969
8970 result := android.GroupFixturePreparers(
8971 PrepareForTestWithApexBuildComponents,
8972 prepareForTestWithMyapex,
8973 java.PrepareForTestWithJavaDefaultModules,
8974 android.PrepareForTestWithAndroidBuildComponents,
8975 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008976 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8977 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04008978 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07008979 ).RunTest(t)
8980
8981 // Make sure jacoco ran on both mylib and mybootclasspathlib
8982 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8983 t.Errorf("Failed to find jacoco rule for mylib")
8984 }
8985 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8986 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8987 }
8988 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8989 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8990 }
8991}
8992
Jiyong Park192600a2021-08-03 07:52:17 +00008993func TestProhibitStaticExecutable(t *testing.T) {
8994 testApexError(t, `executable mybin is static`, `
8995 apex {
8996 name: "myapex",
8997 key: "myapex.key",
8998 binaries: ["mybin"],
8999 min_sdk_version: "29",
9000 }
9001
9002 apex_key {
9003 name: "myapex.key",
9004 public_key: "testkey.avbpubkey",
9005 private_key: "testkey.pem",
9006 }
9007
9008 cc_binary {
9009 name: "mybin",
9010 srcs: ["mylib.cpp"],
9011 relative_install_path: "foo/bar",
9012 static_executable: true,
9013 system_shared_libs: [],
9014 stl: "none",
9015 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009016 min_sdk_version: "29",
9017 }
9018 `)
9019
9020 testApexError(t, `executable mybin.rust is static`, `
9021 apex {
9022 name: "myapex",
9023 key: "myapex.key",
9024 binaries: ["mybin.rust"],
9025 min_sdk_version: "29",
9026 }
9027
9028 apex_key {
9029 name: "myapex.key",
9030 public_key: "testkey.avbpubkey",
9031 private_key: "testkey.pem",
9032 }
9033
9034 rust_binary {
9035 name: "mybin.rust",
9036 srcs: ["foo.rs"],
9037 static_executable: true,
9038 apex_available: ["myapex"],
9039 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009040 }
9041 `)
9042}
9043
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009044func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9045 ctx := testApex(t, `
9046 apex {
9047 name: "myapex",
9048 key: "myapex.key",
9049 updatable: false,
9050 java_libs: ["foo"],
9051 }
9052
9053 apex_key {
9054 name: "myapex.key",
9055 public_key: "testkey.avbpubkey",
9056 private_key: "testkey.pem",
9057 }
9058
9059 java_library {
9060 name: "foo",
9061 srcs: ["foo.java"],
9062 apex_available: ["myapex"],
9063 installable: true,
9064 }
9065 `,
9066 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9067 )
9068
9069 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9070 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9071 var builder strings.Builder
9072 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9073 androidMk := builder.String()
9074 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")
9075}
9076
9077func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9078 ctx := testApex(t, `
9079 prebuilt_apex {
9080 name: "myapex",
9081 arch: {
9082 arm64: {
9083 src: "myapex-arm64.apex",
9084 },
9085 arm: {
9086 src: "myapex-arm.apex",
9087 },
9088 },
9089 exported_java_libs: ["foo"],
9090 }
9091
9092 java_import {
9093 name: "foo",
9094 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009095 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009096 }
9097 `,
9098 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9099 )
9100
9101 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9102 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9103 mainModuleEntries := entriesList[0]
9104 android.AssertArrayString(t,
9105 "LOCAL_REQUIRED_MODULES",
9106 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9107 []string{
9108 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9109 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9110 })
9111}
9112
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009113func TestAndroidMk_RequiredModules(t *testing.T) {
9114 ctx := testApex(t, `
9115 apex {
9116 name: "myapex",
9117 key: "myapex.key",
9118 updatable: false,
9119 java_libs: ["foo"],
9120 required: ["otherapex"],
9121 }
9122
9123 apex {
9124 name: "otherapex",
9125 key: "myapex.key",
9126 updatable: false,
9127 java_libs: ["foo"],
9128 required: ["otherapex"],
9129 }
9130
9131 apex_key {
9132 name: "myapex.key",
9133 public_key: "testkey.avbpubkey",
9134 private_key: "testkey.pem",
9135 }
9136
9137 java_library {
9138 name: "foo",
9139 srcs: ["foo.java"],
9140 apex_available: ["myapex", "otherapex"],
9141 installable: true,
9142 }
9143 `)
9144
9145 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9146 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9147 var builder strings.Builder
9148 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9149 androidMk := builder.String()
9150 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
9151}
9152
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009153func TestAndroidMk_RequiredDeps(t *testing.T) {
9154 ctx := testApex(t, `
9155 apex {
9156 name: "myapex",
9157 key: "myapex.key",
9158 updatable: false,
9159 }
9160
9161 apex_key {
9162 name: "myapex.key",
9163 public_key: "testkey.avbpubkey",
9164 private_key: "testkey.pem",
9165 }
9166 `)
9167
9168 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9169 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9170 data := android.AndroidMkDataForTest(t, ctx, bundle)
9171 var builder strings.Builder
9172 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9173 androidMk := builder.String()
9174 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
9175
9176 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9177 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9178 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9179 var flattenedBuilder strings.Builder
9180 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9181 flattenedAndroidMk := flattenedBuilder.String()
9182 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
9183}
9184
Jooyung Hana6d36672022-02-24 13:58:07 +09009185func TestApexOutputFileProducer(t *testing.T) {
9186 for _, tc := range []struct {
9187 name string
9188 ref string
9189 expected_data []string
9190 }{
9191 {
9192 name: "test_using_output",
9193 ref: ":myapex",
9194 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9195 },
9196 {
9197 name: "test_using_apex",
9198 ref: ":myapex{.apex}",
9199 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9200 },
9201 } {
9202 t.Run(tc.name, func(t *testing.T) {
9203 ctx := testApex(t, `
9204 apex {
9205 name: "myapex",
9206 key: "myapex.key",
9207 compressible: true,
9208 updatable: false,
9209 }
9210
9211 apex_key {
9212 name: "myapex.key",
9213 public_key: "testkey.avbpubkey",
9214 private_key: "testkey.pem",
9215 }
9216
9217 java_test {
9218 name: "`+tc.name+`",
9219 srcs: ["a.java"],
9220 data: ["`+tc.ref+`"],
9221 }
9222 `,
9223 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9224 variables.CompressedApex = proptools.BoolPtr(true)
9225 }))
9226 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9227 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9228 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9229 })
9230 }
9231}
9232
satayev758968a2021-12-06 11:42:40 +00009233func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9234 preparer := android.GroupFixturePreparers(
9235 PrepareForTestWithApexBuildComponents,
9236 prepareForTestWithMyapex,
9237 java.PrepareForTestWithJavaSdkLibraryFiles,
9238 java.PrepareForTestWithJavaDefaultModules,
9239 android.PrepareForTestWithAndroidBuildComponents,
9240 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9241 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9242 )
9243
9244 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9245 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9246 preparer.RunTestWithBp(t, `
9247 apex {
9248 name: "myapex",
9249 key: "myapex.key",
9250 bootclasspath_fragments: ["mybootclasspathfragment"],
9251 min_sdk_version: "30",
9252 updatable: false,
9253 }
9254
9255 apex_key {
9256 name: "myapex.key",
9257 public_key: "testkey.avbpubkey",
9258 private_key: "testkey.pem",
9259 }
9260
9261 bootclasspath_fragment {
9262 name: "mybootclasspathfragment",
9263 contents: ["mybootclasspathlib"],
9264 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009265 hidden_api: {
9266 split_packages: ["*"],
9267 },
satayev758968a2021-12-06 11:42:40 +00009268 }
9269
9270 java_sdk_library {
9271 name: "mybootclasspathlib",
9272 srcs: ["mybootclasspathlib.java"],
9273 apex_available: ["myapex"],
9274 compile_dex: true,
9275 unsafe_ignore_missing_latest_api: true,
9276 min_sdk_version: "31",
9277 static_libs: ["util"],
9278 }
9279
9280 java_library {
9281 name: "util",
9282 srcs: ["a.java"],
9283 apex_available: ["myapex"],
9284 min_sdk_version: "31",
9285 static_libs: ["another_util"],
9286 }
9287
9288 java_library {
9289 name: "another_util",
9290 srcs: ["a.java"],
9291 min_sdk_version: "31",
9292 apex_available: ["myapex"],
9293 }
9294 `)
9295 })
9296
9297 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9298 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9299 preparer.RunTestWithBp(t, `
9300 apex {
9301 name: "myapex",
9302 key: "myapex.key",
9303 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9304 min_sdk_version: "30",
9305 updatable: false,
9306 }
9307
9308 apex_key {
9309 name: "myapex.key",
9310 public_key: "testkey.avbpubkey",
9311 private_key: "testkey.pem",
9312 }
9313
9314 systemserverclasspath_fragment {
9315 name: "mysystemserverclasspathfragment",
9316 contents: ["mysystemserverclasspathlib"],
9317 apex_available: ["myapex"],
9318 }
9319
9320 java_sdk_library {
9321 name: "mysystemserverclasspathlib",
9322 srcs: ["mysystemserverclasspathlib.java"],
9323 apex_available: ["myapex"],
9324 compile_dex: true,
9325 min_sdk_version: "32",
9326 unsafe_ignore_missing_latest_api: true,
9327 static_libs: ["util"],
9328 }
9329
9330 java_library {
9331 name: "util",
9332 srcs: ["a.java"],
9333 apex_available: ["myapex"],
9334 min_sdk_version: "31",
9335 static_libs: ["another_util"],
9336 }
9337
9338 java_library {
9339 name: "another_util",
9340 srcs: ["a.java"],
9341 min_sdk_version: "31",
9342 apex_available: ["myapex"],
9343 }
9344 `)
9345 })
9346
9347 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9348 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9349 RunTestWithBp(t, `
9350 apex {
9351 name: "myapex",
9352 key: "myapex.key",
9353 bootclasspath_fragments: ["mybootclasspathfragment"],
9354 min_sdk_version: "30",
9355 updatable: false,
9356 }
9357
9358 apex_key {
9359 name: "myapex.key",
9360 public_key: "testkey.avbpubkey",
9361 private_key: "testkey.pem",
9362 }
9363
9364 bootclasspath_fragment {
9365 name: "mybootclasspathfragment",
9366 contents: ["mybootclasspathlib"],
9367 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009368 hidden_api: {
9369 split_packages: ["*"],
9370 },
satayev758968a2021-12-06 11:42:40 +00009371 }
9372
9373 java_sdk_library {
9374 name: "mybootclasspathlib",
9375 srcs: ["mybootclasspathlib.java"],
9376 apex_available: ["myapex"],
9377 compile_dex: true,
9378 unsafe_ignore_missing_latest_api: true,
9379 }
9380 `)
9381 })
9382
9383 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9384 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9385 RunTestWithBp(t, `
9386 apex {
9387 name: "myapex",
9388 key: "myapex.key",
9389 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9390 min_sdk_version: "30",
9391 updatable: false,
9392 }
9393
9394 apex_key {
9395 name: "myapex.key",
9396 public_key: "testkey.avbpubkey",
9397 private_key: "testkey.pem",
9398 }
9399
9400 systemserverclasspath_fragment {
9401 name: "mysystemserverclasspathfragment",
9402 contents: ["mysystemserverclasspathlib"],
9403 apex_available: ["myapex"],
9404 }
9405
9406 java_sdk_library {
9407 name: "mysystemserverclasspathlib",
9408 srcs: ["mysystemserverclasspathlib.java"],
9409 apex_available: ["myapex"],
9410 compile_dex: true,
9411 unsafe_ignore_missing_latest_api: true,
9412 }
9413 `)
9414 })
9415}
9416
Jiakai Zhang6decef92022-01-12 17:56:19 +00009417// Verifies that the APEX depends on all the Make modules in the list.
9418func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9419 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9420 for _, dep := range deps {
9421 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9422 }
9423}
9424
9425// Verifies that the APEX does not depend on any of the Make modules in the list.
9426func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9427 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9428 for _, dep := range deps {
9429 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9430 }
9431}
9432
Spandan Das66773252022-01-15 00:23:18 +00009433func TestApexStrictUpdtabilityLint(t *testing.T) {
9434 bpTemplate := `
9435 apex {
9436 name: "myapex",
9437 key: "myapex.key",
9438 java_libs: ["myjavalib"],
9439 updatable: %v,
9440 min_sdk_version: "29",
9441 }
9442 apex_key {
9443 name: "myapex.key",
9444 }
9445 java_library {
9446 name: "myjavalib",
9447 srcs: ["MyClass.java"],
9448 apex_available: [ "myapex" ],
9449 lint: {
9450 strict_updatability_linting: %v,
9451 },
9452 sdk_version: "current",
9453 min_sdk_version: "29",
9454 }
9455 `
9456 fs := android.MockFS{
9457 "lint-baseline.xml": nil,
9458 }
9459
9460 testCases := []struct {
9461 testCaseName string
9462 apexUpdatable bool
9463 javaStrictUpdtabilityLint bool
9464 lintFileExists bool
9465 disallowedFlagExpected bool
9466 }{
9467 {
9468 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9469 apexUpdatable: true,
9470 javaStrictUpdtabilityLint: true,
9471 lintFileExists: false,
9472 disallowedFlagExpected: false,
9473 },
9474 {
9475 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9476 apexUpdatable: false,
9477 javaStrictUpdtabilityLint: false,
9478 lintFileExists: true,
9479 disallowedFlagExpected: false,
9480 },
9481 {
9482 testCaseName: "non-updatable apex respects strict updatability of javalib",
9483 apexUpdatable: false,
9484 javaStrictUpdtabilityLint: true,
9485 lintFileExists: true,
9486 disallowedFlagExpected: true,
9487 },
9488 {
9489 testCaseName: "updatable apex sets strict updatability of javalib to true",
9490 apexUpdatable: true,
9491 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9492 lintFileExists: true,
9493 disallowedFlagExpected: true,
9494 },
9495 }
9496
9497 for _, testCase := range testCases {
9498 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9499 fixtures := []android.FixturePreparer{}
9500 if testCase.lintFileExists {
9501 fixtures = append(fixtures, fs.AddToFixture())
9502 }
9503
9504 result := testApex(t, bp, fixtures...)
9505 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9506 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9507 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9508
9509 if disallowedFlagActual != testCase.disallowedFlagExpected {
9510 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9511 }
9512 }
9513}
9514
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009515func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9516 bp := `
9517 apex {
9518 name: "myapex",
9519 key: "myapex.key",
9520 java_libs: ["myjavalib"],
9521 updatable: true,
9522 min_sdk_version: "29",
9523 }
9524 apex_key {
9525 name: "myapex.key",
9526 }
9527 java_library {
9528 name: "myjavalib",
9529 srcs: ["MyClass.java"],
9530 apex_available: [ "myapex" ],
9531 sdk_version: "current",
9532 min_sdk_version: "29",
9533 }
9534 `
9535
9536 testCases := []struct {
9537 testCaseName string
9538 moduleDirectory string
9539 disallowedFlagExpected bool
9540 }{
9541 {
9542 testCaseName: "lintable module defined outside libcore",
9543 moduleDirectory: "",
9544 disallowedFlagExpected: true,
9545 },
9546 {
9547 testCaseName: "lintable module defined in libcore root directory",
9548 moduleDirectory: "libcore/",
9549 disallowedFlagExpected: false,
9550 },
9551 {
9552 testCaseName: "lintable module defined in libcore child directory",
9553 moduleDirectory: "libcore/childdir/",
9554 disallowedFlagExpected: true,
9555 },
9556 }
9557
9558 for _, testCase := range testCases {
9559 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9560 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9561 result := testApex(t, "", lintFileCreator, bpFileCreator)
9562 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9563 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9564 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9565 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9566
9567 if disallowedFlagActual != testCase.disallowedFlagExpected {
9568 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9569 }
9570 }
9571}
9572
Spandan Das66773252022-01-15 00:23:18 +00009573// checks transtive deps of an apex coming from bootclasspath_fragment
9574func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9575 bp := `
9576 apex {
9577 name: "myapex",
9578 key: "myapex.key",
9579 bootclasspath_fragments: ["mybootclasspathfragment"],
9580 updatable: true,
9581 min_sdk_version: "29",
9582 }
9583 apex_key {
9584 name: "myapex.key",
9585 }
9586 bootclasspath_fragment {
9587 name: "mybootclasspathfragment",
9588 contents: ["myjavalib"],
9589 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009590 hidden_api: {
9591 split_packages: ["*"],
9592 },
Spandan Das66773252022-01-15 00:23:18 +00009593 }
9594 java_library {
9595 name: "myjavalib",
9596 srcs: ["MyClass.java"],
9597 apex_available: [ "myapex" ],
9598 sdk_version: "current",
9599 min_sdk_version: "29",
9600 compile_dex: true,
9601 }
9602 `
9603 fs := android.MockFS{
9604 "lint-baseline.xml": nil,
9605 }
9606
9607 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9608 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9609 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9610 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9611 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9612 }
9613}
9614
Spandan Das42e89502022-05-06 22:12:55 +00009615// updatable apexes should propagate updatable=true to its apps
9616func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9617 bp := `
9618 apex {
9619 name: "myapex",
9620 key: "myapex.key",
9621 updatable: %v,
9622 apps: [
9623 "myapp",
9624 ],
9625 min_sdk_version: "30",
9626 }
9627 apex_key {
9628 name: "myapex.key",
9629 }
9630 android_app {
9631 name: "myapp",
9632 updatable: %v,
9633 apex_available: [
9634 "myapex",
9635 ],
9636 sdk_version: "current",
9637 min_sdk_version: "30",
9638 }
9639 `
9640 testCases := []struct {
9641 name string
9642 apex_is_updatable_bp bool
9643 app_is_updatable_bp bool
9644 app_is_updatable_expected bool
9645 }{
9646 {
9647 name: "Non-updatable apex respects updatable property of non-updatable app",
9648 apex_is_updatable_bp: false,
9649 app_is_updatable_bp: false,
9650 app_is_updatable_expected: false,
9651 },
9652 {
9653 name: "Non-updatable apex respects updatable property of updatable app",
9654 apex_is_updatable_bp: false,
9655 app_is_updatable_bp: true,
9656 app_is_updatable_expected: true,
9657 },
9658 {
9659 name: "Updatable apex respects updatable property of updatable app",
9660 apex_is_updatable_bp: true,
9661 app_is_updatable_bp: true,
9662 app_is_updatable_expected: true,
9663 },
9664 {
9665 name: "Updatable apex sets updatable=true on non-updatable app",
9666 apex_is_updatable_bp: true,
9667 app_is_updatable_bp: false,
9668 app_is_updatable_expected: true,
9669 },
9670 }
9671 for _, testCase := range testCases {
9672 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9673 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9674 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9675 }
9676}
9677
Kiyoung Kim487689e2022-07-26 09:48:22 +09009678func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9679 bp := `
9680 apex {
9681 name: "myapex",
9682 key: "myapex.key",
9683 native_shared_libs: ["libfoo"],
9684 min_sdk_version: "29",
9685 }
9686 apex_key {
9687 name: "myapex.key",
9688 }
9689 cc_library {
9690 name: "libfoo",
9691 shared_libs: ["libc"],
9692 apex_available: ["myapex"],
9693 min_sdk_version: "29",
9694 }
9695 cc_api_library {
9696 name: "libc",
9697 src: "libc.so",
9698 min_sdk_version: "29",
9699 recovery_available: true,
9700 }
9701 api_imports {
9702 name: "api_imports",
9703 shared_libs: [
9704 "libc",
9705 ],
9706 header_libs: [],
9707 }
9708 `
9709 result := testApex(t, bp)
9710
9711 hasDep := func(m android.Module, wantDep android.Module) bool {
9712 t.Helper()
9713 var found bool
9714 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9715 if dep == wantDep {
9716 found = true
9717 }
9718 })
9719 return found
9720 }
9721
9722 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9723 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9724
9725 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9726
9727 // libfoo core variant should be buildable in the same inner tree since
9728 // certain mcombo files might build system and apexes in the same inner tree
9729 // libfoo core variant should link against source libc
9730 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9731 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9732 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9733}
Liz Kammer0e255ef2022-11-04 16:07:04 -04009734
9735func TestApexImageInMixedBuilds(t *testing.T) {
9736 bp := `
9737apex_key{
9738 name: "foo_key",
9739}
9740apex {
9741 name: "foo",
9742 key: "foo_key",
9743 updatable: true,
9744 min_sdk_version: "31",
9745 file_contexts: ":myapex-file_contexts",
9746 bazel_module: { label: "//:foo" },
9747}`
9748
9749 outputBaseDir := "out/bazel"
9750 result := android.GroupFixturePreparers(
9751 prepareForApexTest,
9752 android.FixtureModifyConfig(func(config android.Config) {
9753 config.BazelContext = android.MockBazelContext{
9754 OutputBaseDir: outputBaseDir,
9755 LabelToApexInfo: map[string]cquery.ApexInfo{
9756 "//:foo": cquery.ApexInfo{
Jingwen Chen1ec77852022-11-07 14:36:12 +00009757 SignedOutput: "signed_out.apex",
9758 UnsignedOutput: "unsigned_out.apex",
9759 BundleKeyInfo: []string{"public_key", "private_key"},
9760 ContainerKeyInfo: []string{"container_cert", "container_private"},
9761 SymbolsUsedByApex: "foo_using.txt",
9762 JavaSymbolsUsedByApex: "foo_using.xml",
Liz Kammer303978d2022-11-04 16:12:43 -04009763 BundleFile: "apex_bundle.zip",
Liz Kammer0e255ef2022-11-04 16:07:04 -04009764
9765 // unused
9766 PackageName: "pkg_name",
9767 ProvidesLibs: []string{"a", "b"},
9768 RequiresLibs: []string{"c", "d"},
9769 },
9770 },
9771 }
9772 }),
9773 ).RunTestWithBp(t, bp)
9774
9775 m := result.ModuleForTests("foo", "android_common_foo_image").Module()
9776 ab, ok := m.(*apexBundle)
9777 if !ok {
9778 t.Fatalf("Expected module to be an apexBundle, was not")
9779 }
9780
9781 if w, g := "out/bazel/execroot/__main__/public_key", ab.publicKeyFile.String(); w != g {
9782 t.Errorf("Expected public key %q, got %q", w, g)
9783 }
9784
9785 if w, g := "out/bazel/execroot/__main__/private_key", ab.privateKeyFile.String(); w != g {
9786 t.Errorf("Expected private key %q, got %q", w, g)
9787 }
9788
9789 if w, g := "out/bazel/execroot/__main__/container_cert", ab.containerCertificateFile.String(); w != g {
9790 t.Errorf("Expected public container key %q, got %q", w, g)
9791 }
9792
9793 if w, g := "out/bazel/execroot/__main__/container_private", ab.containerPrivateKeyFile.String(); w != g {
9794 t.Errorf("Expected private container key %q, got %q", w, g)
9795 }
9796
9797 if w, g := "out/bazel/execroot/__main__/signed_out.apex", ab.outputFile.String(); w != g {
9798 t.Errorf("Expected output file %q, got %q", w, g)
9799 }
Jingwen Chen0c9a2762022-11-04 09:40:47 +00009800
9801 if w, g := "out/bazel/execroot/__main__/foo_using.txt", ab.nativeApisUsedByModuleFile.String(); w != g {
9802 t.Errorf("Expected output file %q, got %q", w, g)
9803 }
Jingwen Chen1ec77852022-11-07 14:36:12 +00009804
9805 if w, g := "out/bazel/execroot/__main__/foo_using.xml", ab.javaApisUsedByModuleFile.String(); w != g {
9806 t.Errorf("Expected output file %q, got %q", w, g)
9807 }
Liz Kammer303978d2022-11-04 16:12:43 -04009808
9809 mkData := android.AndroidMkDataForTest(t, result.TestContext, m)
9810 var builder strings.Builder
9811 mkData.Custom(&builder, "foo", "BAZEL_TARGET_", "", mkData)
9812
9813 data := builder.String()
9814 if w := "ALL_MODULES.$(my_register_name).BUNDLE := out/bazel/execroot/__main__/apex_bundle.zip"; !strings.Contains(data, w) {
9815 t.Errorf("Expected %q in androidmk data, but did not find %q", w, data)
9816 }
Liz Kammer0e255ef2022-11-04 16:07:04 -04009817}