blob: a02300e4d521a4c119ded125367f67d21a1a06f2 [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()
530 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
531 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
532
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533 optFlags := apexRule.Args["opt_flags"]
534 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700535 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100536 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900537
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538 copyCmds := apexRule.Args["copy_commands"]
539
540 // Ensure that main rule creates an output
541 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
542
543 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900549
550 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557
558 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800559 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
565 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 // .. but not for java libs
568 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800570
Colin Cross7113d202019-11-20 16:39:12 -0800571 // Ensure that the platform variant ends with _shared or _common
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900574 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
575 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
577
578 // Ensure that dynamic dependency to java libs are not included
579 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800580
581 // Ensure that all symlinks are present.
582 found_foo_link_64 := false
583 found_foo := false
584 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900585 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800586 if strings.HasSuffix(cmd, "bin/foo") {
587 found_foo = true
588 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
589 found_foo_link_64 = true
590 }
591 }
592 }
593 good := found_foo && found_foo_link_64
594 if !good {
595 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
596 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900597
Artur Satayeva8bd1132020-04-27 18:07:06 +0100598 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
601 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
602 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100603
604 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100606 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
608 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800609}
610
Jooyung Hanf21c7972019-12-16 22:32:06 +0900611func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800612 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613 apex_defaults {
614 name: "myapex-defaults",
615 key: "myapex.key",
616 prebuilts: ["myetc"],
617 native_shared_libs: ["mylib"],
618 java_libs: ["myjar"],
619 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900620 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800621 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000622 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900623 }
624
625 prebuilt_etc {
626 name: "myetc",
627 src: "myprebuilt",
628 }
629
630 apex {
631 name: "myapex",
632 defaults: ["myapex-defaults"],
633 }
634
635 apex_key {
636 name: "myapex.key",
637 public_key: "testkey.avbpubkey",
638 private_key: "testkey.pem",
639 }
640
641 cc_library {
642 name: "mylib",
643 system_shared_libs: [],
644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900646 }
647
648 java_library {
649 name: "myjar",
650 srcs: ["foo/bar/MyClass.java"],
651 sdk_version: "none",
652 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000653 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900654 }
655
656 android_app {
657 name: "AppFoo",
658 srcs: ["foo/bar/MyClass.java"],
659 sdk_version: "none",
660 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000661 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900662 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900663
664 runtime_resource_overlay {
665 name: "rro",
666 theme: "blue",
667 }
668
markchien2f59ec92020-09-02 16:23:38 +0800669 bpf {
670 name: "bpf",
671 srcs: ["bpf.c", "bpf2.c"],
672 }
673
Ken Chenfad7f9d2021-11-10 22:02:57 +0800674 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800675 name: "netdTest",
676 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800677 sub_dir: "netd",
678 }
679
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000681 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 "etc/myetc",
683 "javalib/myjar.jar",
684 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000685 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900686 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800687 "etc/bpf/bpf.o",
688 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800689 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900690 })
691}
692
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800694 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 apex {
696 name: "myapex",
697 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000698 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 }
700
701 apex_key {
702 name: "myapex.key",
703 public_key: "testkey.avbpubkey",
704 private_key: "testkey.pem",
705 }
706 `)
707
708 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900709 args := module.Rule("apexRule").Args
710 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
711 t.Error("manifest should be apex_manifest.pb, but " + manifest)
712 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900713}
714
Liz Kammer4854a7d2021-05-27 14:28:27 -0400715func TestApexManifestMinSdkVersion(t *testing.T) {
716 ctx := testApex(t, `
717 apex_defaults {
718 name: "my_defaults",
719 key: "myapex.key",
720 product_specific: true,
721 file_contexts: ":my-file-contexts",
722 updatable: false,
723 }
724 apex {
725 name: "myapex_30",
726 min_sdk_version: "30",
727 defaults: ["my_defaults"],
728 }
729
730 apex {
731 name: "myapex_current",
732 min_sdk_version: "current",
733 defaults: ["my_defaults"],
734 }
735
736 apex {
737 name: "myapex_none",
738 defaults: ["my_defaults"],
739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746
747 filegroup {
748 name: "my-file-contexts",
749 srcs: ["product_specific_file_contexts"],
750 }
751 `, withFiles(map[string][]byte{
752 "product_specific_file_contexts": nil,
753 }), android.FixtureModifyProductVariables(
754 func(variables android.FixtureProductVariables) {
755 variables.Unbundled_build = proptools.BoolPtr(true)
756 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
757 }), android.FixtureMergeEnv(map[string]string{
758 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
759 }))
760
761 testCases := []struct {
762 module string
763 minSdkVersion string
764 }{
765 {
766 module: "myapex_30",
767 minSdkVersion: "30",
768 },
769 {
770 module: "myapex_current",
771 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
772 },
773 {
774 module: "myapex_none",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 }
778 for _, tc := range testCases {
779 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
780 args := module.Rule("apexRule").Args
781 optFlags := args["opt_flags"]
782 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
783 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
784 }
785 }
786}
787
Alex Light5098a612018-11-29 17:12:15 -0800788func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800789 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800790 apex {
791 name: "myapex",
792 key: "myapex.key",
793 payload_type: "zip",
794 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000795 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800796 }
797
798 apex_key {
799 name: "myapex.key",
800 public_key: "testkey.avbpubkey",
801 private_key: "testkey.pem",
802 }
803
804 cc_library {
805 name: "mylib",
806 srcs: ["mylib.cpp"],
807 shared_libs: ["mylib2"],
808 system_shared_libs: [],
809 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000810 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800811 }
812
813 cc_library {
814 name: "mylib2",
815 srcs: ["mylib.cpp"],
816 system_shared_libs: [],
817 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000818 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800819 }
820 `)
821
Sundong Ahnabb64432019-10-22 13:58:29 +0900822 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800823 copyCmds := zipApexRule.Args["copy_commands"]
824
825 // Ensure that main rule creates an output
826 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
827
828 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700829 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800830
831 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700832 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800833
834 // Ensure that both direct and indirect deps are copied into apex
835 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
836 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900837}
838
839func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800840 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900841 apex {
842 name: "myapex",
843 key: "myapex.key",
844 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900845 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000846 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900847 }
848
849 apex_key {
850 name: "myapex.key",
851 public_key: "testkey.avbpubkey",
852 private_key: "testkey.pem",
853 }
854
855 cc_library {
856 name: "mylib",
857 srcs: ["mylib.cpp"],
858 shared_libs: ["mylib2", "mylib3"],
859 system_shared_libs: [],
860 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000861 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900862 }
863
864 cc_library {
865 name: "mylib2",
866 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900867 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900868 system_shared_libs: [],
869 stl: "none",
870 stubs: {
871 versions: ["1", "2", "3"],
872 },
873 }
874
875 cc_library {
876 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900877 srcs: ["mylib.cpp"],
878 shared_libs: ["mylib4"],
879 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900880 stl: "none",
881 stubs: {
882 versions: ["10", "11", "12"],
883 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000884 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900885 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900886
887 cc_library {
888 name: "mylib4",
889 srcs: ["mylib.cpp"],
890 system_shared_libs: [],
891 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000892 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900893 }
Jiyong Park105dc322021-06-11 17:22:09 +0900894
895 rust_binary {
896 name: "foo.rust",
897 srcs: ["foo.rs"],
898 shared_libs: ["libfoo.shared_from_rust"],
899 prefer_rlib: true,
900 apex_available: ["myapex"],
901 }
902
903 cc_library_shared {
904 name: "libfoo.shared_from_rust",
905 srcs: ["mylib.cpp"],
906 system_shared_libs: [],
907 stl: "none",
908 stubs: {
909 versions: ["10", "11", "12"],
910 },
911 }
912
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913 `)
914
Sundong Ahnabb64432019-10-22 13:58:29 +0900915 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916 copyCmds := apexRule.Args["copy_commands"]
917
918 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800919 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900920
921 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800922 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923
924 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800925 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900926
Colin Crossaede88c2020-08-11 12:17:01 -0700927 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928
929 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900930 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900932 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900933
934 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700935 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700937 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900938
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700939 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
940 // is replaced by sharing of "cFlags" in cc/builder.go.
941 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
942 // module variable representing "cflags". So it was not detected by ensureNotContains.
943 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
944 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
945 // including the original cflags's "-include mylib.h".
946 //
Jiyong Park64379952018-12-13 18:37:29 +0900947 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700948 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
949 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900950
Jiyong Park85cc35a2022-07-17 11:30:47 +0900951 // Ensure that genstub for platform-provided lib is invoked with --systemapi
952 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
953 // Ensure that genstub for apex-provided lib is invoked with --apex
954 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900955
Jooyung Hana57af4a2020-01-23 05:36:59 +0000956 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900957 "lib64/mylib.so",
958 "lib64/mylib3.so",
959 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900960 "bin/foo.rust",
961 "lib64/libc++.so", // by the implicit dependency from foo.rust
962 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900963 })
Jiyong Park105dc322021-06-11 17:22:09 +0900964
965 // Ensure that stub dependency from a rust module is not included
966 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
967 // The rust module is linked to the stub cc library
968 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
969 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
970 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900971
972 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
973 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900974}
975
Jiyong Park1bc84122021-06-22 20:23:05 +0900976func TestApexCanUsePrivateApis(t *testing.T) {
977 ctx := testApex(t, `
978 apex {
979 name: "myapex",
980 key: "myapex.key",
981 native_shared_libs: ["mylib"],
982 binaries: ["foo.rust"],
983 updatable: false,
984 platform_apis: true,
985 }
986
987 apex_key {
988 name: "myapex.key",
989 public_key: "testkey.avbpubkey",
990 private_key: "testkey.pem",
991 }
992
993 cc_library {
994 name: "mylib",
995 srcs: ["mylib.cpp"],
996 shared_libs: ["mylib2"],
997 system_shared_libs: [],
998 stl: "none",
999 apex_available: [ "myapex" ],
1000 }
1001
1002 cc_library {
1003 name: "mylib2",
1004 srcs: ["mylib.cpp"],
1005 cflags: ["-include mylib.h"],
1006 system_shared_libs: [],
1007 stl: "none",
1008 stubs: {
1009 versions: ["1", "2", "3"],
1010 },
1011 }
1012
1013 rust_binary {
1014 name: "foo.rust",
1015 srcs: ["foo.rs"],
1016 shared_libs: ["libfoo.shared_from_rust"],
1017 prefer_rlib: true,
1018 apex_available: ["myapex"],
1019 }
1020
1021 cc_library_shared {
1022 name: "libfoo.shared_from_rust",
1023 srcs: ["mylib.cpp"],
1024 system_shared_libs: [],
1025 stl: "none",
1026 stubs: {
1027 versions: ["10", "11", "12"],
1028 },
1029 }
1030 `)
1031
1032 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1033 copyCmds := apexRule.Args["copy_commands"]
1034
1035 // Ensure that indirect stubs dep is not included
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1037 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1038
1039 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1040 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001041 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001042 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1043 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001044 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001045 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1046 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1047}
1048
Colin Cross7812fd32020-09-25 12:35:10 -07001049func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1050 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001051 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001052 apex {
1053 name: "myapex",
1054 key: "myapex.key",
1055 native_shared_libs: ["mylib", "mylib3"],
1056 min_sdk_version: "29",
1057 }
1058
1059 apex_key {
1060 name: "myapex.key",
1061 public_key: "testkey.avbpubkey",
1062 private_key: "testkey.pem",
1063 }
1064
1065 cc_library {
1066 name: "mylib",
1067 srcs: ["mylib.cpp"],
1068 shared_libs: ["mylib2", "mylib3"],
1069 system_shared_libs: [],
1070 stl: "none",
1071 apex_available: [ "myapex" ],
1072 min_sdk_version: "28",
1073 }
1074
1075 cc_library {
1076 name: "mylib2",
1077 srcs: ["mylib.cpp"],
1078 cflags: ["-include mylib.h"],
1079 system_shared_libs: [],
1080 stl: "none",
1081 stubs: {
1082 versions: ["28", "29", "30", "current"],
1083 },
1084 min_sdk_version: "28",
1085 }
1086
1087 cc_library {
1088 name: "mylib3",
1089 srcs: ["mylib.cpp"],
1090 shared_libs: ["mylib4"],
1091 system_shared_libs: [],
1092 stl: "none",
1093 stubs: {
1094 versions: ["28", "29", "30", "current"],
1095 },
1096 apex_available: [ "myapex" ],
1097 min_sdk_version: "28",
1098 }
1099
1100 cc_library {
1101 name: "mylib4",
1102 srcs: ["mylib.cpp"],
1103 system_shared_libs: [],
1104 stl: "none",
1105 apex_available: [ "myapex" ],
1106 min_sdk_version: "28",
1107 }
1108 `)
1109
1110 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1111 copyCmds := apexRule.Args["copy_commands"]
1112
1113 // Ensure that direct non-stubs dep is always included
1114 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1115
1116 // Ensure that indirect stubs dep is not included
1117 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1118
1119 // Ensure that direct stubs dep is included
1120 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1121
1122 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1123
Jiyong Park55549df2021-02-26 23:57:23 +09001124 // Ensure that mylib is linking with the latest version of stub for mylib2
1125 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001126 // ... and not linking to the non-stub (impl) variant of mylib2
1127 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1128
1129 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1130 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1131 // .. and not linking to the stubs variant of mylib3
1132 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1133
1134 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001135 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001136 ensureNotContains(t, mylib2Cflags, "-include ")
1137
Jiyong Park85cc35a2022-07-17 11:30:47 +09001138 // Ensure that genstub is invoked with --systemapi
1139 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001140
1141 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1142 "lib64/mylib.so",
1143 "lib64/mylib3.so",
1144 "lib64/mylib4.so",
1145 })
1146}
1147
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001148func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1149 t.Parallel()
1150 // myapex (Z)
1151 // mylib -----------------.
1152 // |
1153 // otherapex (29) |
1154 // libstub's versions: 29 Z current
1155 // |
1156 // <platform> |
1157 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001158 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001159 apex {
1160 name: "myapex",
1161 key: "myapex.key",
1162 native_shared_libs: ["mylib"],
1163 min_sdk_version: "Z", // non-final
1164 }
1165
1166 cc_library {
1167 name: "mylib",
1168 srcs: ["mylib.cpp"],
1169 shared_libs: ["libstub"],
1170 apex_available: ["myapex"],
1171 min_sdk_version: "Z",
1172 }
1173
1174 apex_key {
1175 name: "myapex.key",
1176 public_key: "testkey.avbpubkey",
1177 private_key: "testkey.pem",
1178 }
1179
1180 apex {
1181 name: "otherapex",
1182 key: "myapex.key",
1183 native_shared_libs: ["libstub"],
1184 min_sdk_version: "29",
1185 }
1186
1187 cc_library {
1188 name: "libstub",
1189 srcs: ["mylib.cpp"],
1190 stubs: {
1191 versions: ["29", "Z", "current"],
1192 },
1193 apex_available: ["otherapex"],
1194 min_sdk_version: "29",
1195 }
1196
1197 // platform module depending on libstub from otherapex should use the latest stub("current")
1198 cc_library {
1199 name: "libplatform",
1200 srcs: ["mylib.cpp"],
1201 shared_libs: ["libstub"],
1202 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001203 `,
1204 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1205 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1206 variables.Platform_sdk_final = proptools.BoolPtr(false)
1207 variables.Platform_version_active_codenames = []string{"Z"}
1208 }),
1209 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001210
Jiyong Park55549df2021-02-26 23:57:23 +09001211 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001212 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001213 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001214 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001215 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001216
1217 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1218 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1219 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1220 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1221 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1222}
1223
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001224func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001225 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001226 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001227 name: "myapex2",
1228 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001230 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001231 }
1232
1233 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001234 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001235 public_key: "testkey.avbpubkey",
1236 private_key: "testkey.pem",
1237 }
1238
1239 cc_library {
1240 name: "mylib",
1241 srcs: ["mylib.cpp"],
1242 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001243 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001244 system_shared_libs: [],
1245 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001246 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001247 }
1248
1249 cc_library {
1250 name: "libfoo",
1251 srcs: ["mylib.cpp"],
1252 shared_libs: ["libbar"],
1253 system_shared_libs: [],
1254 stl: "none",
1255 stubs: {
1256 versions: ["10", "20", "30"],
1257 },
1258 }
1259
1260 cc_library {
1261 name: "libbar",
1262 srcs: ["mylib.cpp"],
1263 system_shared_libs: [],
1264 stl: "none",
1265 }
1266
Jiyong Park678c8812020-02-07 17:25:49 +09001267 cc_library_static {
1268 name: "libbaz",
1269 srcs: ["mylib.cpp"],
1270 system_shared_libs: [],
1271 stl: "none",
1272 apex_available: [ "myapex2" ],
1273 }
1274
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001275 `)
1276
Jiyong Park83dc74b2020-01-14 18:38:44 +09001277 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278 copyCmds := apexRule.Args["copy_commands"]
1279
1280 // Ensure that direct non-stubs dep is always included
1281 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1282
1283 // Ensure that indirect stubs dep is not included
1284 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1285
1286 // Ensure that dependency of stubs is not included
1287 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1288
Colin Crossaede88c2020-08-11 12:17:01 -07001289 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001290
1291 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001292 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001293 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001294 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001295
Jiyong Park3ff16992019-12-27 14:11:47 +09001296 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001297
1298 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1299 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001300
Artur Satayeva8bd1132020-04-27 18:07:06 +01001301 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001302 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001303
Artur Satayeva8bd1132020-04-27 18:07:06 +01001304 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001305 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001306}
1307
Jooyung Hand3639552019-08-09 12:57:43 +09001308func TestApexWithRuntimeLibsDependency(t *testing.T) {
1309 /*
1310 myapex
1311 |
1312 v (runtime_libs)
1313 mylib ------+------> libfoo [provides stub]
1314 |
1315 `------> libbar
1316 */
Colin Cross1c460562021-02-16 17:55:47 -08001317 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001318 apex {
1319 name: "myapex",
1320 key: "myapex.key",
1321 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001322 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001323 }
1324
1325 apex_key {
1326 name: "myapex.key",
1327 public_key: "testkey.avbpubkey",
1328 private_key: "testkey.pem",
1329 }
1330
1331 cc_library {
1332 name: "mylib",
1333 srcs: ["mylib.cpp"],
1334 runtime_libs: ["libfoo", "libbar"],
1335 system_shared_libs: [],
1336 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001337 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001338 }
1339
1340 cc_library {
1341 name: "libfoo",
1342 srcs: ["mylib.cpp"],
1343 system_shared_libs: [],
1344 stl: "none",
1345 stubs: {
1346 versions: ["10", "20", "30"],
1347 },
1348 }
1349
1350 cc_library {
1351 name: "libbar",
1352 srcs: ["mylib.cpp"],
1353 system_shared_libs: [],
1354 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001355 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001356 }
1357
1358 `)
1359
Sundong Ahnabb64432019-10-22 13:58:29 +09001360 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001361 copyCmds := apexRule.Args["copy_commands"]
1362
1363 // Ensure that direct non-stubs dep is always included
1364 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1365
1366 // Ensure that indirect stubs dep is not included
1367 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1368
1369 // Ensure that runtime_libs dep in included
1370 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1371
Sundong Ahnabb64432019-10-22 13:58:29 +09001372 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001373 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1374 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001375
1376}
1377
Paul Duffina02cae32021-03-09 01:44:06 +00001378var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1379 cc.PrepareForTestWithCcBuildComponents,
1380 PrepareForTestWithApexBuildComponents,
1381 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001382 apex {
1383 name: "com.android.runtime",
1384 key: "com.android.runtime.key",
1385 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001386 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001387 }
1388
1389 apex_key {
1390 name: "com.android.runtime.key",
1391 public_key: "testkey.avbpubkey",
1392 private_key: "testkey.pem",
1393 }
Paul Duffina02cae32021-03-09 01:44:06 +00001394 `),
1395 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1396)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001397
Paul Duffina02cae32021-03-09 01:44:06 +00001398func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001399 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001400 cc_library {
1401 name: "libc",
1402 no_libcrt: true,
1403 nocrt: true,
1404 stl: "none",
1405 system_shared_libs: [],
1406 stubs: { versions: ["1"] },
1407 apex_available: ["com.android.runtime"],
1408
1409 sanitize: {
1410 hwaddress: true,
1411 }
1412 }
1413
1414 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001415 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001416 no_libcrt: true,
1417 nocrt: true,
1418 stl: "none",
1419 system_shared_libs: [],
1420 srcs: [""],
1421 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001422 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001423
1424 sanitize: {
1425 never: true,
1426 },
Paul Duffina02cae32021-03-09 01:44:06 +00001427 } `)
1428 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001429
1430 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1431 "lib64/bionic/libc.so",
1432 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1433 })
1434
Colin Cross4c4c1be2022-02-10 11:41:18 -08001435 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001436
1437 installed := hwasan.Description("install libclang_rt.hwasan")
1438 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1439
1440 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1441 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1442 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1443}
1444
1445func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001446 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001447 prepareForTestOfRuntimeApexWithHwasan,
1448 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1449 variables.SanitizeDevice = []string{"hwaddress"}
1450 }),
1451 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001452 cc_library {
1453 name: "libc",
1454 no_libcrt: true,
1455 nocrt: true,
1456 stl: "none",
1457 system_shared_libs: [],
1458 stubs: { versions: ["1"] },
1459 apex_available: ["com.android.runtime"],
1460 }
1461
1462 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001463 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001464 no_libcrt: true,
1465 nocrt: true,
1466 stl: "none",
1467 system_shared_libs: [],
1468 srcs: [""],
1469 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001470 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001471
1472 sanitize: {
1473 never: true,
1474 },
1475 }
Paul Duffina02cae32021-03-09 01:44:06 +00001476 `)
1477 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001478
1479 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1480 "lib64/bionic/libc.so",
1481 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1482 })
1483
Colin Cross4c4c1be2022-02-10 11:41:18 -08001484 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001485
1486 installed := hwasan.Description("install libclang_rt.hwasan")
1487 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1488
1489 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1490 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1491 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1492}
1493
Jooyung Han61b66e92020-03-21 14:21:46 +00001494func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1495 testcases := []struct {
1496 name string
1497 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001498 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001499 shouldLink string
1500 shouldNotLink []string
1501 }{
1502 {
Jiyong Park55549df2021-02-26 23:57:23 +09001503 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001504 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001505 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001506 shouldLink: "current",
1507 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001508 },
1509 {
Jiyong Park55549df2021-02-26 23:57:23 +09001510 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001511 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001512 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001513 shouldLink: "current",
1514 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001515 },
1516 }
1517 for _, tc := range testcases {
1518 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001519 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001520 apex {
1521 name: "myapex",
1522 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001523 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001524 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001525 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001526 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001527
Jooyung Han61b66e92020-03-21 14:21:46 +00001528 apex_key {
1529 name: "myapex.key",
1530 public_key: "testkey.avbpubkey",
1531 private_key: "testkey.pem",
1532 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001533
Jooyung Han61b66e92020-03-21 14:21:46 +00001534 cc_library {
1535 name: "mylib",
1536 srcs: ["mylib.cpp"],
1537 vendor_available: true,
1538 shared_libs: ["libbar"],
1539 system_shared_libs: [],
1540 stl: "none",
1541 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001542 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001543 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001544
Jooyung Han61b66e92020-03-21 14:21:46 +00001545 cc_library {
1546 name: "libbar",
1547 srcs: ["mylib.cpp"],
1548 system_shared_libs: [],
1549 stl: "none",
1550 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001551 llndk: {
1552 symbol_file: "libbar.map.txt",
1553 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001554 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001555 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001556 withUnbundledBuild,
1557 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001558
Jooyung Han61b66e92020-03-21 14:21:46 +00001559 // Ensure that LLNDK dep is not included
1560 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1561 "lib64/mylib.so",
1562 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001563
Jooyung Han61b66e92020-03-21 14:21:46 +00001564 // Ensure that LLNDK dep is required
1565 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1566 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1567 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001568
Steven Moreland2c4000c2021-04-27 02:08:49 +00001569 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1570 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001571 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001572 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001573 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001574
Steven Moreland2c4000c2021-04-27 02:08:49 +00001575 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001576 ver := tc.shouldLink
1577 if tc.shouldLink == "current" {
1578 ver = strconv.Itoa(android.FutureApiLevelInt)
1579 }
1580 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001581 })
1582 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001583}
1584
Jiyong Park25fc6a92018-11-18 18:02:45 +09001585func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001586 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001587 apex {
1588 name: "myapex",
1589 key: "myapex.key",
1590 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001591 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001592 }
1593
1594 apex_key {
1595 name: "myapex.key",
1596 public_key: "testkey.avbpubkey",
1597 private_key: "testkey.pem",
1598 }
1599
1600 cc_library {
1601 name: "mylib",
1602 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001603 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001604 shared_libs: ["libdl#27"],
1605 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001606 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001607 }
1608
1609 cc_library_shared {
1610 name: "mylib_shared",
1611 srcs: ["mylib.cpp"],
1612 shared_libs: ["libdl#27"],
1613 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001614 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001615 }
1616
1617 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001618 name: "libBootstrap",
1619 srcs: ["mylib.cpp"],
1620 stl: "none",
1621 bootstrap: true,
1622 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001623 `)
1624
Sundong Ahnabb64432019-10-22 13:58:29 +09001625 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001626 copyCmds := apexRule.Args["copy_commands"]
1627
1628 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001629 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001630 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1631 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001632
1633 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001634 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001635
Colin Crossaede88c2020-08-11 12:17:01 -07001636 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1637 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1638 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001639
1640 // For dependency to libc
1641 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001642 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001643 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001644 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001645 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001646 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1647 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001648
1649 // For dependency to libm
1650 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001651 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001652 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001653 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001654 // ... and is not compiling with the stub
1655 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1656 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1657
1658 // For dependency to libdl
1659 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001660 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001661 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001662 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1663 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001664 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001665 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001666 // ... Cflags from stub is correctly exported to mylib
1667 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1668 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001669
1670 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001671 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1672 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1673 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1674 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001675}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001676
Jooyung Han749dc692020-04-15 11:03:39 +09001677func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001678 // there are three links between liba --> libz.
1679 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001680 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001681 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001682 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001683 apex {
1684 name: "myapex",
1685 key: "myapex.key",
1686 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001687 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001688 }
1689
1690 apex {
1691 name: "otherapex",
1692 key: "myapex.key",
1693 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001694 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001695 }
1696
1697 apex_key {
1698 name: "myapex.key",
1699 public_key: "testkey.avbpubkey",
1700 private_key: "testkey.pem",
1701 }
1702
1703 cc_library {
1704 name: "libx",
1705 shared_libs: ["liba"],
1706 system_shared_libs: [],
1707 stl: "none",
1708 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001709 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001710 }
1711
1712 cc_library {
1713 name: "liby",
1714 shared_libs: ["liba"],
1715 system_shared_libs: [],
1716 stl: "none",
1717 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001718 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001719 }
1720
1721 cc_library {
1722 name: "liba",
1723 shared_libs: ["libz"],
1724 system_shared_libs: [],
1725 stl: "none",
1726 apex_available: [
1727 "//apex_available:anyapex",
1728 "//apex_available:platform",
1729 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001730 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001731 }
1732
1733 cc_library {
1734 name: "libz",
1735 system_shared_libs: [],
1736 stl: "none",
1737 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001738 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001739 },
1740 }
Jooyung Han749dc692020-04-15 11:03:39 +09001741 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001742
1743 expectLink := func(from, from_variant, to, to_variant string) {
1744 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1745 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1746 }
1747 expectNoLink := func(from, from_variant, to, to_variant string) {
1748 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1749 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1750 }
1751 // platform liba is linked to non-stub version
1752 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001753 // liba in myapex is linked to current
1754 expectLink("liba", "shared_apex29", "libz", "shared_current")
1755 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001756 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001757 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001758 // liba in otherapex is linked to current
1759 expectLink("liba", "shared_apex30", "libz", "shared_current")
1760 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001761 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1762 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001763}
1764
Jooyung Hanaed150d2020-04-02 01:41:41 +09001765func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001766 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001767 apex {
1768 name: "myapex",
1769 key: "myapex.key",
1770 native_shared_libs: ["libx"],
1771 min_sdk_version: "R",
1772 }
1773
1774 apex_key {
1775 name: "myapex.key",
1776 public_key: "testkey.avbpubkey",
1777 private_key: "testkey.pem",
1778 }
1779
1780 cc_library {
1781 name: "libx",
1782 shared_libs: ["libz"],
1783 system_shared_libs: [],
1784 stl: "none",
1785 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001786 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001787 }
1788
1789 cc_library {
1790 name: "libz",
1791 system_shared_libs: [],
1792 stl: "none",
1793 stubs: {
1794 versions: ["29", "R"],
1795 },
1796 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001797 `,
1798 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1799 variables.Platform_version_active_codenames = []string{"R"}
1800 }),
1801 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001802
1803 expectLink := func(from, from_variant, to, to_variant string) {
1804 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1805 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1806 }
1807 expectNoLink := func(from, from_variant, to, to_variant string) {
1808 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1809 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1810 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001811 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1812 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001813 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1814 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001815}
1816
Jooyung Han4c4da062021-06-23 10:23:16 +09001817func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1818 testApex(t, `
1819 apex {
1820 name: "myapex",
1821 key: "myapex.key",
1822 java_libs: ["libx"],
1823 min_sdk_version: "S",
1824 }
1825
1826 apex_key {
1827 name: "myapex.key",
1828 public_key: "testkey.avbpubkey",
1829 private_key: "testkey.pem",
1830 }
1831
1832 java_library {
1833 name: "libx",
1834 srcs: ["a.java"],
1835 apex_available: [ "myapex" ],
1836 sdk_version: "current",
1837 min_sdk_version: "S", // should be okay
1838 }
1839 `,
1840 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1841 variables.Platform_version_active_codenames = []string{"S"}
1842 variables.Platform_sdk_codename = proptools.StringPtr("S")
1843 }),
1844 )
1845}
1846
Jooyung Han749dc692020-04-15 11:03:39 +09001847func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001848 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001849 apex {
1850 name: "myapex",
1851 key: "myapex.key",
1852 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001853 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001854 }
1855
1856 apex_key {
1857 name: "myapex.key",
1858 public_key: "testkey.avbpubkey",
1859 private_key: "testkey.pem",
1860 }
1861
1862 cc_library {
1863 name: "libx",
1864 shared_libs: ["libz"],
1865 system_shared_libs: [],
1866 stl: "none",
1867 apex_available: [ "myapex" ],
1868 }
1869
1870 cc_library {
1871 name: "libz",
1872 system_shared_libs: [],
1873 stl: "none",
1874 stubs: {
1875 versions: ["1", "2"],
1876 },
1877 }
1878 `)
1879
1880 expectLink := func(from, from_variant, to, to_variant string) {
1881 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1882 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1883 }
1884 expectNoLink := func(from, from_variant, to, to_variant string) {
1885 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1886 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1887 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001888 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001889 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001890 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001891 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001892}
1893
Jiyong Park5df7bd32021-08-25 16:18:46 +09001894func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1895 ctx := testApex(t, `
1896 apex {
1897 name: "myapex",
1898 key: "myapex.key",
1899 native_shared_libs: ["mylib"],
1900 updatable: false,
1901 vendor: true,
1902 min_sdk_version: "29",
1903 }
1904
1905 apex_key {
1906 name: "myapex.key",
1907 public_key: "testkey.avbpubkey",
1908 private_key: "testkey.pem",
1909 }
1910
1911 cc_library {
1912 name: "mylib",
1913 vendor_available: true,
1914 system_shared_libs: [],
1915 stl: "none",
1916 apex_available: [ "myapex" ],
1917 min_sdk_version: "29",
1918 }
1919 `)
1920
1921 vendorVariant := "android_vendor.29_arm64_armv8-a"
1922
1923 // First check that the correct variant of crtbegin_so is used.
1924 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1925 crtBegin := names(ldRule.Args["crtBegin"])
1926 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1927
1928 // Ensure that the crtbegin_so used by the APEX is targeting 29
1929 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1930 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1931}
1932
Jooyung Han03b51852020-02-26 22:45:42 +09001933func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001934 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001935 apex {
1936 name: "myapex",
1937 key: "myapex.key",
1938 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001939 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001940 }
1941
1942 apex_key {
1943 name: "myapex.key",
1944 public_key: "testkey.avbpubkey",
1945 private_key: "testkey.pem",
1946 }
1947
1948 cc_library {
1949 name: "libx",
1950 system_shared_libs: [],
1951 stl: "none",
1952 apex_available: [ "myapex" ],
1953 stubs: {
1954 versions: ["1", "2"],
1955 },
1956 }
1957
1958 cc_library {
1959 name: "libz",
1960 shared_libs: ["libx"],
1961 system_shared_libs: [],
1962 stl: "none",
1963 }
1964 `)
1965
1966 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001967 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001968 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1969 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1970 }
1971 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001972 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001973 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1974 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1975 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001976 expectLink("libz", "shared", "libx", "shared_current")
1977 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001978 expectNoLink("libz", "shared", "libz", "shared_1")
1979 expectNoLink("libz", "shared", "libz", "shared")
1980}
1981
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001982var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1983 func(variables android.FixtureProductVariables) {
1984 variables.SanitizeDevice = []string{"hwaddress"}
1985 },
1986)
1987
Jooyung Han75568392020-03-20 04:29:24 +09001988func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001989 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001990 apex {
1991 name: "myapex",
1992 key: "myapex.key",
1993 native_shared_libs: ["libx"],
1994 min_sdk_version: "29",
1995 }
1996
1997 apex_key {
1998 name: "myapex.key",
1999 public_key: "testkey.avbpubkey",
2000 private_key: "testkey.pem",
2001 }
2002
2003 cc_library {
2004 name: "libx",
2005 shared_libs: ["libbar"],
2006 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002007 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002008 }
2009
2010 cc_library {
2011 name: "libbar",
2012 stubs: {
2013 versions: ["29", "30"],
2014 },
2015 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002016 `,
2017 prepareForTestWithSantitizeHwaddress,
2018 )
Jooyung Han03b51852020-02-26 22:45:42 +09002019 expectLink := func(from, from_variant, to, to_variant string) {
2020 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2021 libFlags := ld.Args["libFlags"]
2022 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2023 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002024 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002025}
2026
Jooyung Han75568392020-03-20 04:29:24 +09002027func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002028 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002029 apex {
2030 name: "myapex",
2031 key: "myapex.key",
2032 native_shared_libs: ["libx"],
2033 min_sdk_version: "29",
2034 }
2035
2036 apex_key {
2037 name: "myapex.key",
2038 public_key: "testkey.avbpubkey",
2039 private_key: "testkey.pem",
2040 }
2041
2042 cc_library {
2043 name: "libx",
2044 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002045 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002046 }
Jooyung Han75568392020-03-20 04:29:24 +09002047 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002048
2049 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002050 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002051 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002052 // note that platform variant is not.
2053 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002054 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002055}
2056
Jooyung Han749dc692020-04-15 11:03:39 +09002057func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2058 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002059 apex {
2060 name: "myapex",
2061 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002062 native_shared_libs: ["mylib"],
2063 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002064 }
2065
2066 apex_key {
2067 name: "myapex.key",
2068 public_key: "testkey.avbpubkey",
2069 private_key: "testkey.pem",
2070 }
Jooyung Han749dc692020-04-15 11:03:39 +09002071
2072 cc_library {
2073 name: "mylib",
2074 srcs: ["mylib.cpp"],
2075 system_shared_libs: [],
2076 stl: "none",
2077 apex_available: [
2078 "myapex",
2079 ],
2080 min_sdk_version: "30",
2081 }
2082 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002083
2084 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2085 apex {
2086 name: "myapex",
2087 key: "myapex.key",
2088 native_shared_libs: ["libfoo.ffi"],
2089 min_sdk_version: "29",
2090 }
2091
2092 apex_key {
2093 name: "myapex.key",
2094 public_key: "testkey.avbpubkey",
2095 private_key: "testkey.pem",
2096 }
2097
2098 rust_ffi_shared {
2099 name: "libfoo.ffi",
2100 srcs: ["foo.rs"],
2101 crate_name: "foo",
2102 apex_available: [
2103 "myapex",
2104 ],
2105 min_sdk_version: "30",
2106 }
2107 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002108
2109 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2110 apex {
2111 name: "myapex",
2112 key: "myapex.key",
2113 java_libs: ["libfoo"],
2114 min_sdk_version: "29",
2115 }
2116
2117 apex_key {
2118 name: "myapex.key",
2119 public_key: "testkey.avbpubkey",
2120 private_key: "testkey.pem",
2121 }
2122
2123 java_import {
2124 name: "libfoo",
2125 jars: ["libfoo.jar"],
2126 apex_available: [
2127 "myapex",
2128 ],
2129 min_sdk_version: "30",
2130 }
2131 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002132}
2133
2134func TestApexMinSdkVersion_Okay(t *testing.T) {
2135 testApex(t, `
2136 apex {
2137 name: "myapex",
2138 key: "myapex.key",
2139 native_shared_libs: ["libfoo"],
2140 java_libs: ["libbar"],
2141 min_sdk_version: "29",
2142 }
2143
2144 apex_key {
2145 name: "myapex.key",
2146 public_key: "testkey.avbpubkey",
2147 private_key: "testkey.pem",
2148 }
2149
2150 cc_library {
2151 name: "libfoo",
2152 srcs: ["mylib.cpp"],
2153 shared_libs: ["libfoo_dep"],
2154 apex_available: ["myapex"],
2155 min_sdk_version: "29",
2156 }
2157
2158 cc_library {
2159 name: "libfoo_dep",
2160 srcs: ["mylib.cpp"],
2161 apex_available: ["myapex"],
2162 min_sdk_version: "29",
2163 }
2164
2165 java_library {
2166 name: "libbar",
2167 sdk_version: "current",
2168 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002169 static_libs: [
2170 "libbar_dep",
2171 "libbar_import_dep",
2172 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002173 apex_available: ["myapex"],
2174 min_sdk_version: "29",
2175 }
2176
2177 java_library {
2178 name: "libbar_dep",
2179 sdk_version: "current",
2180 srcs: ["a.java"],
2181 apex_available: ["myapex"],
2182 min_sdk_version: "29",
2183 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002184
2185 java_import {
2186 name: "libbar_import_dep",
2187 jars: ["libbar.jar"],
2188 apex_available: ["myapex"],
2189 min_sdk_version: "29",
2190 }
Jooyung Han03b51852020-02-26 22:45:42 +09002191 `)
2192}
2193
Colin Cross8ca61c12022-10-06 21:00:14 -07002194func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2195 // Tests that an apex dependency with min_sdk_version higher than the
2196 // min_sdk_version of the apex is allowed as long as the dependency's
2197 // min_sdk_version is less than or equal to the api level that the
2198 // architecture was introduced in. In this case, arm64 didn't exist
2199 // until api level 21, so the arm64 code will never need to run on
2200 // an api level 20 device, even if other architectures of the apex
2201 // will.
2202 testApex(t, `
2203 apex {
2204 name: "myapex",
2205 key: "myapex.key",
2206 native_shared_libs: ["libfoo"],
2207 min_sdk_version: "20",
2208 }
2209
2210 apex_key {
2211 name: "myapex.key",
2212 public_key: "testkey.avbpubkey",
2213 private_key: "testkey.pem",
2214 }
2215
2216 cc_library {
2217 name: "libfoo",
2218 srcs: ["mylib.cpp"],
2219 apex_available: ["myapex"],
2220 min_sdk_version: "21",
2221 stl: "none",
2222 }
2223 `)
2224}
2225
Artur Satayev8cf899a2020-04-15 17:29:42 +01002226func TestJavaStableSdkVersion(t *testing.T) {
2227 testCases := []struct {
2228 name string
2229 expectedError string
2230 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002231 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002232 }{
2233 {
2234 name: "Non-updatable apex with non-stable dep",
2235 bp: `
2236 apex {
2237 name: "myapex",
2238 java_libs: ["myjar"],
2239 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002240 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002241 }
2242 apex_key {
2243 name: "myapex.key",
2244 public_key: "testkey.avbpubkey",
2245 private_key: "testkey.pem",
2246 }
2247 java_library {
2248 name: "myjar",
2249 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002250 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002251 apex_available: ["myapex"],
2252 }
2253 `,
2254 },
2255 {
2256 name: "Updatable apex with stable dep",
2257 bp: `
2258 apex {
2259 name: "myapex",
2260 java_libs: ["myjar"],
2261 key: "myapex.key",
2262 updatable: true,
2263 min_sdk_version: "29",
2264 }
2265 apex_key {
2266 name: "myapex.key",
2267 public_key: "testkey.avbpubkey",
2268 private_key: "testkey.pem",
2269 }
2270 java_library {
2271 name: "myjar",
2272 srcs: ["foo/bar/MyClass.java"],
2273 sdk_version: "current",
2274 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002275 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002276 }
2277 `,
2278 },
2279 {
2280 name: "Updatable apex with non-stable dep",
2281 expectedError: "cannot depend on \"myjar\"",
2282 bp: `
2283 apex {
2284 name: "myapex",
2285 java_libs: ["myjar"],
2286 key: "myapex.key",
2287 updatable: true,
2288 }
2289 apex_key {
2290 name: "myapex.key",
2291 public_key: "testkey.avbpubkey",
2292 private_key: "testkey.pem",
2293 }
2294 java_library {
2295 name: "myjar",
2296 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002297 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002298 apex_available: ["myapex"],
2299 }
2300 `,
2301 },
2302 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002303 name: "Updatable apex with non-stable legacy core platform dep",
2304 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2305 bp: `
2306 apex {
2307 name: "myapex",
2308 java_libs: ["myjar-uses-legacy"],
2309 key: "myapex.key",
2310 updatable: true,
2311 }
2312 apex_key {
2313 name: "myapex.key",
2314 public_key: "testkey.avbpubkey",
2315 private_key: "testkey.pem",
2316 }
2317 java_library {
2318 name: "myjar-uses-legacy",
2319 srcs: ["foo/bar/MyClass.java"],
2320 sdk_version: "core_platform",
2321 apex_available: ["myapex"],
2322 }
2323 `,
2324 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2325 },
2326 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002327 name: "Updatable apex with non-stable transitive dep",
2328 // This is not actually detecting that the transitive dependency is unstable, rather it is
2329 // detecting that the transitive dependency is building against a wider API surface than the
2330 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002331 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002332 bp: `
2333 apex {
2334 name: "myapex",
2335 java_libs: ["myjar"],
2336 key: "myapex.key",
2337 updatable: true,
2338 }
2339 apex_key {
2340 name: "myapex.key",
2341 public_key: "testkey.avbpubkey",
2342 private_key: "testkey.pem",
2343 }
2344 java_library {
2345 name: "myjar",
2346 srcs: ["foo/bar/MyClass.java"],
2347 sdk_version: "current",
2348 apex_available: ["myapex"],
2349 static_libs: ["transitive-jar"],
2350 }
2351 java_library {
2352 name: "transitive-jar",
2353 srcs: ["foo/bar/MyClass.java"],
2354 sdk_version: "core_platform",
2355 apex_available: ["myapex"],
2356 }
2357 `,
2358 },
2359 }
2360
2361 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002362 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2363 continue
2364 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002365 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002366 errorHandler := android.FixtureExpectsNoErrors
2367 if test.expectedError != "" {
2368 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002369 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002370 android.GroupFixturePreparers(
2371 java.PrepareForTestWithJavaDefaultModules,
2372 PrepareForTestWithApexBuildComponents,
2373 prepareForTestWithMyapex,
2374 android.OptionalFixturePreparer(test.preparer),
2375 ).
2376 ExtendWithErrorHandler(errorHandler).
2377 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002378 })
2379 }
2380}
2381
Jooyung Han749dc692020-04-15 11:03:39 +09002382func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2383 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2384 apex {
2385 name: "myapex",
2386 key: "myapex.key",
2387 native_shared_libs: ["mylib"],
2388 min_sdk_version: "29",
2389 }
2390
2391 apex_key {
2392 name: "myapex.key",
2393 public_key: "testkey.avbpubkey",
2394 private_key: "testkey.pem",
2395 }
2396
2397 cc_library {
2398 name: "mylib",
2399 srcs: ["mylib.cpp"],
2400 shared_libs: ["mylib2"],
2401 system_shared_libs: [],
2402 stl: "none",
2403 apex_available: [
2404 "myapex",
2405 ],
2406 min_sdk_version: "29",
2407 }
2408
2409 // indirect part of the apex
2410 cc_library {
2411 name: "mylib2",
2412 srcs: ["mylib.cpp"],
2413 system_shared_libs: [],
2414 stl: "none",
2415 apex_available: [
2416 "myapex",
2417 ],
2418 min_sdk_version: "30",
2419 }
2420 `)
2421}
2422
2423func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2424 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2425 apex {
2426 name: "myapex",
2427 key: "myapex.key",
2428 apps: ["AppFoo"],
2429 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002430 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002431 }
2432
2433 apex_key {
2434 name: "myapex.key",
2435 public_key: "testkey.avbpubkey",
2436 private_key: "testkey.pem",
2437 }
2438
2439 android_app {
2440 name: "AppFoo",
2441 srcs: ["foo/bar/MyClass.java"],
2442 sdk_version: "current",
2443 min_sdk_version: "29",
2444 system_modules: "none",
2445 stl: "none",
2446 static_libs: ["bar"],
2447 apex_available: [ "myapex" ],
2448 }
2449
2450 java_library {
2451 name: "bar",
2452 sdk_version: "current",
2453 srcs: ["a.java"],
2454 apex_available: [ "myapex" ],
2455 }
2456 `)
2457}
2458
2459func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002460 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002461 apex {
2462 name: "myapex",
2463 key: "myapex.key",
2464 native_shared_libs: ["mylib"],
2465 min_sdk_version: "29",
2466 }
2467
2468 apex_key {
2469 name: "myapex.key",
2470 public_key: "testkey.avbpubkey",
2471 private_key: "testkey.pem",
2472 }
2473
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002474 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002475 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2476 cc_library {
2477 name: "mylib",
2478 srcs: ["mylib.cpp"],
2479 shared_libs: ["mylib2"],
2480 system_shared_libs: [],
2481 stl: "none",
2482 apex_available: ["myapex", "otherapex"],
2483 min_sdk_version: "29",
2484 }
2485
2486 cc_library {
2487 name: "mylib2",
2488 srcs: ["mylib.cpp"],
2489 system_shared_libs: [],
2490 stl: "none",
2491 apex_available: ["otherapex"],
2492 stubs: { versions: ["29", "30"] },
2493 min_sdk_version: "30",
2494 }
2495
2496 apex {
2497 name: "otherapex",
2498 key: "myapex.key",
2499 native_shared_libs: ["mylib", "mylib2"],
2500 min_sdk_version: "30",
2501 }
2502 `)
2503 expectLink := func(from, from_variant, to, to_variant string) {
2504 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2505 libFlags := ld.Args["libFlags"]
2506 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2507 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002508 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002509 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002510}
2511
Jooyung Haned124c32021-01-26 11:43:46 +09002512func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002513 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2514 func(variables android.FixtureProductVariables) {
2515 variables.Platform_sdk_codename = proptools.StringPtr("S")
2516 variables.Platform_version_active_codenames = []string{"S"}
2517 },
2518 )
Jooyung Haned124c32021-01-26 11:43:46 +09002519 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2520 apex {
2521 name: "myapex",
2522 key: "myapex.key",
2523 native_shared_libs: ["libfoo"],
2524 min_sdk_version: "S",
2525 }
2526 apex_key {
2527 name: "myapex.key",
2528 public_key: "testkey.avbpubkey",
2529 private_key: "testkey.pem",
2530 }
2531 cc_library {
2532 name: "libfoo",
2533 shared_libs: ["libbar"],
2534 apex_available: ["myapex"],
2535 min_sdk_version: "29",
2536 }
2537 cc_library {
2538 name: "libbar",
2539 apex_available: ["myapex"],
2540 }
2541 `, withSAsActiveCodeNames)
2542}
2543
2544func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002545 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2546 variables.Platform_sdk_codename = proptools.StringPtr("S")
2547 variables.Platform_version_active_codenames = []string{"S", "T"}
2548 })
Colin Cross1c460562021-02-16 17:55:47 -08002549 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002550 apex {
2551 name: "myapex",
2552 key: "myapex.key",
2553 native_shared_libs: ["libfoo"],
2554 min_sdk_version: "S",
2555 }
2556 apex_key {
2557 name: "myapex.key",
2558 public_key: "testkey.avbpubkey",
2559 private_key: "testkey.pem",
2560 }
2561 cc_library {
2562 name: "libfoo",
2563 shared_libs: ["libbar"],
2564 apex_available: ["myapex"],
2565 min_sdk_version: "S",
2566 }
2567 cc_library {
2568 name: "libbar",
2569 stubs: {
2570 symbol_file: "libbar.map.txt",
2571 versions: ["30", "S", "T"],
2572 },
2573 }
2574 `, withSAsActiveCodeNames)
2575
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002576 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002577 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2578 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002579 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002580}
2581
Jiyong Park7c2ee712018-12-07 00:42:25 +09002582func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002583 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002584 apex {
2585 name: "myapex",
2586 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002587 native_shared_libs: ["mylib"],
2588 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002589 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002590 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002591 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002592 }
2593
2594 apex_key {
2595 name: "myapex.key",
2596 public_key: "testkey.avbpubkey",
2597 private_key: "testkey.pem",
2598 }
2599
2600 prebuilt_etc {
2601 name: "myetc",
2602 src: "myprebuilt",
2603 sub_dir: "foo/bar",
2604 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002605
2606 cc_library {
2607 name: "mylib",
2608 srcs: ["mylib.cpp"],
2609 relative_install_path: "foo/bar",
2610 system_shared_libs: [],
2611 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002612 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002613 }
2614
2615 cc_binary {
2616 name: "mybin",
2617 srcs: ["mylib.cpp"],
2618 relative_install_path: "foo/bar",
2619 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002620 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002621 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002622 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002623 `)
2624
Sundong Ahnabb64432019-10-22 13:58:29 +09002625 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002626 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002627
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002628 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002629 ensureContains(t, cmd, "/etc ")
2630 ensureContains(t, cmd, "/etc/foo ")
2631 ensureContains(t, cmd, "/etc/foo/bar ")
2632 ensureContains(t, cmd, "/lib64 ")
2633 ensureContains(t, cmd, "/lib64/foo ")
2634 ensureContains(t, cmd, "/lib64/foo/bar ")
2635 ensureContains(t, cmd, "/lib ")
2636 ensureContains(t, cmd, "/lib/foo ")
2637 ensureContains(t, cmd, "/lib/foo/bar ")
2638 ensureContains(t, cmd, "/bin ")
2639 ensureContains(t, cmd, "/bin/foo ")
2640 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002641}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002642
Jooyung Han35155c42020-02-06 17:33:20 +09002643func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002644 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002645 apex {
2646 name: "myapex",
2647 key: "myapex.key",
2648 multilib: {
2649 both: {
2650 native_shared_libs: ["mylib"],
2651 binaries: ["mybin"],
2652 },
2653 },
2654 compile_multilib: "both",
2655 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002656 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002657 }
2658
2659 apex_key {
2660 name: "myapex.key",
2661 public_key: "testkey.avbpubkey",
2662 private_key: "testkey.pem",
2663 }
2664
2665 cc_library {
2666 name: "mylib",
2667 relative_install_path: "foo/bar",
2668 system_shared_libs: [],
2669 stl: "none",
2670 apex_available: [ "myapex" ],
2671 native_bridge_supported: true,
2672 }
2673
2674 cc_binary {
2675 name: "mybin",
2676 relative_install_path: "foo/bar",
2677 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002678 stl: "none",
2679 apex_available: [ "myapex" ],
2680 native_bridge_supported: true,
2681 compile_multilib: "both", // default is "first" for binary
2682 multilib: {
2683 lib64: {
2684 suffix: "64",
2685 },
2686 },
2687 }
2688 `, withNativeBridgeEnabled)
2689 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2690 "bin/foo/bar/mybin",
2691 "bin/foo/bar/mybin64",
2692 "bin/arm/foo/bar/mybin",
2693 "bin/arm64/foo/bar/mybin64",
2694 "lib/foo/bar/mylib.so",
2695 "lib/arm/foo/bar/mylib.so",
2696 "lib64/foo/bar/mylib.so",
2697 "lib64/arm64/foo/bar/mylib.so",
2698 })
2699}
2700
Jooyung Han85d61762020-06-24 23:50:26 +09002701func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002702 result := android.GroupFixturePreparers(
2703 prepareForApexTest,
2704 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2705 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002706 apex {
2707 name: "myapex",
2708 key: "myapex.key",
2709 binaries: ["mybin"],
2710 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002711 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002712 }
2713 apex_key {
2714 name: "myapex.key",
2715 public_key: "testkey.avbpubkey",
2716 private_key: "testkey.pem",
2717 }
2718 cc_binary {
2719 name: "mybin",
2720 vendor: true,
2721 shared_libs: ["libfoo"],
2722 }
2723 cc_library {
2724 name: "libfoo",
2725 proprietary: true,
2726 }
2727 `)
2728
Colin Crossc68db4b2021-11-11 18:59:15 -08002729 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002730 "bin/mybin",
2731 "lib64/libfoo.so",
2732 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2733 "lib64/libc++.so",
2734 })
2735
Colin Crossc68db4b2021-11-11 18:59:15 -08002736 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2737 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002738 name := apexBundle.BaseModuleName()
2739 prefix := "TARGET_"
2740 var builder strings.Builder
2741 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002742 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002743 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002744 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002745
Colin Crossc68db4b2021-11-11 18:59:15 -08002746 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002747 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2748 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002749}
2750
Jooyung Hanc5a96762022-02-04 11:54:50 +09002751func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2752 testApexError(t, `Trying to include a VNDK library`, `
2753 apex {
2754 name: "myapex",
2755 key: "myapex.key",
2756 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2757 vendor: true,
2758 use_vndk_as_stable: true,
2759 updatable: false,
2760 }
2761 apex_key {
2762 name: "myapex.key",
2763 public_key: "testkey.avbpubkey",
2764 private_key: "testkey.pem",
2765 }`)
2766}
2767
Jooyung Handf78e212020-07-22 15:54:47 +09002768func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002769 // myapex myapex2
2770 // | |
2771 // mybin ------. mybin2
2772 // \ \ / |
2773 // (stable) .---\--------` |
2774 // \ / \ |
2775 // \ / \ /
2776 // libvndk libvendor
2777 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002778 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002779 apex {
2780 name: "myapex",
2781 key: "myapex.key",
2782 binaries: ["mybin"],
2783 vendor: true,
2784 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002785 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002786 }
2787 apex_key {
2788 name: "myapex.key",
2789 public_key: "testkey.avbpubkey",
2790 private_key: "testkey.pem",
2791 }
2792 cc_binary {
2793 name: "mybin",
2794 vendor: true,
2795 shared_libs: ["libvndk", "libvendor"],
2796 }
2797 cc_library {
2798 name: "libvndk",
2799 vndk: {
2800 enabled: true,
2801 },
2802 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002803 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002804 }
2805 cc_library {
2806 name: "libvendor",
2807 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002808 stl: "none",
2809 }
2810 apex {
2811 name: "myapex2",
2812 key: "myapex.key",
2813 binaries: ["mybin2"],
2814 vendor: true,
2815 use_vndk_as_stable: false,
2816 updatable: false,
2817 }
2818 cc_binary {
2819 name: "mybin2",
2820 vendor: true,
2821 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002822 }
2823 `)
2824
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002825 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002826
Jooyung Han91f92032022-02-04 12:36:33 +09002827 for _, tc := range []struct {
2828 name string
2829 apexName string
2830 moduleName string
2831 moduleVariant string
2832 libs []string
2833 contents []string
2834 requireVndkNamespace bool
2835 }{
2836 {
2837 name: "use_vndk_as_stable",
2838 apexName: "myapex",
2839 moduleName: "mybin",
2840 moduleVariant: vendorVariant + "_apex10000",
2841 libs: []string{
2842 // should link with vendor variants of VNDK libs(libvndk/libc++)
2843 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2844 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2845 // unstable Vendor libs as APEX variant
2846 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2847 },
2848 contents: []string{
2849 "bin/mybin",
2850 "lib64/libvendor.so",
2851 // VNDK libs (libvndk/libc++) are not included
2852 },
2853 requireVndkNamespace: true,
2854 },
2855 {
2856 name: "!use_vndk_as_stable",
2857 apexName: "myapex2",
2858 moduleName: "mybin2",
2859 moduleVariant: vendorVariant + "_myapex2",
2860 libs: []string{
2861 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2862 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2863 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2864 // unstable vendor libs have "merged" APEX variants
2865 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2866 },
2867 contents: []string{
2868 "bin/mybin2",
2869 "lib64/libvendor.so",
2870 // VNDK libs are included as well
2871 "lib64/libvndk.so",
2872 "lib64/libc++.so",
2873 },
2874 requireVndkNamespace: false,
2875 },
2876 } {
2877 t.Run(tc.name, func(t *testing.T) {
2878 // Check linked libs
2879 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2880 libs := names(ldRule.Args["libFlags"])
2881 for _, lib := range tc.libs {
2882 ensureListContains(t, libs, lib)
2883 }
2884 // Check apex contents
2885 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002886
Jooyung Han91f92032022-02-04 12:36:33 +09002887 // Check "requireNativeLibs"
2888 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2889 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2890 if tc.requireVndkNamespace {
2891 ensureListContains(t, requireNativeLibs, ":vndk")
2892 } else {
2893 ensureListNotContains(t, requireNativeLibs, ":vndk")
2894 }
2895 })
2896 }
Jooyung Handf78e212020-07-22 15:54:47 +09002897}
2898
Justin Yun13decfb2021-03-08 19:25:55 +09002899func TestProductVariant(t *testing.T) {
2900 ctx := testApex(t, `
2901 apex {
2902 name: "myapex",
2903 key: "myapex.key",
2904 updatable: false,
2905 product_specific: true,
2906 binaries: ["foo"],
2907 }
2908
2909 apex_key {
2910 name: "myapex.key",
2911 public_key: "testkey.avbpubkey",
2912 private_key: "testkey.pem",
2913 }
2914
2915 cc_binary {
2916 name: "foo",
2917 product_available: true,
2918 apex_available: ["myapex"],
2919 srcs: ["foo.cpp"],
2920 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002921 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2922 variables.ProductVndkVersion = proptools.StringPtr("current")
2923 }),
2924 )
Justin Yun13decfb2021-03-08 19:25:55 +09002925
2926 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002927 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002928 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2929 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2930 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2931 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2932}
2933
Jooyung Han8e5685d2020-09-21 11:02:57 +09002934func TestApex_withPrebuiltFirmware(t *testing.T) {
2935 testCases := []struct {
2936 name string
2937 additionalProp string
2938 }{
2939 {"system apex with prebuilt_firmware", ""},
2940 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2941 }
2942 for _, tc := range testCases {
2943 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002944 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002945 apex {
2946 name: "myapex",
2947 key: "myapex.key",
2948 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002949 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002950 `+tc.additionalProp+`
2951 }
2952 apex_key {
2953 name: "myapex.key",
2954 public_key: "testkey.avbpubkey",
2955 private_key: "testkey.pem",
2956 }
2957 prebuilt_firmware {
2958 name: "myfirmware",
2959 src: "myfirmware.bin",
2960 filename_from_src: true,
2961 `+tc.additionalProp+`
2962 }
2963 `)
2964 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2965 "etc/firmware/myfirmware.bin",
2966 })
2967 })
2968 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002969}
2970
Jooyung Hanefb184e2020-06-25 17:14:25 +09002971func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002972 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002973 apex {
2974 name: "myapex",
2975 key: "myapex.key",
2976 vendor: true,
2977 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002978 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002979 }
2980
2981 apex_key {
2982 name: "myapex.key",
2983 public_key: "testkey.avbpubkey",
2984 private_key: "testkey.pem",
2985 }
2986
2987 cc_library {
2988 name: "mylib",
2989 vendor_available: true,
2990 }
2991 `)
2992
2993 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002994 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002995 name := apexBundle.BaseModuleName()
2996 prefix := "TARGET_"
2997 var builder strings.Builder
2998 data.Custom(&builder, name, prefix, "", data)
2999 androidMk := builder.String()
3000 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
3001}
3002
Jooyung Han2ed99d02020-06-24 23:26:26 +09003003func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003004 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003005 apex {
3006 name: "myapex",
3007 key: "myapex.key",
3008 vintf_fragments: ["fragment.xml"],
3009 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003010 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003011 }
3012 apex_key {
3013 name: "myapex.key",
3014 public_key: "testkey.avbpubkey",
3015 private_key: "testkey.pem",
3016 }
3017 cc_binary {
3018 name: "mybin",
3019 }
3020 `)
3021
3022 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003023 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003024 name := apexBundle.BaseModuleName()
3025 prefix := "TARGET_"
3026 var builder strings.Builder
3027 data.Custom(&builder, name, prefix, "", data)
3028 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003029 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003030 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003031}
3032
Jiyong Park16e91a02018-12-20 18:18:08 +09003033func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003034 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003035 apex {
3036 name: "myapex",
3037 key: "myapex.key",
3038 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003039 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003040 }
3041
3042 apex_key {
3043 name: "myapex.key",
3044 public_key: "testkey.avbpubkey",
3045 private_key: "testkey.pem",
3046 }
3047
3048 cc_library {
3049 name: "mylib",
3050 srcs: ["mylib.cpp"],
3051 system_shared_libs: [],
3052 stl: "none",
3053 stubs: {
3054 versions: ["1", "2", "3"],
3055 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003056 apex_available: [
3057 "//apex_available:platform",
3058 "myapex",
3059 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003060 }
3061
3062 cc_binary {
3063 name: "not_in_apex",
3064 srcs: ["mylib.cpp"],
3065 static_libs: ["mylib"],
3066 static_executable: true,
3067 system_shared_libs: [],
3068 stl: "none",
3069 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003070 `)
3071
Colin Cross7113d202019-11-20 16:39:12 -08003072 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003073
3074 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003075 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003076}
Jiyong Park9335a262018-12-24 11:31:58 +09003077
3078func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003079 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003080 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003081 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003082 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003083 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003084 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003085 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003086 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003087 }
3088
3089 cc_library {
3090 name: "mylib",
3091 srcs: ["mylib.cpp"],
3092 system_shared_libs: [],
3093 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003094 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003095 }
3096
3097 apex_key {
3098 name: "myapex.key",
3099 public_key: "testkey.avbpubkey",
3100 private_key: "testkey.pem",
3101 }
3102
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003103 android_app_certificate {
3104 name: "myapex.certificate",
3105 certificate: "testkey",
3106 }
3107
3108 android_app_certificate {
3109 name: "myapex.certificate.override",
3110 certificate: "testkey.override",
3111 }
3112
Jiyong Park9335a262018-12-24 11:31:58 +09003113 `)
3114
3115 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003116 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003117
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003118 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3119 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003120 "vendor/foo/devkeys/testkey.avbpubkey")
3121 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003122 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3123 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003124 "vendor/foo/devkeys/testkey.pem")
3125 }
3126
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003127 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003128 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003129 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003130 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003131 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003132 }
3133}
Jiyong Park58e364a2019-01-19 19:24:06 +09003134
Jooyung Hanf121a652019-12-17 14:30:11 +09003135func TestCertificate(t *testing.T) {
3136 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003137 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003138 apex {
3139 name: "myapex",
3140 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003141 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003142 }
3143 apex_key {
3144 name: "myapex.key",
3145 public_key: "testkey.avbpubkey",
3146 private_key: "testkey.pem",
3147 }`)
3148 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3149 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3150 if actual := rule.Args["certificates"]; actual != expected {
3151 t.Errorf("certificates should be %q, not %q", expected, actual)
3152 }
3153 })
3154 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003155 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003156 apex {
3157 name: "myapex_keytest",
3158 key: "myapex.key",
3159 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003160 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003161 }
3162 apex_key {
3163 name: "myapex.key",
3164 public_key: "testkey.avbpubkey",
3165 private_key: "testkey.pem",
3166 }
3167 android_app_certificate {
3168 name: "myapex.certificate.override",
3169 certificate: "testkey.override",
3170 }`)
3171 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3172 expected := "testkey.override.x509.pem testkey.override.pk8"
3173 if actual := rule.Args["certificates"]; actual != expected {
3174 t.Errorf("certificates should be %q, not %q", expected, actual)
3175 }
3176 })
3177 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003178 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003179 apex {
3180 name: "myapex",
3181 key: "myapex.key",
3182 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003183 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003184 }
3185 apex_key {
3186 name: "myapex.key",
3187 public_key: "testkey.avbpubkey",
3188 private_key: "testkey.pem",
3189 }
3190 android_app_certificate {
3191 name: "myapex.certificate",
3192 certificate: "testkey",
3193 }`)
3194 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3195 expected := "testkey.x509.pem testkey.pk8"
3196 if actual := rule.Args["certificates"]; actual != expected {
3197 t.Errorf("certificates should be %q, not %q", expected, actual)
3198 }
3199 })
3200 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003201 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003202 apex {
3203 name: "myapex_keytest",
3204 key: "myapex.key",
3205 file_contexts: ":myapex-file_contexts",
3206 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003207 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003208 }
3209 apex_key {
3210 name: "myapex.key",
3211 public_key: "testkey.avbpubkey",
3212 private_key: "testkey.pem",
3213 }
3214 android_app_certificate {
3215 name: "myapex.certificate.override",
3216 certificate: "testkey.override",
3217 }`)
3218 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3219 expected := "testkey.override.x509.pem testkey.override.pk8"
3220 if actual := rule.Args["certificates"]; actual != expected {
3221 t.Errorf("certificates should be %q, not %q", expected, actual)
3222 }
3223 })
3224 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003225 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003226 apex {
3227 name: "myapex",
3228 key: "myapex.key",
3229 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003230 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003231 }
3232 apex_key {
3233 name: "myapex.key",
3234 public_key: "testkey.avbpubkey",
3235 private_key: "testkey.pem",
3236 }`)
3237 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3238 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3239 if actual := rule.Args["certificates"]; actual != expected {
3240 t.Errorf("certificates should be %q, not %q", expected, actual)
3241 }
3242 })
3243 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003244 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003245 apex {
3246 name: "myapex_keytest",
3247 key: "myapex.key",
3248 file_contexts: ":myapex-file_contexts",
3249 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003250 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003251 }
3252 apex_key {
3253 name: "myapex.key",
3254 public_key: "testkey.avbpubkey",
3255 private_key: "testkey.pem",
3256 }
3257 android_app_certificate {
3258 name: "myapex.certificate.override",
3259 certificate: "testkey.override",
3260 }`)
3261 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3262 expected := "testkey.override.x509.pem testkey.override.pk8"
3263 if actual := rule.Args["certificates"]; actual != expected {
3264 t.Errorf("certificates should be %q, not %q", expected, actual)
3265 }
3266 })
3267}
3268
Jiyong Park58e364a2019-01-19 19:24:06 +09003269func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003270 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003271 apex {
3272 name: "myapex",
3273 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003274 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003275 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003276 }
3277
3278 apex {
3279 name: "otherapex",
3280 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003281 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003282 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003283 }
3284
3285 apex_key {
3286 name: "myapex.key",
3287 public_key: "testkey.avbpubkey",
3288 private_key: "testkey.pem",
3289 }
3290
3291 cc_library {
3292 name: "mylib",
3293 srcs: ["mylib.cpp"],
3294 system_shared_libs: [],
3295 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003296 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003297 "myapex",
3298 "otherapex",
3299 ],
Jooyung Han24282772020-03-21 23:20:55 +09003300 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003301 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003302 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003303 cc_library {
3304 name: "mylib2",
3305 srcs: ["mylib.cpp"],
3306 system_shared_libs: [],
3307 stl: "none",
3308 apex_available: [
3309 "myapex",
3310 "otherapex",
3311 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003312 static_libs: ["mylib3"],
3313 recovery_available: true,
3314 min_sdk_version: "29",
3315 }
3316 cc_library {
3317 name: "mylib3",
3318 srcs: ["mylib.cpp"],
3319 system_shared_libs: [],
3320 stl: "none",
3321 apex_available: [
3322 "myapex",
3323 "otherapex",
3324 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003325 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003326 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003327 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003328 `)
3329
Jooyung Hanc87a0592020-03-02 17:44:33 +09003330 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003331 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003332 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003333 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003334
Jooyung Hanccce2f22020-03-07 03:45:53 +09003335 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003336 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003337 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003338 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003339
Jooyung Hanccce2f22020-03-07 03:45:53 +09003340 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003341 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003342 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003343 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003344
Colin Crossaede88c2020-08-11 12:17:01 -07003345 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3346 // each variant defines additional macros to distinguish which apex variant it is built for
3347
3348 // non-APEX variant does not have __ANDROID_APEX__ defined
3349 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3350 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3351
Dan Albertb19953d2020-11-17 15:29:36 -08003352 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003353 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3354 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003355 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003356
Jooyung Hanc87a0592020-03-02 17:44:33 +09003357 // non-APEX variant does not have __ANDROID_APEX__ defined
3358 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3359 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3360
Dan Albertb19953d2020-11-17 15:29:36 -08003361 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003362 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003363 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003364 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003365}
Jiyong Park7e636d02019-01-28 16:16:54 +09003366
3367func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003368 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003369 apex {
3370 name: "myapex",
3371 key: "myapex.key",
3372 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003373 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003374 }
3375
3376 apex_key {
3377 name: "myapex.key",
3378 public_key: "testkey.avbpubkey",
3379 private_key: "testkey.pem",
3380 }
3381
3382 cc_library_headers {
3383 name: "mylib_headers",
3384 export_include_dirs: ["my_include"],
3385 system_shared_libs: [],
3386 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003387 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003388 }
3389
3390 cc_library {
3391 name: "mylib",
3392 srcs: ["mylib.cpp"],
3393 system_shared_libs: [],
3394 stl: "none",
3395 header_libs: ["mylib_headers"],
3396 export_header_lib_headers: ["mylib_headers"],
3397 stubs: {
3398 versions: ["1", "2", "3"],
3399 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003400 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003401 }
3402
3403 cc_library {
3404 name: "otherlib",
3405 srcs: ["mylib.cpp"],
3406 system_shared_libs: [],
3407 stl: "none",
3408 shared_libs: ["mylib"],
3409 }
3410 `)
3411
Colin Cross7113d202019-11-20 16:39:12 -08003412 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003413
3414 // Ensure that the include path of the header lib is exported to 'otherlib'
3415 ensureContains(t, cFlags, "-Imy_include")
3416}
Alex Light9670d332019-01-29 18:07:33 -08003417
Jiyong Park7cd10e32020-01-14 09:22:18 +09003418type fileInApex struct {
3419 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003420 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003421 isLink bool
3422}
3423
Jooyung Hana57af4a2020-01-23 05:36:59 +00003424func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003425 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003426 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003427 copyCmds := apexRule.Args["copy_commands"]
3428 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003429 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003430 for _, cmd := range strings.Split(copyCmds, "&&") {
3431 cmd = strings.TrimSpace(cmd)
3432 if cmd == "" {
3433 continue
3434 }
3435 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003436 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003437 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003438 switch terms[0] {
3439 case "mkdir":
3440 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003441 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003442 t.Fatal("copyCmds contains invalid cp command", cmd)
3443 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003444 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003445 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003446 isLink = false
3447 case "ln":
3448 if len(terms) != 3 && len(terms) != 4 {
3449 // ln LINK TARGET or ln -s LINK TARGET
3450 t.Fatal("copyCmds contains invalid ln command", cmd)
3451 }
3452 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003453 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003454 isLink = true
3455 default:
3456 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3457 }
3458 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003459 index := strings.Index(dst, imageApexDir)
3460 if index == -1 {
3461 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3462 }
3463 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003464 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003465 }
3466 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003467 return ret
3468}
3469
Jooyung Hana57af4a2020-01-23 05:36:59 +00003470func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3471 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003472 var failed bool
3473 var surplus []string
3474 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003475 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003476 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003477 for _, expected := range files {
3478 if matched, _ := path.Match(expected, file.path); matched {
3479 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003480 mactchFound = true
3481 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003482 }
3483 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003484 if !mactchFound {
3485 surplus = append(surplus, file.path)
3486 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003487 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003488
Jooyung Han31c470b2019-10-18 16:26:59 +09003489 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003490 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003491 t.Log("surplus files", surplus)
3492 failed = true
3493 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003494
3495 if len(files) > len(filesMatched) {
3496 var missing []string
3497 for _, expected := range files {
3498 if !filesMatched[expected] {
3499 missing = append(missing, expected)
3500 }
3501 }
3502 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003503 t.Log("missing files", missing)
3504 failed = true
3505 }
3506 if failed {
3507 t.Fail()
3508 }
3509}
3510
Jooyung Han344d5432019-08-23 11:17:39 +09003511func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003512 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003513 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003514 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003515 "etc/llndk.libraries.29.txt",
3516 "etc/vndkcore.libraries.29.txt",
3517 "etc/vndksp.libraries.29.txt",
3518 "etc/vndkprivate.libraries.29.txt",
3519 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003520 }
3521 testCases := []struct {
3522 vndkVersion string
3523 expectedFiles []string
3524 }{
3525 {
3526 vndkVersion: "current",
3527 expectedFiles: append(commonFiles,
3528 "lib/libvndk.so",
3529 "lib/libvndksp.so",
3530 "lib64/libvndk.so",
3531 "lib64/libvndksp.so"),
3532 },
3533 {
3534 vndkVersion: "",
3535 expectedFiles: append(commonFiles,
3536 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3537 "lib/libvndksp.so",
3538 "lib64/libvndksp.so"),
3539 },
3540 }
3541 for _, tc := range testCases {
3542 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3543 ctx := testApex(t, `
3544 apex_vndk {
3545 name: "com.android.vndk.current",
3546 key: "com.android.vndk.current.key",
3547 updatable: false,
3548 }
3549
3550 apex_key {
3551 name: "com.android.vndk.current.key",
3552 public_key: "testkey.avbpubkey",
3553 private_key: "testkey.pem",
3554 }
3555
3556 cc_library {
3557 name: "libvndk",
3558 srcs: ["mylib.cpp"],
3559 vendor_available: true,
3560 product_available: true,
3561 vndk: {
3562 enabled: true,
3563 },
3564 system_shared_libs: [],
3565 stl: "none",
3566 apex_available: [ "com.android.vndk.current" ],
3567 }
3568
3569 cc_library {
3570 name: "libvndksp",
3571 srcs: ["mylib.cpp"],
3572 vendor_available: true,
3573 product_available: true,
3574 vndk: {
3575 enabled: true,
3576 support_system_process: true,
3577 },
3578 system_shared_libs: [],
3579 stl: "none",
3580 apex_available: [ "com.android.vndk.current" ],
3581 }
3582
3583 // VNDK-Ext should not cause any problems
3584
3585 cc_library {
3586 name: "libvndk.ext",
3587 srcs: ["mylib2.cpp"],
3588 vendor: true,
3589 vndk: {
3590 enabled: true,
3591 extends: "libvndk",
3592 },
3593 system_shared_libs: [],
3594 stl: "none",
3595 }
3596
3597 cc_library {
3598 name: "libvndksp.ext",
3599 srcs: ["mylib2.cpp"],
3600 vendor: true,
3601 vndk: {
3602 enabled: true,
3603 support_system_process: true,
3604 extends: "libvndksp",
3605 },
3606 system_shared_libs: [],
3607 stl: "none",
3608 }
3609 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3610 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3611 }))
3612 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3613 })
3614 }
Jooyung Han344d5432019-08-23 11:17:39 +09003615}
3616
3617func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003618 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003619 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003620 name: "com.android.vndk.current",
3621 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003622 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003623 }
3624
3625 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003626 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003627 public_key: "testkey.avbpubkey",
3628 private_key: "testkey.pem",
3629 }
3630
3631 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003632 name: "libvndk",
3633 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003634 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003635 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003636 vndk: {
3637 enabled: true,
3638 },
3639 system_shared_libs: [],
3640 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003641 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003642 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003643
3644 cc_prebuilt_library_shared {
3645 name: "libvndk.arm",
3646 srcs: ["libvndk.arm.so"],
3647 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003648 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003649 vndk: {
3650 enabled: true,
3651 },
3652 enabled: false,
3653 arch: {
3654 arm: {
3655 enabled: true,
3656 },
3657 },
3658 system_shared_libs: [],
3659 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003660 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003661 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003662 `+vndkLibrariesTxtFiles("current"),
3663 withFiles(map[string][]byte{
3664 "libvndk.so": nil,
3665 "libvndk.arm.so": nil,
3666 }))
Colin Cross2807f002021-03-02 10:15:29 -08003667 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003668 "lib/libvndk.so",
3669 "lib/libvndk.arm.so",
3670 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003671 "lib/libc++.so",
3672 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003673 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003674 })
Jooyung Han344d5432019-08-23 11:17:39 +09003675}
3676
Jooyung Han39edb6c2019-11-06 16:53:07 +09003677func vndkLibrariesTxtFiles(vers ...string) (result string) {
3678 for _, v := range vers {
3679 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003680 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003681 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003682 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003683 name: "` + txt + `.libraries.txt",
3684 }
3685 `
3686 }
3687 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003688 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003689 result += `
3690 prebuilt_etc {
3691 name: "` + txt + `.libraries.` + v + `.txt",
3692 src: "dummy.txt",
3693 }
3694 `
3695 }
3696 }
3697 }
3698 return
3699}
3700
Jooyung Han344d5432019-08-23 11:17:39 +09003701func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003702 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003703 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003704 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003705 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003706 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003707 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003708 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003709 }
3710
3711 apex_key {
3712 name: "myapex.key",
3713 public_key: "testkey.avbpubkey",
3714 private_key: "testkey.pem",
3715 }
3716
Jooyung Han31c470b2019-10-18 16:26:59 +09003717 vndk_prebuilt_shared {
3718 name: "libvndk27",
3719 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003720 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003721 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003722 vndk: {
3723 enabled: true,
3724 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003725 target_arch: "arm64",
3726 arch: {
3727 arm: {
3728 srcs: ["libvndk27_arm.so"],
3729 },
3730 arm64: {
3731 srcs: ["libvndk27_arm64.so"],
3732 },
3733 },
Colin Cross2807f002021-03-02 10:15:29 -08003734 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003735 }
3736
3737 vndk_prebuilt_shared {
3738 name: "libvndk27",
3739 version: "27",
3740 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003741 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003742 vndk: {
3743 enabled: true,
3744 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003745 target_arch: "x86_64",
3746 arch: {
3747 x86: {
3748 srcs: ["libvndk27_x86.so"],
3749 },
3750 x86_64: {
3751 srcs: ["libvndk27_x86_64.so"],
3752 },
3753 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003754 }
3755 `+vndkLibrariesTxtFiles("27"),
3756 withFiles(map[string][]byte{
3757 "libvndk27_arm.so": nil,
3758 "libvndk27_arm64.so": nil,
3759 "libvndk27_x86.so": nil,
3760 "libvndk27_x86_64.so": nil,
3761 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003762
Colin Cross2807f002021-03-02 10:15:29 -08003763 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003764 "lib/libvndk27_arm.so",
3765 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003766 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003767 })
Jooyung Han344d5432019-08-23 11:17:39 +09003768}
3769
Jooyung Han90eee022019-10-01 20:02:42 +09003770func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003771 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003772 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003773 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003774 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003775 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003776 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003777 }
3778 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003779 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003780 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003781 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003782 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003783 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003784 }
3785 apex_key {
3786 name: "myapex.key",
3787 public_key: "testkey.avbpubkey",
3788 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003789 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003790
3791 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003792 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003793 actual := proptools.String(bundle.properties.Apex_name)
3794 if !reflect.DeepEqual(actual, expected) {
3795 t.Errorf("Got '%v', expected '%v'", actual, expected)
3796 }
3797 }
3798
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003799 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003800 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003801}
3802
Jooyung Han344d5432019-08-23 11:17:39 +09003803func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003804 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003805 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003806 name: "com.android.vndk.current",
3807 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003808 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003809 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003810 }
3811
3812 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003813 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003814 public_key: "testkey.avbpubkey",
3815 private_key: "testkey.pem",
3816 }
3817
3818 cc_library {
3819 name: "libvndk",
3820 srcs: ["mylib.cpp"],
3821 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003822 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003823 native_bridge_supported: true,
3824 host_supported: true,
3825 vndk: {
3826 enabled: true,
3827 },
3828 system_shared_libs: [],
3829 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003830 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003831 }
Colin Cross2807f002021-03-02 10:15:29 -08003832 `+vndkLibrariesTxtFiles("current"),
3833 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003834
Colin Cross2807f002021-03-02 10:15:29 -08003835 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003836 "lib/libvndk.so",
3837 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003838 "lib/libc++.so",
3839 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003840 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003841 })
Jooyung Han344d5432019-08-23 11:17:39 +09003842}
3843
3844func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003845 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003846 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003847 name: "com.android.vndk.current",
3848 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003849 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003850 native_bridge_supported: true,
3851 }
3852
3853 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003854 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003855 public_key: "testkey.avbpubkey",
3856 private_key: "testkey.pem",
3857 }
3858
3859 cc_library {
3860 name: "libvndk",
3861 srcs: ["mylib.cpp"],
3862 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003863 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003864 native_bridge_supported: true,
3865 host_supported: true,
3866 vndk: {
3867 enabled: true,
3868 },
3869 system_shared_libs: [],
3870 stl: "none",
3871 }
3872 `)
3873}
3874
Jooyung Han31c470b2019-10-18 16:26:59 +09003875func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003876 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003877 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003878 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003879 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003880 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003881 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003882 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003883 }
3884
3885 apex_key {
3886 name: "myapex.key",
3887 public_key: "testkey.avbpubkey",
3888 private_key: "testkey.pem",
3889 }
3890
3891 vndk_prebuilt_shared {
3892 name: "libvndk27",
3893 version: "27",
3894 target_arch: "arm",
3895 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003896 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003897 vndk: {
3898 enabled: true,
3899 },
3900 arch: {
3901 arm: {
3902 srcs: ["libvndk27.so"],
3903 }
3904 },
3905 }
3906
3907 vndk_prebuilt_shared {
3908 name: "libvndk27",
3909 version: "27",
3910 target_arch: "arm",
3911 binder32bit: true,
3912 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003913 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003914 vndk: {
3915 enabled: true,
3916 },
3917 arch: {
3918 arm: {
3919 srcs: ["libvndk27binder32.so"],
3920 }
3921 },
Colin Cross2807f002021-03-02 10:15:29 -08003922 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003923 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003924 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003925 withFiles(map[string][]byte{
3926 "libvndk27.so": nil,
3927 "libvndk27binder32.so": nil,
3928 }),
3929 withBinder32bit,
3930 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003931 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003932 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3933 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003934 },
3935 }),
3936 )
3937
Colin Cross2807f002021-03-02 10:15:29 -08003938 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003939 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003940 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003941 })
3942}
3943
Jooyung Han45a96772020-06-15 14:59:42 +09003944func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003945 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003946 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003947 name: "com.android.vndk.current",
3948 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003949 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003950 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003951 }
3952
3953 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003954 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003955 public_key: "testkey.avbpubkey",
3956 private_key: "testkey.pem",
3957 }
3958
3959 cc_library {
3960 name: "libz",
3961 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003962 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003963 vndk: {
3964 enabled: true,
3965 },
3966 stubs: {
3967 symbol_file: "libz.map.txt",
3968 versions: ["30"],
3969 }
3970 }
3971 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3972 "libz.map.txt": nil,
3973 }))
3974
Colin Cross2807f002021-03-02 10:15:29 -08003975 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003976 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3977 ensureListEmpty(t, provideNativeLibs)
3978}
3979
Jooyung Hane1633032019-08-01 17:41:43 +09003980func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003981 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003982 apex {
3983 name: "myapex_nodep",
3984 key: "myapex.key",
3985 native_shared_libs: ["lib_nodep"],
3986 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003987 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003988 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003989 }
3990
3991 apex {
3992 name: "myapex_dep",
3993 key: "myapex.key",
3994 native_shared_libs: ["lib_dep"],
3995 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003996 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003997 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003998 }
3999
4000 apex {
4001 name: "myapex_provider",
4002 key: "myapex.key",
4003 native_shared_libs: ["libfoo"],
4004 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004005 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004006 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004007 }
4008
4009 apex {
4010 name: "myapex_selfcontained",
4011 key: "myapex.key",
4012 native_shared_libs: ["lib_dep", "libfoo"],
4013 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004014 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004015 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004016 }
4017
4018 apex_key {
4019 name: "myapex.key",
4020 public_key: "testkey.avbpubkey",
4021 private_key: "testkey.pem",
4022 }
4023
4024 cc_library {
4025 name: "lib_nodep",
4026 srcs: ["mylib.cpp"],
4027 system_shared_libs: [],
4028 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004029 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004030 }
4031
4032 cc_library {
4033 name: "lib_dep",
4034 srcs: ["mylib.cpp"],
4035 shared_libs: ["libfoo"],
4036 system_shared_libs: [],
4037 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004038 apex_available: [
4039 "myapex_dep",
4040 "myapex_provider",
4041 "myapex_selfcontained",
4042 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004043 }
4044
4045 cc_library {
4046 name: "libfoo",
4047 srcs: ["mytest.cpp"],
4048 stubs: {
4049 versions: ["1"],
4050 },
4051 system_shared_libs: [],
4052 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004053 apex_available: [
4054 "myapex_provider",
4055 "myapex_selfcontained",
4056 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004057 }
4058 `)
4059
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004060 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004061 var provideNativeLibs, requireNativeLibs []string
4062
Sundong Ahnabb64432019-10-22 13:58:29 +09004063 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004064 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4065 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004066 ensureListEmpty(t, provideNativeLibs)
4067 ensureListEmpty(t, requireNativeLibs)
4068
Sundong Ahnabb64432019-10-22 13:58:29 +09004069 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004070 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4071 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004072 ensureListEmpty(t, provideNativeLibs)
4073 ensureListContains(t, requireNativeLibs, "libfoo.so")
4074
Sundong Ahnabb64432019-10-22 13:58:29 +09004075 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004076 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4077 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004078 ensureListContains(t, provideNativeLibs, "libfoo.so")
4079 ensureListEmpty(t, requireNativeLibs)
4080
Sundong Ahnabb64432019-10-22 13:58:29 +09004081 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004082 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4083 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004084 ensureListContains(t, provideNativeLibs, "libfoo.so")
4085 ensureListEmpty(t, requireNativeLibs)
4086}
4087
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004088func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004089 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004090 apex {
4091 name: "myapex",
4092 key: "myapex.key",
4093 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004094 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004095 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004096 }
4097
4098 apex_key {
4099 name: "myapex.key",
4100 public_key: "testkey.avbpubkey",
4101 private_key: "testkey.pem",
4102 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004103
4104 cc_library {
4105 name: "mylib",
4106 srcs: ["mylib.cpp"],
4107 system_shared_libs: [],
4108 stl: "none",
4109 apex_available: [
4110 "//apex_available:platform",
4111 "myapex",
4112 ],
4113 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004114 `)
4115
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004116 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004117 apexManifestRule := module.Rule("apexManifestRule")
4118 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4119 apexRule := module.Rule("apexRule")
4120 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004121
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004122 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004123 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004124 name := apexBundle.BaseModuleName()
4125 prefix := "TARGET_"
4126 var builder strings.Builder
4127 data.Custom(&builder, name, prefix, "", data)
4128 androidMk := builder.String()
4129 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4130 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004131}
4132
Vinh Tran8f5310f2022-10-07 18:16:47 -04004133func TestCompileMultilibProp(t *testing.T) {
4134 testCases := []struct {
4135 compileMultiLibProp string
4136 containedLibs []string
4137 notContainedLibs []string
4138 }{
4139 {
4140 containedLibs: []string{
4141 "image.apex/lib64/mylib.so",
4142 "image.apex/lib/mylib.so",
4143 },
4144 compileMultiLibProp: `compile_multilib: "both",`,
4145 },
4146 {
4147 containedLibs: []string{"image.apex/lib64/mylib.so"},
4148 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4149 compileMultiLibProp: `compile_multilib: "first",`,
4150 },
4151 {
4152 containedLibs: []string{"image.apex/lib64/mylib.so"},
4153 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4154 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4155 },
4156 {
4157 containedLibs: []string{"image.apex/lib64/mylib.so"},
4158 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4159 compileMultiLibProp: `compile_multilib: "64",`,
4160 },
4161 {
4162 containedLibs: []string{"image.apex/lib/mylib.so"},
4163 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4164 compileMultiLibProp: `compile_multilib: "32",`,
4165 },
4166 }
4167 for _, testCase := range testCases {
4168 ctx := testApex(t, fmt.Sprintf(`
4169 apex {
4170 name: "myapex",
4171 key: "myapex.key",
4172 %s
4173 native_shared_libs: ["mylib"],
4174 updatable: false,
4175 }
4176 apex_key {
4177 name: "myapex.key",
4178 public_key: "testkey.avbpubkey",
4179 private_key: "testkey.pem",
4180 }
4181 cc_library {
4182 name: "mylib",
4183 srcs: ["mylib.cpp"],
4184 apex_available: [
4185 "//apex_available:platform",
4186 "myapex",
4187 ],
4188 }
4189 `, testCase.compileMultiLibProp),
4190 )
4191 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4192 apexRule := module.Rule("apexRule")
4193 copyCmds := apexRule.Args["copy_commands"]
4194 for _, containedLib := range testCase.containedLibs {
4195 ensureContains(t, copyCmds, containedLib)
4196 }
4197 for _, notContainedLib := range testCase.notContainedLibs {
4198 ensureNotContains(t, copyCmds, notContainedLib)
4199 }
4200 }
4201}
4202
Alex Light0851b882019-02-07 13:20:53 -08004203func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004204 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004205 apex {
4206 name: "myapex",
4207 key: "myapex.key",
4208 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004209 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004210 }
4211
4212 apex_key {
4213 name: "myapex.key",
4214 public_key: "testkey.avbpubkey",
4215 private_key: "testkey.pem",
4216 }
4217
4218 cc_library {
4219 name: "mylib_common",
4220 srcs: ["mylib.cpp"],
4221 system_shared_libs: [],
4222 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004223 apex_available: [
4224 "//apex_available:platform",
4225 "myapex",
4226 ],
Alex Light0851b882019-02-07 13:20:53 -08004227 }
4228 `)
4229
Sundong Ahnabb64432019-10-22 13:58:29 +09004230 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004231 apexRule := module.Rule("apexRule")
4232 copyCmds := apexRule.Args["copy_commands"]
4233
4234 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4235 t.Log("Apex was a test apex!")
4236 t.Fail()
4237 }
4238 // Ensure that main rule creates an output
4239 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4240
4241 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004242 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004243
4244 // Ensure that both direct and indirect deps are copied into apex
4245 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4246
Colin Cross7113d202019-11-20 16:39:12 -08004247 // Ensure that the platform variant ends with _shared
4248 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004249
Colin Cross56a83212020-09-15 18:30:11 -07004250 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004251 t.Log("Found mylib_common not in any apex!")
4252 t.Fail()
4253 }
4254}
4255
4256func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004257 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004258 apex_test {
4259 name: "myapex",
4260 key: "myapex.key",
4261 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004262 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004263 }
4264
4265 apex_key {
4266 name: "myapex.key",
4267 public_key: "testkey.avbpubkey",
4268 private_key: "testkey.pem",
4269 }
4270
4271 cc_library {
4272 name: "mylib_common_test",
4273 srcs: ["mylib.cpp"],
4274 system_shared_libs: [],
4275 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004276 // TODO: remove //apex_available:platform
4277 apex_available: [
4278 "//apex_available:platform",
4279 "myapex",
4280 ],
Alex Light0851b882019-02-07 13:20:53 -08004281 }
4282 `)
4283
Sundong Ahnabb64432019-10-22 13:58:29 +09004284 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004285 apexRule := module.Rule("apexRule")
4286 copyCmds := apexRule.Args["copy_commands"]
4287
4288 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4289 t.Log("Apex was not a test apex!")
4290 t.Fail()
4291 }
4292 // Ensure that main rule creates an output
4293 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4294
4295 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004296 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004297
4298 // Ensure that both direct and indirect deps are copied into apex
4299 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4300
Colin Cross7113d202019-11-20 16:39:12 -08004301 // Ensure that the platform variant ends with _shared
4302 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004303}
4304
Alex Light9670d332019-01-29 18:07:33 -08004305func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004306 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004307 apex {
4308 name: "myapex",
4309 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004310 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004311 multilib: {
4312 first: {
4313 native_shared_libs: ["mylib_common"],
4314 }
4315 },
4316 target: {
4317 android: {
4318 multilib: {
4319 first: {
4320 native_shared_libs: ["mylib"],
4321 }
4322 }
4323 },
4324 host: {
4325 multilib: {
4326 first: {
4327 native_shared_libs: ["mylib2"],
4328 }
4329 }
4330 }
4331 }
4332 }
4333
4334 apex_key {
4335 name: "myapex.key",
4336 public_key: "testkey.avbpubkey",
4337 private_key: "testkey.pem",
4338 }
4339
4340 cc_library {
4341 name: "mylib",
4342 srcs: ["mylib.cpp"],
4343 system_shared_libs: [],
4344 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004345 // TODO: remove //apex_available:platform
4346 apex_available: [
4347 "//apex_available:platform",
4348 "myapex",
4349 ],
Alex Light9670d332019-01-29 18:07:33 -08004350 }
4351
4352 cc_library {
4353 name: "mylib_common",
4354 srcs: ["mylib.cpp"],
4355 system_shared_libs: [],
4356 stl: "none",
4357 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004358 // TODO: remove //apex_available:platform
4359 apex_available: [
4360 "//apex_available:platform",
4361 "myapex",
4362 ],
Alex Light9670d332019-01-29 18:07:33 -08004363 }
4364
4365 cc_library {
4366 name: "mylib2",
4367 srcs: ["mylib.cpp"],
4368 system_shared_libs: [],
4369 stl: "none",
4370 compile_multilib: "first",
4371 }
4372 `)
4373
Sundong Ahnabb64432019-10-22 13:58:29 +09004374 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004375 copyCmds := apexRule.Args["copy_commands"]
4376
4377 // Ensure that main rule creates an output
4378 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4379
4380 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004381 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4382 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4383 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004384
4385 // Ensure that both direct and indirect deps are copied into apex
4386 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4387 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4388 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4389
Colin Cross7113d202019-11-20 16:39:12 -08004390 // Ensure that the platform variant ends with _shared
4391 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4392 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4393 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004394}
Jiyong Park04480cf2019-02-06 00:16:29 +09004395
Jiyong Park59140302020-12-14 18:44:04 +09004396func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004397 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004398 apex {
4399 name: "myapex",
4400 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004401 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004402 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004403 arch: {
4404 arm64: {
4405 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004406 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004407 },
4408 x86_64: {
4409 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004410 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004411 },
4412 }
4413 }
4414
4415 apex_key {
4416 name: "myapex.key",
4417 public_key: "testkey.avbpubkey",
4418 private_key: "testkey.pem",
4419 }
4420
4421 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004422 name: "mylib.generic",
4423 srcs: ["mylib.cpp"],
4424 system_shared_libs: [],
4425 stl: "none",
4426 // TODO: remove //apex_available:platform
4427 apex_available: [
4428 "//apex_available:platform",
4429 "myapex",
4430 ],
4431 }
4432
4433 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004434 name: "mylib.arm64",
4435 srcs: ["mylib.cpp"],
4436 system_shared_libs: [],
4437 stl: "none",
4438 // TODO: remove //apex_available:platform
4439 apex_available: [
4440 "//apex_available:platform",
4441 "myapex",
4442 ],
4443 }
4444
4445 cc_library {
4446 name: "mylib.x64",
4447 srcs: ["mylib.cpp"],
4448 system_shared_libs: [],
4449 stl: "none",
4450 // TODO: remove //apex_available:platform
4451 apex_available: [
4452 "//apex_available:platform",
4453 "myapex",
4454 ],
4455 }
4456 `)
4457
4458 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4459 copyCmds := apexRule.Args["copy_commands"]
4460
4461 // Ensure that apex variant is created for the direct dep
4462 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004463 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004464 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4465
4466 // Ensure that both direct and indirect deps are copied into apex
4467 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4468 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4469}
4470
Jiyong Park04480cf2019-02-06 00:16:29 +09004471func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004472 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004473 apex {
4474 name: "myapex",
4475 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004476 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004477 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004478 }
4479
4480 apex_key {
4481 name: "myapex.key",
4482 public_key: "testkey.avbpubkey",
4483 private_key: "testkey.pem",
4484 }
4485
4486 sh_binary {
4487 name: "myscript",
4488 src: "mylib.cpp",
4489 filename: "myscript.sh",
4490 sub_dir: "script",
4491 }
4492 `)
4493
Sundong Ahnabb64432019-10-22 13:58:29 +09004494 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004495 copyCmds := apexRule.Args["copy_commands"]
4496
4497 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4498}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004499
Jooyung Han91df2082019-11-20 01:49:42 +09004500func TestApexInVariousPartition(t *testing.T) {
4501 testcases := []struct {
4502 propName, parition, flattenedPartition string
4503 }{
4504 {"", "system", "system_ext"},
4505 {"product_specific: true", "product", "product"},
4506 {"soc_specific: true", "vendor", "vendor"},
4507 {"proprietary: true", "vendor", "vendor"},
4508 {"vendor: true", "vendor", "vendor"},
4509 {"system_ext_specific: true", "system_ext", "system_ext"},
4510 }
4511 for _, tc := range testcases {
4512 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004513 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004514 apex {
4515 name: "myapex",
4516 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004517 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004518 `+tc.propName+`
4519 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004520
Jooyung Han91df2082019-11-20 01:49:42 +09004521 apex_key {
4522 name: "myapex.key",
4523 public_key: "testkey.avbpubkey",
4524 private_key: "testkey.pem",
4525 }
4526 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004527
Jooyung Han91df2082019-11-20 01:49:42 +09004528 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004529 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4530 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004531 if actual != expected {
4532 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4533 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004534
Jooyung Han91df2082019-11-20 01:49:42 +09004535 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004536 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4537 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004538 if actual != expected {
4539 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4540 }
4541 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004542 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004543}
Jiyong Park67882562019-03-21 01:11:21 +09004544
Jooyung Han580eb4f2020-06-24 19:33:06 +09004545func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004546 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004547 apex {
4548 name: "myapex",
4549 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004550 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004551 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004552
Jooyung Han580eb4f2020-06-24 19:33:06 +09004553 apex_key {
4554 name: "myapex.key",
4555 public_key: "testkey.avbpubkey",
4556 private_key: "testkey.pem",
4557 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004558 `)
4559 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004560 rule := module.Output("file_contexts")
4561 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4562}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004563
Jooyung Han580eb4f2020-06-24 19:33:06 +09004564func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004565 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004566 apex {
4567 name: "myapex",
4568 key: "myapex.key",
4569 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004570 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004571 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004572
Jooyung Han580eb4f2020-06-24 19:33:06 +09004573 apex_key {
4574 name: "myapex.key",
4575 public_key: "testkey.avbpubkey",
4576 private_key: "testkey.pem",
4577 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004578 `, withFiles(map[string][]byte{
4579 "my_own_file_contexts": nil,
4580 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004581}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004582
Jooyung Han580eb4f2020-06-24 19:33:06 +09004583func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004584 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004585 apex {
4586 name: "myapex",
4587 key: "myapex.key",
4588 product_specific: true,
4589 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004590 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004591 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004592
Jooyung Han580eb4f2020-06-24 19:33:06 +09004593 apex_key {
4594 name: "myapex.key",
4595 public_key: "testkey.avbpubkey",
4596 private_key: "testkey.pem",
4597 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004598 `)
4599
Colin Cross1c460562021-02-16 17:55:47 -08004600 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004601 apex {
4602 name: "myapex",
4603 key: "myapex.key",
4604 product_specific: true,
4605 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004606 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004607 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004608
Jooyung Han580eb4f2020-06-24 19:33:06 +09004609 apex_key {
4610 name: "myapex.key",
4611 public_key: "testkey.avbpubkey",
4612 private_key: "testkey.pem",
4613 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004614 `, withFiles(map[string][]byte{
4615 "product_specific_file_contexts": nil,
4616 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004617 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4618 rule := module.Output("file_contexts")
4619 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4620}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004621
Jooyung Han580eb4f2020-06-24 19:33:06 +09004622func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004623 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004624 apex {
4625 name: "myapex",
4626 key: "myapex.key",
4627 product_specific: true,
4628 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004629 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004630 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004631
Jooyung Han580eb4f2020-06-24 19:33:06 +09004632 apex_key {
4633 name: "myapex.key",
4634 public_key: "testkey.avbpubkey",
4635 private_key: "testkey.pem",
4636 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004637
Jooyung Han580eb4f2020-06-24 19:33:06 +09004638 filegroup {
4639 name: "my-file-contexts",
4640 srcs: ["product_specific_file_contexts"],
4641 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004642 `, withFiles(map[string][]byte{
4643 "product_specific_file_contexts": nil,
4644 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004645 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4646 rule := module.Output("file_contexts")
4647 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004648}
4649
Jiyong Park67882562019-03-21 01:11:21 +09004650func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004651 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004652 apex_key {
4653 name: "myapex.key",
4654 public_key: ":my.avbpubkey",
4655 private_key: ":my.pem",
4656 product_specific: true,
4657 }
4658
4659 filegroup {
4660 name: "my.avbpubkey",
4661 srcs: ["testkey2.avbpubkey"],
4662 }
4663
4664 filegroup {
4665 name: "my.pem",
4666 srcs: ["testkey2.pem"],
4667 }
4668 `)
4669
4670 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4671 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004672 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004673 if actual_pubkey != expected_pubkey {
4674 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4675 }
4676 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004677 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004678 if actual_privkey != expected_privkey {
4679 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4680 }
4681}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004682
4683func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004684 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004685 prebuilt_apex {
4686 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004687 arch: {
4688 arm64: {
4689 src: "myapex-arm64.apex",
4690 },
4691 arm: {
4692 src: "myapex-arm.apex",
4693 },
4694 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004695 }
4696 `)
4697
Wei Li340ee8e2022-03-18 17:33:24 -07004698 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4699 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004700
Jiyong Parkc95714e2019-03-29 14:23:10 +09004701 expectedInput := "myapex-arm64.apex"
4702 if prebuilt.inputApex.String() != expectedInput {
4703 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4704 }
Wei Li340ee8e2022-03-18 17:33:24 -07004705 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4706 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4707 rule := testingModule.Rule("genProvenanceMetaData")
4708 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4709 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4710 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4711 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004712}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004713
Paul Duffinc0609c62021-03-01 17:27:16 +00004714func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004715 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004716 prebuilt_apex {
4717 name: "myapex",
4718 }
4719 `)
4720}
4721
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004722func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004723 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004724 prebuilt_apex {
4725 name: "myapex",
4726 src: "myapex-arm.apex",
4727 filename: "notmyapex.apex",
4728 }
4729 `)
4730
Wei Li340ee8e2022-03-18 17:33:24 -07004731 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4732 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004733
4734 expected := "notmyapex.apex"
4735 if p.installFilename != expected {
4736 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4737 }
Wei Li340ee8e2022-03-18 17:33:24 -07004738 rule := testingModule.Rule("genProvenanceMetaData")
4739 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4740 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4741 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4742 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004743}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004744
Samiul Islam7c02e262021-09-08 17:48:28 +01004745func TestApexSetFilenameOverride(t *testing.T) {
4746 testApex(t, `
4747 apex_set {
4748 name: "com.company.android.myapex",
4749 apex_name: "com.android.myapex",
4750 set: "company-myapex.apks",
4751 filename: "com.company.android.myapex.apex"
4752 }
4753 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4754
4755 testApex(t, `
4756 apex_set {
4757 name: "com.company.android.myapex",
4758 apex_name: "com.android.myapex",
4759 set: "company-myapex.apks",
4760 filename: "com.company.android.myapex.capex"
4761 }
4762 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4763
4764 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4765 apex_set {
4766 name: "com.company.android.myapex",
4767 apex_name: "com.android.myapex",
4768 set: "company-myapex.apks",
4769 filename: "some-random-suffix"
4770 }
4771 `)
4772}
4773
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004774func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004775 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004776 prebuilt_apex {
4777 name: "myapex.prebuilt",
4778 src: "myapex-arm.apex",
4779 overrides: [
4780 "myapex",
4781 ],
4782 }
4783 `)
4784
Wei Li340ee8e2022-03-18 17:33:24 -07004785 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4786 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004787
4788 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004789 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004790 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004791 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004792 }
Wei Li340ee8e2022-03-18 17:33:24 -07004793 rule := testingModule.Rule("genProvenanceMetaData")
4794 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4795 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4796 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4797 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004798}
4799
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004800func TestPrebuiltApexName(t *testing.T) {
4801 testApex(t, `
4802 prebuilt_apex {
4803 name: "com.company.android.myapex",
4804 apex_name: "com.android.myapex",
4805 src: "company-myapex-arm.apex",
4806 }
4807 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4808
4809 testApex(t, `
4810 apex_set {
4811 name: "com.company.android.myapex",
4812 apex_name: "com.android.myapex",
4813 set: "company-myapex.apks",
4814 }
4815 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4816}
4817
4818func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4819 _ = android.GroupFixturePreparers(
4820 java.PrepareForTestWithJavaDefaultModules,
4821 PrepareForTestWithApexBuildComponents,
4822 android.FixtureWithRootAndroidBp(`
4823 platform_bootclasspath {
4824 name: "platform-bootclasspath",
4825 fragments: [
4826 {
4827 apex: "com.android.art",
4828 module: "art-bootclasspath-fragment",
4829 },
4830 ],
4831 }
4832
4833 prebuilt_apex {
4834 name: "com.company.android.art",
4835 apex_name: "com.android.art",
4836 src: "com.company.android.art-arm.apex",
4837 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4838 }
4839
4840 prebuilt_bootclasspath_fragment {
4841 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004842 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004843 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004844 hidden_api: {
4845 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4846 metadata: "my-bootclasspath-fragment/metadata.csv",
4847 index: "my-bootclasspath-fragment/index.csv",
4848 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4849 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4850 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004851 }
4852
4853 java_import {
4854 name: "core-oj",
4855 jars: ["prebuilt.jar"],
4856 }
4857 `),
4858 ).RunTest(t)
4859}
4860
Paul Duffin092153d2021-01-26 11:42:39 +00004861// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4862// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004863func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004864 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004865
Paul Duffin89886cb2021-02-05 16:44:03 +00004866 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004867 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004868 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004869 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004870 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004871 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004872 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4873 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4874 android.NormalizePathForTesting(dexJarBuildPath))
4875 }
4876
4877 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004878 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004879 // Make sure the import has been given the correct path to the dex jar.
4880 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4881 dexJarBuildPath := p.DexJarInstallPath()
4882 stem := android.RemoveOptionalPrebuiltPrefix(name)
4883 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4884 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4885 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004886 }
4887
Paul Duffin39853512021-02-26 11:09:39 +00004888 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004889 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004890 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004891 android.AssertArrayString(t, "Check if there is no source variant",
4892 []string{"android_common"},
4893 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004894 }
4895
4896 t.Run("prebuilt only", func(t *testing.T) {
4897 bp := `
4898 prebuilt_apex {
4899 name: "myapex",
4900 arch: {
4901 arm64: {
4902 src: "myapex-arm64.apex",
4903 },
4904 arm: {
4905 src: "myapex-arm.apex",
4906 },
4907 },
Paul Duffin39853512021-02-26 11:09:39 +00004908 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004909 }
4910
4911 java_import {
4912 name: "libfoo",
4913 jars: ["libfoo.jar"],
4914 }
Paul Duffin39853512021-02-26 11:09:39 +00004915
4916 java_sdk_library_import {
4917 name: "libbar",
4918 public: {
4919 jars: ["libbar.jar"],
4920 },
4921 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004922 `
4923
4924 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4925 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4926
Martin Stjernholm44825602021-09-17 01:44:12 +01004927 deapexerName := deapexerModuleName("myapex")
4928 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4929
Paul Duffinf6932af2021-02-26 18:21:56 +00004930 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004931 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004932 rule := deapexer.Rule("deapexer")
4933 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4934 t.Errorf("expected: %q, found: %q", expected, actual)
4935 }
4936
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004937 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004938 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004939 rule = prebuiltApex.Rule("android/soong/android.Cp")
4940 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4941 t.Errorf("expected: %q, found: %q", expected, actual)
4942 }
4943
Paul Duffin89886cb2021-02-05 16:44:03 +00004944 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004945 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004946
4947 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004948 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004949 })
4950
4951 t.Run("prebuilt with source preferred", func(t *testing.T) {
4952
4953 bp := `
4954 prebuilt_apex {
4955 name: "myapex",
4956 arch: {
4957 arm64: {
4958 src: "myapex-arm64.apex",
4959 },
4960 arm: {
4961 src: "myapex-arm.apex",
4962 },
4963 },
Paul Duffin39853512021-02-26 11:09:39 +00004964 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004965 }
4966
4967 java_import {
4968 name: "libfoo",
4969 jars: ["libfoo.jar"],
4970 }
4971
4972 java_library {
4973 name: "libfoo",
4974 }
Paul Duffin39853512021-02-26 11:09:39 +00004975
4976 java_sdk_library_import {
4977 name: "libbar",
4978 public: {
4979 jars: ["libbar.jar"],
4980 },
4981 }
4982
4983 java_sdk_library {
4984 name: "libbar",
4985 srcs: ["foo/bar/MyClass.java"],
4986 unsafe_ignore_missing_latest_api: true,
4987 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004988 `
4989
4990 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4991 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4992
Paul Duffin89886cb2021-02-05 16:44:03 +00004993 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004994 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004995 ensureNoSourceVariant(t, ctx, "libfoo")
4996
4997 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004998 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004999 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005000 })
5001
5002 t.Run("prebuilt preferred with source", func(t *testing.T) {
5003 bp := `
5004 prebuilt_apex {
5005 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005006 arch: {
5007 arm64: {
5008 src: "myapex-arm64.apex",
5009 },
5010 arm: {
5011 src: "myapex-arm.apex",
5012 },
5013 },
Paul Duffin39853512021-02-26 11:09:39 +00005014 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005015 }
5016
5017 java_import {
5018 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005019 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005020 jars: ["libfoo.jar"],
5021 }
5022
5023 java_library {
5024 name: "libfoo",
5025 }
Paul Duffin39853512021-02-26 11:09:39 +00005026
5027 java_sdk_library_import {
5028 name: "libbar",
5029 prefer: true,
5030 public: {
5031 jars: ["libbar.jar"],
5032 },
5033 }
5034
5035 java_sdk_library {
5036 name: "libbar",
5037 srcs: ["foo/bar/MyClass.java"],
5038 unsafe_ignore_missing_latest_api: true,
5039 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005040 `
5041
5042 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5043 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5044
Paul Duffin89886cb2021-02-05 16:44:03 +00005045 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005046 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005047 ensureNoSourceVariant(t, ctx, "libfoo")
5048
5049 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005050 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005051 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005052 })
5053}
5054
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005055func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005056 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005057 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005058 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5059 // is disabled.
5060 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5061 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005062
Paul Duffin37856732021-02-26 14:24:15 +00005063 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5064 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005065 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005066 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005067 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005068 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005069 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005070 foundLibfooJar = true
5071 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005072 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005073 }
5074 }
5075 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005076 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 +00005077 }
5078 }
5079
Paul Duffin40a3f652021-07-19 13:11:24 +01005080 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005081 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005082 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005083 var rule android.TestingBuildParams
5084
5085 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5086 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005087 }
5088
Paul Duffin40a3f652021-07-19 13:11:24 +01005089 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5090 t.Helper()
5091 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5092 var rule android.TestingBuildParams
5093
5094 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5095 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5096 }
5097
Paul Duffin89f570a2021-06-16 01:42:33 +01005098 fragment := java.ApexVariantReference{
5099 Apex: proptools.StringPtr("myapex"),
5100 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5101 }
5102
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005103 t.Run("prebuilt only", func(t *testing.T) {
5104 bp := `
5105 prebuilt_apex {
5106 name: "myapex",
5107 arch: {
5108 arm64: {
5109 src: "myapex-arm64.apex",
5110 },
5111 arm: {
5112 src: "myapex-arm.apex",
5113 },
5114 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005115 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5116 }
5117
5118 prebuilt_bootclasspath_fragment {
5119 name: "my-bootclasspath-fragment",
5120 contents: ["libfoo", "libbar"],
5121 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005122 hidden_api: {
5123 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5124 metadata: "my-bootclasspath-fragment/metadata.csv",
5125 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005126 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5127 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5128 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005129 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005130 }
5131
5132 java_import {
5133 name: "libfoo",
5134 jars: ["libfoo.jar"],
5135 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005136 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005137 }
Paul Duffin37856732021-02-26 14:24:15 +00005138
5139 java_sdk_library_import {
5140 name: "libbar",
5141 public: {
5142 jars: ["libbar.jar"],
5143 },
5144 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005145 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005146 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005147 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005148 `
5149
Paul Duffin89f570a2021-06-16 01:42:33 +01005150 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005151 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5152 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005153
Paul Duffin537ea3d2021-05-14 10:38:00 +01005154 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005155 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005156 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005157 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005158 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5159 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005160 })
5161
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005162 t.Run("apex_set only", func(t *testing.T) {
5163 bp := `
5164 apex_set {
5165 name: "myapex",
5166 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005167 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5168 }
5169
5170 prebuilt_bootclasspath_fragment {
5171 name: "my-bootclasspath-fragment",
5172 contents: ["libfoo", "libbar"],
5173 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005174 hidden_api: {
5175 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5176 metadata: "my-bootclasspath-fragment/metadata.csv",
5177 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005178 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5179 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5180 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005181 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005182 }
5183
5184 java_import {
5185 name: "libfoo",
5186 jars: ["libfoo.jar"],
5187 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005188 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005189 }
5190
5191 java_sdk_library_import {
5192 name: "libbar",
5193 public: {
5194 jars: ["libbar.jar"],
5195 },
5196 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005197 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005198 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005199 }
5200 `
5201
Paul Duffin89f570a2021-06-16 01:42:33 +01005202 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005203 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5204 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5205
Paul Duffin537ea3d2021-05-14 10:38:00 +01005206 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005207 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005208 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005209 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005210 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5211 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005212 })
5213
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005214 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5215 bp := `
5216 prebuilt_apex {
5217 name: "myapex",
5218 arch: {
5219 arm64: {
5220 src: "myapex-arm64.apex",
5221 },
5222 arm: {
5223 src: "myapex-arm.apex",
5224 },
5225 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005226 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5227 }
5228
5229 prebuilt_bootclasspath_fragment {
5230 name: "my-bootclasspath-fragment",
5231 contents: ["libfoo", "libbar"],
5232 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005233 hidden_api: {
5234 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5235 metadata: "my-bootclasspath-fragment/metadata.csv",
5236 index: "my-bootclasspath-fragment/index.csv",
5237 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5238 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5239 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005240 }
5241
5242 java_import {
5243 name: "libfoo",
5244 jars: ["libfoo.jar"],
5245 apex_available: ["myapex"],
5246 }
5247
5248 java_library {
5249 name: "libfoo",
5250 srcs: ["foo/bar/MyClass.java"],
5251 apex_available: ["myapex"],
5252 }
Paul Duffin37856732021-02-26 14:24:15 +00005253
5254 java_sdk_library_import {
5255 name: "libbar",
5256 public: {
5257 jars: ["libbar.jar"],
5258 },
5259 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005260 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005261 }
5262
5263 java_sdk_library {
5264 name: "libbar",
5265 srcs: ["foo/bar/MyClass.java"],
5266 unsafe_ignore_missing_latest_api: true,
5267 apex_available: ["myapex"],
5268 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005269 `
5270
5271 // In this test the source (java_library) libfoo is active since the
5272 // prebuilt (java_import) defaults to prefer:false. However the
5273 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5274 // find the dex boot jar in it. We either need to disable the source libfoo
5275 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005276 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005277 // dexbootjar check is skipped if AllowMissingDependencies is true
5278 preparerAllowMissingDeps := android.GroupFixturePreparers(
5279 preparer,
5280 android.PrepareForTestWithAllowMissingDependencies,
5281 )
5282 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005283 })
5284
5285 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5286 bp := `
5287 prebuilt_apex {
5288 name: "myapex",
5289 arch: {
5290 arm64: {
5291 src: "myapex-arm64.apex",
5292 },
5293 arm: {
5294 src: "myapex-arm.apex",
5295 },
5296 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005297 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5298 }
5299
5300 prebuilt_bootclasspath_fragment {
5301 name: "my-bootclasspath-fragment",
5302 contents: ["libfoo", "libbar"],
5303 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005304 hidden_api: {
5305 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5306 metadata: "my-bootclasspath-fragment/metadata.csv",
5307 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005308 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5309 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5310 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005311 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005312 }
5313
5314 java_import {
5315 name: "libfoo",
5316 prefer: true,
5317 jars: ["libfoo.jar"],
5318 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005319 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005320 }
5321
5322 java_library {
5323 name: "libfoo",
5324 srcs: ["foo/bar/MyClass.java"],
5325 apex_available: ["myapex"],
5326 }
Paul Duffin37856732021-02-26 14:24:15 +00005327
5328 java_sdk_library_import {
5329 name: "libbar",
5330 prefer: true,
5331 public: {
5332 jars: ["libbar.jar"],
5333 },
5334 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005335 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005336 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005337 }
5338
5339 java_sdk_library {
5340 name: "libbar",
5341 srcs: ["foo/bar/MyClass.java"],
5342 unsafe_ignore_missing_latest_api: true,
5343 apex_available: ["myapex"],
5344 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005345 `
5346
Paul Duffin89f570a2021-06-16 01:42:33 +01005347 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005348 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5349 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005350
Paul Duffin537ea3d2021-05-14 10:38:00 +01005351 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005352 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005353 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005354 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005355 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5356 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005357 })
5358
5359 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5360 bp := `
5361 apex {
5362 name: "myapex",
5363 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005364 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005365 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005366 }
5367
5368 apex_key {
5369 name: "myapex.key",
5370 public_key: "testkey.avbpubkey",
5371 private_key: "testkey.pem",
5372 }
5373
5374 prebuilt_apex {
5375 name: "myapex",
5376 arch: {
5377 arm64: {
5378 src: "myapex-arm64.apex",
5379 },
5380 arm: {
5381 src: "myapex-arm.apex",
5382 },
5383 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005384 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5385 }
5386
5387 prebuilt_bootclasspath_fragment {
5388 name: "my-bootclasspath-fragment",
5389 contents: ["libfoo", "libbar"],
5390 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005391 hidden_api: {
5392 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5393 metadata: "my-bootclasspath-fragment/metadata.csv",
5394 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005395 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5396 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5397 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005398 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005399 }
5400
5401 java_import {
5402 name: "libfoo",
5403 jars: ["libfoo.jar"],
5404 apex_available: ["myapex"],
5405 }
5406
5407 java_library {
5408 name: "libfoo",
5409 srcs: ["foo/bar/MyClass.java"],
5410 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005411 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005412 }
Paul Duffin37856732021-02-26 14:24:15 +00005413
5414 java_sdk_library_import {
5415 name: "libbar",
5416 public: {
5417 jars: ["libbar.jar"],
5418 },
5419 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005420 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005421 }
5422
5423 java_sdk_library {
5424 name: "libbar",
5425 srcs: ["foo/bar/MyClass.java"],
5426 unsafe_ignore_missing_latest_api: true,
5427 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005428 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005429 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005430 `
5431
Paul Duffin89f570a2021-06-16 01:42:33 +01005432 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005433 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5434 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005435
Paul Duffin537ea3d2021-05-14 10:38:00 +01005436 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005437 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005438 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005439 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005440 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5441 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005442 })
5443
5444 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5445 bp := `
5446 apex {
5447 name: "myapex",
5448 enabled: false,
5449 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005450 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005451 }
5452
5453 apex_key {
5454 name: "myapex.key",
5455 public_key: "testkey.avbpubkey",
5456 private_key: "testkey.pem",
5457 }
5458
5459 prebuilt_apex {
5460 name: "myapex",
5461 arch: {
5462 arm64: {
5463 src: "myapex-arm64.apex",
5464 },
5465 arm: {
5466 src: "myapex-arm.apex",
5467 },
5468 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005469 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5470 }
5471
5472 prebuilt_bootclasspath_fragment {
5473 name: "my-bootclasspath-fragment",
5474 contents: ["libfoo", "libbar"],
5475 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005476 hidden_api: {
5477 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5478 metadata: "my-bootclasspath-fragment/metadata.csv",
5479 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005480 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5481 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5482 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005483 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005484 }
5485
5486 java_import {
5487 name: "libfoo",
5488 prefer: true,
5489 jars: ["libfoo.jar"],
5490 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005491 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005492 }
5493
5494 java_library {
5495 name: "libfoo",
5496 srcs: ["foo/bar/MyClass.java"],
5497 apex_available: ["myapex"],
5498 }
Paul Duffin37856732021-02-26 14:24:15 +00005499
5500 java_sdk_library_import {
5501 name: "libbar",
5502 prefer: true,
5503 public: {
5504 jars: ["libbar.jar"],
5505 },
5506 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005507 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005508 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005509 }
5510
5511 java_sdk_library {
5512 name: "libbar",
5513 srcs: ["foo/bar/MyClass.java"],
5514 unsafe_ignore_missing_latest_api: true,
5515 apex_available: ["myapex"],
5516 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005517 `
5518
Paul Duffin89f570a2021-06-16 01:42:33 +01005519 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005520 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5521 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005522
Paul Duffin537ea3d2021-05-14 10:38:00 +01005523 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005524 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005525 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005526 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005527 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5528 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005529 })
5530}
5531
Roland Levillain630846d2019-06-26 12:48:34 +01005532func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005533 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005534 apex_test {
5535 name: "myapex",
5536 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005537 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005538 tests: [
5539 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005540 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005541 ],
5542 }
5543
5544 apex_key {
5545 name: "myapex.key",
5546 public_key: "testkey.avbpubkey",
5547 private_key: "testkey.pem",
5548 }
5549
Liz Kammer1c14a212020-05-12 15:26:55 -07005550 filegroup {
5551 name: "fg",
5552 srcs: [
5553 "baz",
5554 "bar/baz"
5555 ],
5556 }
5557
Roland Levillain630846d2019-06-26 12:48:34 +01005558 cc_test {
5559 name: "mytest",
5560 gtest: false,
5561 srcs: ["mytest.cpp"],
5562 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005563 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005564 system_shared_libs: [],
5565 static_executable: true,
5566 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005567 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005568 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005569
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005570 cc_library {
5571 name: "mylib",
5572 srcs: ["mylib.cpp"],
5573 system_shared_libs: [],
5574 stl: "none",
5575 }
5576
Liz Kammer5bd365f2020-05-27 15:15:11 -07005577 filegroup {
5578 name: "fg2",
5579 srcs: [
5580 "testdata/baz"
5581 ],
5582 }
5583
Roland Levillain9b5fde92019-06-28 15:41:19 +01005584 cc_test {
5585 name: "mytests",
5586 gtest: false,
5587 srcs: [
5588 "mytest1.cpp",
5589 "mytest2.cpp",
5590 "mytest3.cpp",
5591 ],
5592 test_per_src: true,
5593 relative_install_path: "test",
5594 system_shared_libs: [],
5595 static_executable: true,
5596 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005597 data: [
5598 ":fg",
5599 ":fg2",
5600 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005601 }
Roland Levillain630846d2019-06-26 12:48:34 +01005602 `)
5603
Sundong Ahnabb64432019-10-22 13:58:29 +09005604 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005605 copyCmds := apexRule.Args["copy_commands"]
5606
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005607 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005608 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005609 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005610
Liz Kammer1c14a212020-05-12 15:26:55 -07005611 //Ensure that test data are copied into apex.
5612 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5613 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5614
Roland Levillain9b5fde92019-06-28 15:41:19 +01005615 // Ensure that test deps built with `test_per_src` are copied into apex.
5616 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5617 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5618 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005619
5620 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005621 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005622 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005623 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005624 prefix := "TARGET_"
5625 var builder strings.Builder
5626 data.Custom(&builder, name, prefix, "", data)
5627 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005628 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5629 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5630 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5631 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005632 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005633 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005634 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005635
5636 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005637 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005638 data.Custom(&builder, name, prefix, "", data)
5639 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005640 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5641 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005642}
5643
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005644func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005645 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005646 apex {
5647 name: "myapex",
5648 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005649 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005650 }
5651 apex_key {
5652 name: "myapex.key",
5653 public_key: "testkey.avbpubkey",
5654 private_key: "testkey.pem",
5655 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005656 `,
5657 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5658 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5659 }),
5660 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005661 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005662 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005663 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005664 var builder strings.Builder
5665 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5666 androidMk := builder.String()
5667 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5668}
5669
Jooyung Hand48f3c32019-08-23 11:18:57 +09005670func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5671 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5672 apex {
5673 name: "myapex",
5674 key: "myapex.key",
5675 native_shared_libs: ["libfoo"],
5676 }
5677
5678 apex_key {
5679 name: "myapex.key",
5680 public_key: "testkey.avbpubkey",
5681 private_key: "testkey.pem",
5682 }
5683
5684 cc_library {
5685 name: "libfoo",
5686 stl: "none",
5687 system_shared_libs: [],
5688 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005689 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005690 }
5691 `)
5692 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5693 apex {
5694 name: "myapex",
5695 key: "myapex.key",
5696 java_libs: ["myjar"],
5697 }
5698
5699 apex_key {
5700 name: "myapex.key",
5701 public_key: "testkey.avbpubkey",
5702 private_key: "testkey.pem",
5703 }
5704
5705 java_library {
5706 name: "myjar",
5707 srcs: ["foo/bar/MyClass.java"],
5708 sdk_version: "none",
5709 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005710 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005711 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005712 }
5713 `)
5714}
5715
Bill Peckhama41a6962021-01-11 10:58:54 -08005716func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005717 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005718 apex {
5719 name: "myapex",
5720 key: "myapex.key",
5721 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005722 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005723 }
5724
5725 apex_key {
5726 name: "myapex.key",
5727 public_key: "testkey.avbpubkey",
5728 private_key: "testkey.pem",
5729 }
5730
5731 java_import {
5732 name: "myjavaimport",
5733 apex_available: ["myapex"],
5734 jars: ["my.jar"],
5735 compile_dex: true,
5736 }
5737 `)
5738
5739 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5740 apexRule := module.Rule("apexRule")
5741 copyCmds := apexRule.Args["copy_commands"]
5742 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5743}
5744
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005745func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005746 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005747 apex {
5748 name: "myapex",
5749 key: "myapex.key",
5750 apps: [
5751 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005752 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005753 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005754 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005755 }
5756
5757 apex_key {
5758 name: "myapex.key",
5759 public_key: "testkey.avbpubkey",
5760 private_key: "testkey.pem",
5761 }
5762
5763 android_app {
5764 name: "AppFoo",
5765 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005766 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005767 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005768 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005769 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005770 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005771 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005772
5773 android_app {
5774 name: "AppFooPriv",
5775 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005776 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005777 system_modules: "none",
5778 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005779 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005780 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005781 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005782
5783 cc_library_shared {
5784 name: "libjni",
5785 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005786 shared_libs: ["libfoo"],
5787 stl: "none",
5788 system_shared_libs: [],
5789 apex_available: [ "myapex" ],
5790 sdk_version: "current",
5791 }
5792
5793 cc_library_shared {
5794 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005795 stl: "none",
5796 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005797 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005798 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005799 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005800 `)
5801
Sundong Ahnabb64432019-10-22 13:58:29 +09005802 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005803 apexRule := module.Rule("apexRule")
5804 copyCmds := apexRule.Args["copy_commands"]
5805
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005806 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5807 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005808
Colin Crossaede88c2020-08-11 12:17:01 -07005809 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005810 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005811 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005812 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005813 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005814 // JNI libraries including transitive deps are
5815 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005816 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005817 // ... embedded inside APK (jnilibs.zip)
5818 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5819 // ... and not directly inside the APEX
5820 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5821 }
Dario Frenicde2a032019-10-27 00:29:22 +01005822}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005823
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005824func TestApexWithAppImportBuildId(t *testing.T) {
5825 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5826 for _, id := range invalidBuildIds {
5827 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5828 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5829 variables.BuildId = proptools.StringPtr(id)
5830 })
5831 testApexError(t, message, `apex {
5832 name: "myapex",
5833 key: "myapex.key",
5834 apps: ["AppFooPrebuilt"],
5835 updatable: false,
5836 }
5837
5838 apex_key {
5839 name: "myapex.key",
5840 public_key: "testkey.avbpubkey",
5841 private_key: "testkey.pem",
5842 }
5843
5844 android_app_import {
5845 name: "AppFooPrebuilt",
5846 apk: "PrebuiltAppFoo.apk",
5847 presigned: true,
5848 apex_available: ["myapex"],
5849 }
5850 `, fixture)
5851 }
5852}
5853
Dario Frenicde2a032019-10-27 00:29:22 +01005854func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005855 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005856 apex {
5857 name: "myapex",
5858 key: "myapex.key",
5859 apps: [
5860 "AppFooPrebuilt",
5861 "AppFooPrivPrebuilt",
5862 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005863 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005864 }
5865
5866 apex_key {
5867 name: "myapex.key",
5868 public_key: "testkey.avbpubkey",
5869 private_key: "testkey.pem",
5870 }
5871
5872 android_app_import {
5873 name: "AppFooPrebuilt",
5874 apk: "PrebuiltAppFoo.apk",
5875 presigned: true,
5876 dex_preopt: {
5877 enabled: false,
5878 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005879 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005880 }
5881
5882 android_app_import {
5883 name: "AppFooPrivPrebuilt",
5884 apk: "PrebuiltAppFooPriv.apk",
5885 privileged: true,
5886 presigned: true,
5887 dex_preopt: {
5888 enabled: false,
5889 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005890 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005891 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005892 }
5893 `)
5894
Sundong Ahnabb64432019-10-22 13:58:29 +09005895 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005896 apexRule := module.Rule("apexRule")
5897 copyCmds := apexRule.Args["copy_commands"]
5898
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005899 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5900 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005901}
5902
5903func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005904 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005905 apex {
5906 name: "myapex",
5907 key: "myapex.key",
5908 apps: [
5909 "AppFoo",
5910 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005911 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005912 }
5913
5914 apex_key {
5915 name: "myapex.key",
5916 public_key: "testkey.avbpubkey",
5917 private_key: "testkey.pem",
5918 }
5919
5920 android_app {
5921 name: "AppFoo",
5922 srcs: ["foo/bar/MyClass.java"],
5923 sdk_version: "none",
5924 system_modules: "none",
5925 apex_available: [ "myapex" ],
5926 }
5927
5928 android_app_import {
5929 name: "AppFoo",
5930 apk: "AppFooPrebuilt.apk",
5931 filename: "AppFooPrebuilt.apk",
5932 presigned: true,
5933 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005934 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005935 }
5936 `, withFiles(map[string][]byte{
5937 "AppFooPrebuilt.apk": nil,
5938 }))
5939
5940 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005941 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005942 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005943}
5944
Dario Freni6f3937c2019-12-20 22:58:03 +00005945func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005946 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005947 apex {
5948 name: "myapex",
5949 key: "myapex.key",
5950 apps: [
5951 "TesterHelpAppFoo",
5952 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005953 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005954 }
5955
5956 apex_key {
5957 name: "myapex.key",
5958 public_key: "testkey.avbpubkey",
5959 private_key: "testkey.pem",
5960 }
5961
5962 android_test_helper_app {
5963 name: "TesterHelpAppFoo",
5964 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005965 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005966 }
5967
5968 `)
5969
5970 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5971 apexRule := module.Rule("apexRule")
5972 copyCmds := apexRule.Args["copy_commands"]
5973
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005974 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005975}
5976
Jooyung Han18020ea2019-11-13 10:50:48 +09005977func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5978 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005979 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005980 apex {
5981 name: "myapex",
5982 key: "myapex.key",
5983 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005984 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005985 }
5986
5987 apex_key {
5988 name: "myapex.key",
5989 public_key: "testkey.avbpubkey",
5990 private_key: "testkey.pem",
5991 }
5992
5993 apex {
5994 name: "otherapex",
5995 key: "myapex.key",
5996 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005997 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005998 }
5999
6000 cc_defaults {
6001 name: "libfoo-defaults",
6002 apex_available: ["otherapex"],
6003 }
6004
6005 cc_library {
6006 name: "libfoo",
6007 defaults: ["libfoo-defaults"],
6008 stl: "none",
6009 system_shared_libs: [],
6010 }`)
6011}
6012
Paul Duffine52e66f2020-03-30 17:54:29 +01006013func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006014 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006015 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006016 apex {
6017 name: "myapex",
6018 key: "myapex.key",
6019 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006020 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006021 }
6022
6023 apex_key {
6024 name: "myapex.key",
6025 public_key: "testkey.avbpubkey",
6026 private_key: "testkey.pem",
6027 }
6028
6029 apex {
6030 name: "otherapex",
6031 key: "otherapex.key",
6032 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006033 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006034 }
6035
6036 apex_key {
6037 name: "otherapex.key",
6038 public_key: "testkey.avbpubkey",
6039 private_key: "testkey.pem",
6040 }
6041
6042 cc_library {
6043 name: "libfoo",
6044 stl: "none",
6045 system_shared_libs: [],
6046 apex_available: ["otherapex"],
6047 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006048}
Jiyong Park127b40b2019-09-30 16:04:35 +09006049
Paul Duffine52e66f2020-03-30 17:54:29 +01006050func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006051 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006052 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006053.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006054.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006055.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006056.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006057.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006058.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006059 apex {
6060 name: "myapex",
6061 key: "myapex.key",
6062 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006063 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006064 }
6065
6066 apex_key {
6067 name: "myapex.key",
6068 public_key: "testkey.avbpubkey",
6069 private_key: "testkey.pem",
6070 }
6071
Jiyong Park127b40b2019-09-30 16:04:35 +09006072 cc_library {
6073 name: "libfoo",
6074 stl: "none",
6075 shared_libs: ["libbar"],
6076 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006077 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006078 }
6079
6080 cc_library {
6081 name: "libbar",
6082 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006083 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006084 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006085 apex_available: ["myapex"],
6086 }
6087
6088 cc_library {
6089 name: "libbaz",
6090 stl: "none",
6091 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006092 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006093}
Jiyong Park127b40b2019-09-30 16:04:35 +09006094
Paul Duffine52e66f2020-03-30 17:54:29 +01006095func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006096 testApexError(t, "\"otherapex\" is not a valid module name", `
6097 apex {
6098 name: "myapex",
6099 key: "myapex.key",
6100 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006101 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006102 }
6103
6104 apex_key {
6105 name: "myapex.key",
6106 public_key: "testkey.avbpubkey",
6107 private_key: "testkey.pem",
6108 }
6109
6110 cc_library {
6111 name: "libfoo",
6112 stl: "none",
6113 system_shared_libs: [],
6114 apex_available: ["otherapex"],
6115 }`)
6116
Paul Duffine52e66f2020-03-30 17:54:29 +01006117 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006118 apex {
6119 name: "myapex",
6120 key: "myapex.key",
6121 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006122 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006123 }
6124
6125 apex_key {
6126 name: "myapex.key",
6127 public_key: "testkey.avbpubkey",
6128 private_key: "testkey.pem",
6129 }
6130
6131 cc_library {
6132 name: "libfoo",
6133 stl: "none",
6134 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006135 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006136 apex_available: ["myapex"],
6137 }
6138
6139 cc_library {
6140 name: "libbar",
6141 stl: "none",
6142 system_shared_libs: [],
6143 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006144 }
6145
6146 cc_library {
6147 name: "libbaz",
6148 stl: "none",
6149 system_shared_libs: [],
6150 stubs: {
6151 versions: ["10", "20", "30"],
6152 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006153 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006154}
Jiyong Park127b40b2019-09-30 16:04:35 +09006155
Jiyong Park89e850a2020-04-07 16:37:39 +09006156func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006157 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006158 apex {
6159 name: "myapex",
6160 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006161 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006162 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006163 }
6164
6165 apex_key {
6166 name: "myapex.key",
6167 public_key: "testkey.avbpubkey",
6168 private_key: "testkey.pem",
6169 }
6170
6171 cc_library {
6172 name: "libfoo",
6173 stl: "none",
6174 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006175 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006176 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006177 }
6178
6179 cc_library {
6180 name: "libfoo2",
6181 stl: "none",
6182 system_shared_libs: [],
6183 shared_libs: ["libbaz"],
6184 apex_available: ["//apex_available:platform"],
6185 }
6186
6187 cc_library {
6188 name: "libbar",
6189 stl: "none",
6190 system_shared_libs: [],
6191 apex_available: ["myapex"],
6192 }
6193
6194 cc_library {
6195 name: "libbaz",
6196 stl: "none",
6197 system_shared_libs: [],
6198 apex_available: ["myapex"],
6199 stubs: {
6200 versions: ["1"],
6201 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006202 }`)
6203
Jiyong Park89e850a2020-04-07 16:37:39 +09006204 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6205 // because it depends on libbar which isn't available to platform
6206 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6207 if libfoo.NotAvailableForPlatform() != true {
6208 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6209 }
6210
6211 // libfoo2 however can be available to platform because it depends on libbaz which provides
6212 // stubs
6213 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6214 if libfoo2.NotAvailableForPlatform() == true {
6215 t.Errorf("%q should be available to platform", libfoo2.String())
6216 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006217}
Jiyong Parka90ca002019-10-07 15:47:24 +09006218
Paul Duffine52e66f2020-03-30 17:54:29 +01006219func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006220 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006221 apex {
6222 name: "myapex",
6223 key: "myapex.key",
6224 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006225 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006226 }
6227
6228 apex_key {
6229 name: "myapex.key",
6230 public_key: "testkey.avbpubkey",
6231 private_key: "testkey.pem",
6232 }
6233
6234 cc_library {
6235 name: "libfoo",
6236 stl: "none",
6237 system_shared_libs: [],
6238 apex_available: ["myapex"],
6239 static: {
6240 apex_available: ["//apex_available:platform"],
6241 },
6242 }`)
6243
Jiyong Park89e850a2020-04-07 16:37:39 +09006244 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6245 if libfooShared.NotAvailableForPlatform() != true {
6246 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6247 }
6248 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6249 if libfooStatic.NotAvailableForPlatform() != false {
6250 t.Errorf("%q should be available to platform", libfooStatic.String())
6251 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006252}
6253
Jiyong Park5d790c32019-11-15 18:40:32 +09006254func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006255 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006256 apex {
6257 name: "myapex",
6258 key: "myapex.key",
6259 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006260 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006261 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006262 bootclasspath_fragments: ["mybootclasspath_fragment"],
6263 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6264 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006265 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006266 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006267 }
6268
6269 override_apex {
6270 name: "override_myapex",
6271 base: "myapex",
6272 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006273 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006274 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006275 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6276 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6277 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006278 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006279 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006280 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006281 key: "mynewapex.key",
6282 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006283 }
6284
6285 apex_key {
6286 name: "myapex.key",
6287 public_key: "testkey.avbpubkey",
6288 private_key: "testkey.pem",
6289 }
6290
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006291 apex_key {
6292 name: "mynewapex.key",
6293 public_key: "testkey2.avbpubkey",
6294 private_key: "testkey2.pem",
6295 }
6296
6297 android_app_certificate {
6298 name: "myapex.certificate",
6299 certificate: "testkey",
6300 }
6301
Jiyong Park5d790c32019-11-15 18:40:32 +09006302 android_app {
6303 name: "app",
6304 srcs: ["foo/bar/MyClass.java"],
6305 package_name: "foo",
6306 sdk_version: "none",
6307 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006308 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006309 }
6310
6311 override_android_app {
6312 name: "override_app",
6313 base: "app",
6314 package_name: "bar",
6315 }
markchien7c803b82021-08-26 22:10:06 +08006316
6317 bpf {
6318 name: "bpf",
6319 srcs: ["bpf.c"],
6320 }
6321
6322 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006323 name: "overrideBpf",
6324 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006325 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006326
6327 prebuilt_etc {
6328 name: "myetc",
6329 src: "myprebuilt",
6330 }
6331
6332 prebuilt_etc {
6333 name: "override_myetc",
6334 src: "override_myprebuilt",
6335 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006336
6337 java_library {
6338 name: "bcplib",
6339 srcs: ["a.java"],
6340 compile_dex: true,
6341 apex_available: ["myapex"],
6342 permitted_packages: ["bcp.lib"],
6343 }
6344
6345 bootclasspath_fragment {
6346 name: "mybootclasspath_fragment",
6347 contents: ["bcplib"],
6348 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006349 hidden_api: {
6350 split_packages: ["*"],
6351 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006352 }
6353
6354 java_library {
6355 name: "override_bcplib",
6356 srcs: ["a.java"],
6357 compile_dex: true,
6358 apex_available: ["myapex"],
6359 permitted_packages: ["override.bcp.lib"],
6360 }
6361
6362 bootclasspath_fragment {
6363 name: "override_bootclasspath_fragment",
6364 contents: ["override_bcplib"],
6365 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006366 hidden_api: {
6367 split_packages: ["*"],
6368 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006369 }
6370
6371 java_library {
6372 name: "systemserverlib",
6373 srcs: ["a.java"],
6374 apex_available: ["myapex"],
6375 }
6376
6377 systemserverclasspath_fragment {
6378 name: "mysystemserverclasspath_fragment",
6379 standalone_contents: ["systemserverlib"],
6380 apex_available: ["myapex"],
6381 }
6382
6383 java_library {
6384 name: "override_systemserverlib",
6385 srcs: ["a.java"],
6386 apex_available: ["myapex"],
6387 }
6388
6389 systemserverclasspath_fragment {
6390 name: "override_systemserverclasspath_fragment",
6391 standalone_contents: ["override_systemserverlib"],
6392 apex_available: ["myapex"],
6393 }
6394
6395 java_library {
6396 name: "myjava_library",
6397 srcs: ["a.java"],
6398 compile_dex: true,
6399 apex_available: ["myapex"],
6400 }
6401
6402 java_library {
6403 name: "override_java_library",
6404 srcs: ["a.java"],
6405 compile_dex: true,
6406 apex_available: ["myapex"],
6407 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006408 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006409
Jiyong Park317645e2019-12-05 13:20:58 +09006410 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6411 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6412 if originalVariant.GetOverriddenBy() != "" {
6413 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6414 }
6415 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6416 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6417 }
6418
Jiyong Park5d790c32019-11-15 18:40:32 +09006419 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6420 apexRule := module.Rule("apexRule")
6421 copyCmds := apexRule.Args["copy_commands"]
6422
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006423 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6424 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006425
markchien7c803b82021-08-26 22:10:06 +08006426 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006427 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006428
Daniel Norman5a3ce132021-08-26 15:44:43 -07006429 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6430 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6431
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006432 apexBundle := module.Module().(*apexBundle)
6433 name := apexBundle.Name()
6434 if name != "override_myapex" {
6435 t.Errorf("name should be \"override_myapex\", but was %q", name)
6436 }
6437
Baligh Uddin004d7172020-02-19 21:29:28 -08006438 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6439 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6440 }
6441
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006442 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6443 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6444 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6445 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6446 android.AssertArrayString(t, "Java_libs does not match",
6447 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6448
Jiyong Park20bacab2020-03-03 11:45:41 +09006449 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006450 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006451 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6452
6453 signApkRule := module.Rule("signapk")
6454 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006455
Colin Crossaa255532020-07-03 13:18:24 -07006456 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006457 var builder strings.Builder
6458 data.Custom(&builder, name, "TARGET_", "", data)
6459 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006460 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Ken Chen5372a242022-07-07 17:48:06 +08006461 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006462 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006463 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6464 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6465 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006466 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006467 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006468 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006469 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006470 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006471 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006472 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6473 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6474 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006475 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006476}
6477
Albert Martineefabcf2022-03-21 20:11:16 +00006478func TestMinSdkVersionOverride(t *testing.T) {
6479 // Override from 29 to 31
6480 minSdkOverride31 := "31"
6481 ctx := testApex(t, `
6482 apex {
6483 name: "myapex",
6484 key: "myapex.key",
6485 native_shared_libs: ["mylib"],
6486 updatable: true,
6487 min_sdk_version: "29"
6488 }
6489
6490 override_apex {
6491 name: "override_myapex",
6492 base: "myapex",
6493 logging_parent: "com.foo.bar",
6494 package_name: "test.overridden.package"
6495 }
6496
6497 apex_key {
6498 name: "myapex.key",
6499 public_key: "testkey.avbpubkey",
6500 private_key: "testkey.pem",
6501 }
6502
6503 cc_library {
6504 name: "mylib",
6505 srcs: ["mylib.cpp"],
6506 runtime_libs: ["libbar"],
6507 system_shared_libs: [],
6508 stl: "none",
6509 apex_available: [ "myapex" ],
6510 min_sdk_version: "apex_inherit"
6511 }
6512
6513 cc_library {
6514 name: "libbar",
6515 srcs: ["mylib.cpp"],
6516 system_shared_libs: [],
6517 stl: "none",
6518 apex_available: [ "myapex" ],
6519 min_sdk_version: "apex_inherit"
6520 }
6521
6522 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6523
6524 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6525 copyCmds := apexRule.Args["copy_commands"]
6526
6527 // Ensure that direct non-stubs dep is always included
6528 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6529
6530 // Ensure that runtime_libs dep in included
6531 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6532
6533 // Ensure libraries target overridden min_sdk_version value
6534 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6535}
6536
6537func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6538 // Attempt to override from 31 to 29, should be a NOOP
6539 minSdkOverride29 := "29"
6540 ctx := testApex(t, `
6541 apex {
6542 name: "myapex",
6543 key: "myapex.key",
6544 native_shared_libs: ["mylib"],
6545 updatable: true,
6546 min_sdk_version: "31"
6547 }
6548
6549 override_apex {
6550 name: "override_myapex",
6551 base: "myapex",
6552 logging_parent: "com.foo.bar",
6553 package_name: "test.overridden.package"
6554 }
6555
6556 apex_key {
6557 name: "myapex.key",
6558 public_key: "testkey.avbpubkey",
6559 private_key: "testkey.pem",
6560 }
6561
6562 cc_library {
6563 name: "mylib",
6564 srcs: ["mylib.cpp"],
6565 runtime_libs: ["libbar"],
6566 system_shared_libs: [],
6567 stl: "none",
6568 apex_available: [ "myapex" ],
6569 min_sdk_version: "apex_inherit"
6570 }
6571
6572 cc_library {
6573 name: "libbar",
6574 srcs: ["mylib.cpp"],
6575 system_shared_libs: [],
6576 stl: "none",
6577 apex_available: [ "myapex" ],
6578 min_sdk_version: "apex_inherit"
6579 }
6580
6581 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6582
6583 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6584 copyCmds := apexRule.Args["copy_commands"]
6585
6586 // Ensure that direct non-stubs dep is always included
6587 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6588
6589 // Ensure that runtime_libs dep in included
6590 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6591
6592 // Ensure libraries target the original min_sdk_version value rather than the overridden
6593 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6594}
6595
Jooyung Han214bf372019-11-12 13:03:50 +09006596func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006597 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006598 apex {
6599 name: "myapex",
6600 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006601 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006602 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006603 }
6604
6605 apex_key {
6606 name: "myapex.key",
6607 public_key: "testkey.avbpubkey",
6608 private_key: "testkey.pem",
6609 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006610
6611 cc_library {
6612 name: "mylib",
6613 srcs: ["mylib.cpp"],
6614 stl: "libc++",
6615 system_shared_libs: [],
6616 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006617 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006618 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006619 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006620
6621 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6622 args := module.Rule("apexRule").Args
6623 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006624 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006625
6626 // The copies of the libraries in the apex should have one more dependency than
6627 // the ones outside the apex, namely the unwinder. Ideally we should check
6628 // the dependency names directly here but for some reason the names are blank in
6629 // this test.
6630 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006631 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006632 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6633 if len(apexImplicits) != len(nonApexImplicits)+1 {
6634 t.Errorf("%q missing unwinder dep", lib)
6635 }
6636 }
Jooyung Han214bf372019-11-12 13:03:50 +09006637}
6638
Paul Duffine05480a2021-03-08 15:07:14 +00006639var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006640 "api/current.txt": nil,
6641 "api/removed.txt": nil,
6642 "api/system-current.txt": nil,
6643 "api/system-removed.txt": nil,
6644 "api/test-current.txt": nil,
6645 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006646
Anton Hanssondff2c782020-12-21 17:10:01 +00006647 "100/public/api/foo.txt": nil,
6648 "100/public/api/foo-removed.txt": nil,
6649 "100/system/api/foo.txt": nil,
6650 "100/system/api/foo-removed.txt": nil,
6651
Paul Duffineedc5d52020-06-12 17:46:39 +01006652 // For java_sdk_library_import
6653 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006654}
6655
Jooyung Han58f26ab2019-12-18 15:34:32 +09006656func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006657 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006658 apex {
6659 name: "myapex",
6660 key: "myapex.key",
6661 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006662 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006663 }
6664
6665 apex_key {
6666 name: "myapex.key",
6667 public_key: "testkey.avbpubkey",
6668 private_key: "testkey.pem",
6669 }
6670
6671 java_sdk_library {
6672 name: "foo",
6673 srcs: ["a.java"],
6674 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006675 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006676 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006677
6678 prebuilt_apis {
6679 name: "sdk",
6680 api_dirs: ["100"],
6681 }
Paul Duffin9b879592020-05-26 13:21:35 +01006682 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006683
6684 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006685 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006686 "javalib/foo.jar",
6687 "etc/permissions/foo.xml",
6688 })
6689 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006690 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006691 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 +09006692}
6693
Paul Duffin9b879592020-05-26 13:21:35 +01006694func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006695 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006696 apex {
6697 name: "myapex",
6698 key: "myapex.key",
6699 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006700 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006701 }
6702
6703 apex_key {
6704 name: "myapex.key",
6705 public_key: "testkey.avbpubkey",
6706 private_key: "testkey.pem",
6707 }
6708
6709 java_sdk_library {
6710 name: "foo",
6711 srcs: ["a.java"],
6712 api_packages: ["foo"],
6713 apex_available: ["myapex"],
6714 sdk_version: "none",
6715 system_modules: "none",
6716 }
6717
6718 java_library {
6719 name: "bar",
6720 srcs: ["a.java"],
6721 libs: ["foo"],
6722 apex_available: ["myapex"],
6723 sdk_version: "none",
6724 system_modules: "none",
6725 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006726
6727 prebuilt_apis {
6728 name: "sdk",
6729 api_dirs: ["100"],
6730 }
Paul Duffin9b879592020-05-26 13:21:35 +01006731 `, withFiles(filesForSdkLibrary))
6732
6733 // java_sdk_library installs both impl jar and permission XML
6734 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6735 "javalib/bar.jar",
6736 "javalib/foo.jar",
6737 "etc/permissions/foo.xml",
6738 })
6739
6740 // The bar library should depend on the implementation jar.
6741 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006742 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006743 t.Errorf("expected %q, found %#q", expected, actual)
6744 }
6745}
6746
6747func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006748 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006749 apex {
6750 name: "myapex",
6751 key: "myapex.key",
6752 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006753 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006754 }
6755
6756 apex_key {
6757 name: "myapex.key",
6758 public_key: "testkey.avbpubkey",
6759 private_key: "testkey.pem",
6760 }
6761
6762 java_sdk_library {
6763 name: "foo",
6764 srcs: ["a.java"],
6765 api_packages: ["foo"],
6766 apex_available: ["myapex"],
6767 sdk_version: "none",
6768 system_modules: "none",
6769 }
6770
6771 java_library {
6772 name: "bar",
6773 srcs: ["a.java"],
6774 libs: ["foo"],
6775 sdk_version: "none",
6776 system_modules: "none",
6777 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006778
6779 prebuilt_apis {
6780 name: "sdk",
6781 api_dirs: ["100"],
6782 }
Paul Duffin9b879592020-05-26 13:21:35 +01006783 `, withFiles(filesForSdkLibrary))
6784
6785 // java_sdk_library installs both impl jar and permission XML
6786 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6787 "javalib/foo.jar",
6788 "etc/permissions/foo.xml",
6789 })
6790
6791 // The bar library should depend on the stubs jar.
6792 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006793 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006794 t.Errorf("expected %q, found %#q", expected, actual)
6795 }
6796}
6797
Paul Duffineedc5d52020-06-12 17:46:39 +01006798func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006799 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006800 prebuilt_apis {
6801 name: "sdk",
6802 api_dirs: ["100"],
6803 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006804 withFiles(map[string][]byte{
6805 "apex/a.java": nil,
6806 "apex/apex_manifest.json": nil,
6807 "apex/Android.bp": []byte(`
6808 package {
6809 default_visibility: ["//visibility:private"],
6810 }
6811
6812 apex {
6813 name: "myapex",
6814 key: "myapex.key",
6815 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006816 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006817 }
6818
6819 apex_key {
6820 name: "myapex.key",
6821 public_key: "testkey.avbpubkey",
6822 private_key: "testkey.pem",
6823 }
6824
6825 java_library {
6826 name: "bar",
6827 srcs: ["a.java"],
6828 libs: ["foo"],
6829 apex_available: ["myapex"],
6830 sdk_version: "none",
6831 system_modules: "none",
6832 }
6833`),
6834 "source/a.java": nil,
6835 "source/api/current.txt": nil,
6836 "source/api/removed.txt": nil,
6837 "source/Android.bp": []byte(`
6838 package {
6839 default_visibility: ["//visibility:private"],
6840 }
6841
6842 java_sdk_library {
6843 name: "foo",
6844 visibility: ["//apex"],
6845 srcs: ["a.java"],
6846 api_packages: ["foo"],
6847 apex_available: ["myapex"],
6848 sdk_version: "none",
6849 system_modules: "none",
6850 public: {
6851 enabled: true,
6852 },
6853 }
6854`),
6855 "prebuilt/a.jar": nil,
6856 "prebuilt/Android.bp": []byte(`
6857 package {
6858 default_visibility: ["//visibility:private"],
6859 }
6860
6861 java_sdk_library_import {
6862 name: "foo",
6863 visibility: ["//apex", "//source"],
6864 apex_available: ["myapex"],
6865 prefer: true,
6866 public: {
6867 jars: ["a.jar"],
6868 },
6869 }
6870`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006871 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006872 )
6873
6874 // java_sdk_library installs both impl jar and permission XML
6875 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6876 "javalib/bar.jar",
6877 "javalib/foo.jar",
6878 "etc/permissions/foo.xml",
6879 })
6880
6881 // The bar library should depend on the implementation jar.
6882 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006883 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006884 t.Errorf("expected %q, found %#q", expected, actual)
6885 }
6886}
6887
6888func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6889 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6890 apex {
6891 name: "myapex",
6892 key: "myapex.key",
6893 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006894 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006895 }
6896
6897 apex_key {
6898 name: "myapex.key",
6899 public_key: "testkey.avbpubkey",
6900 private_key: "testkey.pem",
6901 }
6902
6903 java_sdk_library_import {
6904 name: "foo",
6905 apex_available: ["myapex"],
6906 prefer: true,
6907 public: {
6908 jars: ["a.jar"],
6909 },
6910 }
6911
6912 `, withFiles(filesForSdkLibrary))
6913}
6914
atrost6e126252020-01-27 17:01:16 +00006915func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006916 result := android.GroupFixturePreparers(
6917 prepareForApexTest,
6918 java.PrepareForTestWithPlatformCompatConfig,
6919 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006920 apex {
6921 name: "myapex",
6922 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006923 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006924 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006925 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006926 }
6927
6928 apex_key {
6929 name: "myapex.key",
6930 public_key: "testkey.avbpubkey",
6931 private_key: "testkey.pem",
6932 }
6933
6934 platform_compat_config {
6935 name: "myjar-platform-compat-config",
6936 src: ":myjar",
6937 }
6938
6939 java_library {
6940 name: "myjar",
6941 srcs: ["foo/bar/MyClass.java"],
6942 sdk_version: "none",
6943 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006944 apex_available: [ "myapex" ],
6945 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006946
6947 // Make sure that a preferred prebuilt does not affect the apex contents.
6948 prebuilt_platform_compat_config {
6949 name: "myjar-platform-compat-config",
6950 metadata: "compat-config/metadata.xml",
6951 prefer: true,
6952 }
atrost6e126252020-01-27 17:01:16 +00006953 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006954 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006955 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6956 "etc/compatconfig/myjar-platform-compat-config.xml",
6957 "javalib/myjar.jar",
6958 })
6959}
6960
Jiyong Park479321d2019-12-16 11:47:12 +09006961func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6962 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6963 apex {
6964 name: "myapex",
6965 key: "myapex.key",
6966 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006967 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006968 }
6969
6970 apex_key {
6971 name: "myapex.key",
6972 public_key: "testkey.avbpubkey",
6973 private_key: "testkey.pem",
6974 }
6975
6976 java_library {
6977 name: "myjar",
6978 srcs: ["foo/bar/MyClass.java"],
6979 sdk_version: "none",
6980 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006981 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006982 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006983 }
6984 `)
6985}
6986
Jiyong Park7afd1072019-12-30 16:56:33 +09006987func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006988 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006989 apex {
6990 name: "myapex",
6991 key: "myapex.key",
6992 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006993 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006994 }
6995
6996 apex_key {
6997 name: "myapex.key",
6998 public_key: "testkey.avbpubkey",
6999 private_key: "testkey.pem",
7000 }
7001
7002 cc_library {
7003 name: "mylib",
7004 srcs: ["mylib.cpp"],
7005 system_shared_libs: [],
7006 stl: "none",
7007 required: ["a", "b"],
7008 host_required: ["c", "d"],
7009 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007010 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007011 }
7012 `)
7013
7014 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007015 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007016 name := apexBundle.BaseModuleName()
7017 prefix := "TARGET_"
7018 var builder strings.Builder
7019 data.Custom(&builder, name, prefix, "", data)
7020 androidMk := builder.String()
7021 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
7022 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
7023 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
7024}
7025
Jiyong Park7cd10e32020-01-14 09:22:18 +09007026func TestSymlinksFromApexToSystem(t *testing.T) {
7027 bp := `
7028 apex {
7029 name: "myapex",
7030 key: "myapex.key",
7031 native_shared_libs: ["mylib"],
7032 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007033 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007034 }
7035
Jiyong Park9d677202020-02-19 16:29:35 +09007036 apex {
7037 name: "myapex.updatable",
7038 key: "myapex.key",
7039 native_shared_libs: ["mylib"],
7040 java_libs: ["myjar"],
7041 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007042 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007043 }
7044
Jiyong Park7cd10e32020-01-14 09:22:18 +09007045 apex_key {
7046 name: "myapex.key",
7047 public_key: "testkey.avbpubkey",
7048 private_key: "testkey.pem",
7049 }
7050
7051 cc_library {
7052 name: "mylib",
7053 srcs: ["mylib.cpp"],
7054 shared_libs: ["myotherlib"],
7055 system_shared_libs: [],
7056 stl: "none",
7057 apex_available: [
7058 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007059 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007060 "//apex_available:platform",
7061 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007062 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007063 }
7064
7065 cc_library {
7066 name: "myotherlib",
7067 srcs: ["mylib.cpp"],
7068 system_shared_libs: [],
7069 stl: "none",
7070 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: "myjar",
7080 srcs: ["foo/bar/MyClass.java"],
7081 sdk_version: "none",
7082 system_modules: "none",
7083 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007084 apex_available: [
7085 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007086 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007087 "//apex_available:platform",
7088 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007089 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007090 }
7091
7092 java_library {
7093 name: "myotherjar",
7094 srcs: ["foo/bar/MyClass.java"],
7095 sdk_version: "none",
7096 system_modules: "none",
7097 apex_available: [
7098 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007099 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007100 "//apex_available:platform",
7101 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007102 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007103 }
7104 `
7105
7106 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7107 for _, f := range files {
7108 if f.path == file {
7109 if f.isLink {
7110 t.Errorf("%q is not a real file", file)
7111 }
7112 return
7113 }
7114 }
7115 t.Errorf("%q is not found", file)
7116 }
7117
7118 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7119 for _, f := range files {
7120 if f.path == file {
7121 if !f.isLink {
7122 t.Errorf("%q is not a symlink", file)
7123 }
7124 return
7125 }
7126 }
7127 t.Errorf("%q is not found", file)
7128 }
7129
Jiyong Park9d677202020-02-19 16:29:35 +09007130 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7131 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007132 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007133 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007134 ensureRealfileExists(t, files, "javalib/myjar.jar")
7135 ensureRealfileExists(t, files, "lib64/mylib.so")
7136 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7137
Jiyong Park9d677202020-02-19 16:29:35 +09007138 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7139 ensureRealfileExists(t, files, "javalib/myjar.jar")
7140 ensureRealfileExists(t, files, "lib64/mylib.so")
7141 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7142
7143 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007144 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007145 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007146 ensureRealfileExists(t, files, "javalib/myjar.jar")
7147 ensureRealfileExists(t, files, "lib64/mylib.so")
7148 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007149
7150 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7151 ensureRealfileExists(t, files, "javalib/myjar.jar")
7152 ensureRealfileExists(t, files, "lib64/mylib.so")
7153 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007154}
7155
Yo Chiange8128052020-07-23 20:09:18 +08007156func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007157 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007158 apex {
7159 name: "myapex",
7160 key: "myapex.key",
7161 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007162 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007163 }
7164
7165 apex_key {
7166 name: "myapex.key",
7167 public_key: "testkey.avbpubkey",
7168 private_key: "testkey.pem",
7169 }
7170
7171 cc_library_shared {
7172 name: "mylib",
7173 srcs: ["mylib.cpp"],
7174 shared_libs: ["myotherlib"],
7175 system_shared_libs: [],
7176 stl: "none",
7177 apex_available: [
7178 "myapex",
7179 "//apex_available:platform",
7180 ],
7181 }
7182
7183 cc_prebuilt_library_shared {
7184 name: "myotherlib",
7185 srcs: ["prebuilt.so"],
7186 system_shared_libs: [],
7187 stl: "none",
7188 apex_available: [
7189 "myapex",
7190 "//apex_available:platform",
7191 ],
7192 }
7193 `)
7194
7195 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007196 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007197 var builder strings.Builder
7198 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7199 androidMk := builder.String()
7200 // `myotherlib` is added to `myapex` as symlink
7201 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
7202 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7203 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7204 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09007205 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex:64 myotherlib:64 apex_manifest.pb.myapex apex_pubkey.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007206}
7207
Jooyung Han643adc42020-02-27 13:50:06 +09007208func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007209 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007210 apex {
7211 name: "myapex",
7212 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007213 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007214 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007215 }
7216
7217 apex_key {
7218 name: "myapex.key",
7219 public_key: "testkey.avbpubkey",
7220 private_key: "testkey.pem",
7221 }
7222
7223 cc_library {
7224 name: "mylib",
7225 srcs: ["mylib.cpp"],
7226 shared_libs: ["mylib2"],
7227 system_shared_libs: [],
7228 stl: "none",
7229 apex_available: [ "myapex" ],
7230 }
7231
7232 cc_library {
7233 name: "mylib2",
7234 srcs: ["mylib.cpp"],
7235 system_shared_libs: [],
7236 stl: "none",
7237 apex_available: [ "myapex" ],
7238 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007239
7240 rust_ffi_shared {
7241 name: "libfoo.rust",
7242 crate_name: "foo",
7243 srcs: ["foo.rs"],
7244 shared_libs: ["libfoo.shared_from_rust"],
7245 prefer_rlib: true,
7246 apex_available: ["myapex"],
7247 }
7248
7249 cc_library_shared {
7250 name: "libfoo.shared_from_rust",
7251 srcs: ["mylib.cpp"],
7252 system_shared_libs: [],
7253 stl: "none",
7254 stubs: {
7255 versions: ["10", "11", "12"],
7256 },
7257 }
7258
Jooyung Han643adc42020-02-27 13:50:06 +09007259 `)
7260
7261 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7262 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007263 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007264 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7265 "lib64/mylib.so",
7266 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007267 "lib64/libfoo.rust.so",
7268 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7269 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007270 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007271
7272 // b/220397949
7273 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007274}
7275
Jooyung Han49f67012020-04-17 13:43:10 +09007276func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007277 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007278 apex {
7279 name: "myapex",
7280 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007281 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007282 }
7283 apex_key {
7284 name: "myapex.key",
7285 public_key: "testkey.avbpubkey",
7286 private_key: "testkey.pem",
7287 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007288 `,
7289 android.FixtureModifyConfig(func(config android.Config) {
7290 delete(config.Targets, android.Android)
7291 config.AndroidCommonTarget = android.Target{}
7292 }),
7293 )
Jooyung Han49f67012020-04-17 13:43:10 +09007294
7295 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7296 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7297 }
7298}
7299
Jiyong Parkbd159612020-02-28 15:22:21 +09007300func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007301 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007302 apex {
7303 name: "myapex",
7304 key: "myapex.key",
7305 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007306 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007307 }
7308
7309 apex_key {
7310 name: "myapex.key",
7311 public_key: "testkey.avbpubkey",
7312 private_key: "testkey.pem",
7313 }
7314
7315 android_app {
7316 name: "AppFoo",
7317 srcs: ["foo/bar/MyClass.java"],
7318 sdk_version: "none",
7319 system_modules: "none",
7320 apex_available: [ "myapex" ],
7321 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007322 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007323
Colin Crosscf371cc2020-11-13 11:48:42 -08007324 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007325 content := bundleConfigRule.Args["content"]
7326
7327 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007328 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 +09007329}
7330
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007331func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007332 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007333 apex {
7334 name: "myapex",
7335 key: "myapex.key",
7336 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007337 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007338 }
7339
7340 apex_key {
7341 name: "myapex.key",
7342 public_key: "testkey.avbpubkey",
7343 private_key: "testkey.pem",
7344 }
7345
7346 android_app_set {
7347 name: "AppSet",
7348 set: "AppSet.apks",
7349 }`)
7350 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007351 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007352 content := bundleConfigRule.Args["content"]
7353 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7354 s := mod.Rule("apexRule").Args["copy_commands"]
7355 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007356 if len(copyCmds) != 4 {
7357 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007358 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007359 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7360 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007361 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7362 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007363
7364 // Ensure that canned_fs_config has an entry for the app set zip file
7365 generateFsRule := mod.Rule("generateFsConfig")
7366 cmd := generateFsRule.RuleParams.Command
7367 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007368}
7369
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007370func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007371 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007372 apex_set {
7373 name: "myapex",
7374 filename: "foo_v2.apex",
7375 sanitized: {
7376 none: { set: "myapex.apks", },
7377 hwaddress: { set: "myapex.hwasan.apks", },
7378 },
Paul Duffin24704672021-04-06 16:09:30 +01007379 }
7380 `
7381 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007382
Paul Duffin24704672021-04-06 16:09:30 +01007383 // Check that the extractor produces the correct output file from the correct input file.
7384 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007385
Paul Duffin24704672021-04-06 16:09:30 +01007386 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7387 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007388
Paul Duffin24704672021-04-06 16:09:30 +01007389 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7390
7391 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007392 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7393 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007394
7395 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007396}
7397
Pranav Guptaeba03b02022-09-27 00:27:08 +00007398func TestApexSetApksModuleAssignment(t *testing.T) {
7399 ctx := testApex(t, `
7400 apex_set {
7401 name: "myapex",
7402 set: ":myapex_apks_file",
7403 }
7404
7405 filegroup {
7406 name: "myapex_apks_file",
7407 srcs: ["myapex.apks"],
7408 }
7409 `)
7410
7411 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7412
7413 // Check that the extractor produces the correct apks file from the input module
7414 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7415 extractedApex := m.Output(extractorOutput)
7416
7417 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7418}
7419
Paul Duffin89f570a2021-06-16 01:42:33 +01007420func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007421 t.Helper()
7422
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007423 bp := `
7424 java_library {
7425 name: "some-updatable-apex-lib",
7426 srcs: ["a.java"],
7427 sdk_version: "current",
7428 apex_available: [
7429 "some-updatable-apex",
7430 ],
satayevabcd5972021-08-06 17:49:46 +01007431 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007432 }
7433
7434 java_library {
7435 name: "some-non-updatable-apex-lib",
7436 srcs: ["a.java"],
7437 apex_available: [
7438 "some-non-updatable-apex",
7439 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007440 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007441 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007442 }
7443
7444 bootclasspath_fragment {
7445 name: "some-non-updatable-fragment",
7446 contents: ["some-non-updatable-apex-lib"],
7447 apex_available: [
7448 "some-non-updatable-apex",
7449 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007450 hidden_api: {
7451 split_packages: ["*"],
7452 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007453 }
7454
7455 java_library {
7456 name: "some-platform-lib",
7457 srcs: ["a.java"],
7458 sdk_version: "current",
7459 installable: true,
7460 }
7461
7462 java_library {
7463 name: "some-art-lib",
7464 srcs: ["a.java"],
7465 sdk_version: "current",
7466 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007467 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007468 ],
7469 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007470 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007471 }
7472
7473 apex {
7474 name: "some-updatable-apex",
7475 key: "some-updatable-apex.key",
7476 java_libs: ["some-updatable-apex-lib"],
7477 updatable: true,
7478 min_sdk_version: "current",
7479 }
7480
7481 apex {
7482 name: "some-non-updatable-apex",
7483 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007484 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007485 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007486 }
7487
7488 apex_key {
7489 name: "some-updatable-apex.key",
7490 }
7491
7492 apex_key {
7493 name: "some-non-updatable-apex.key",
7494 }
7495
7496 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007497 name: "com.android.art.debug",
7498 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007499 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007500 updatable: true,
7501 min_sdk_version: "current",
7502 }
7503
Paul Duffinf23bc472021-04-27 12:42:20 +01007504 bootclasspath_fragment {
7505 name: "art-bootclasspath-fragment",
7506 image_name: "art",
7507 contents: ["some-art-lib"],
7508 apex_available: [
7509 "com.android.art.debug",
7510 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007511 hidden_api: {
7512 split_packages: ["*"],
7513 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007514 }
7515
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007516 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007517 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007518 }
7519
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007520 filegroup {
7521 name: "some-updatable-apex-file_contexts",
7522 srcs: [
7523 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7524 ],
7525 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007526
7527 filegroup {
7528 name: "some-non-updatable-apex-file_contexts",
7529 srcs: [
7530 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7531 ],
7532 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007533 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007534
Paul Duffin89f570a2021-06-16 01:42:33 +01007535 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007536}
7537
Paul Duffin89f570a2021-06-16 01:42:33 +01007538func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007539 t.Helper()
7540
Paul Duffin55607122021-03-30 23:32:51 +01007541 fs := android.MockFS{
7542 "a.java": nil,
7543 "a.jar": nil,
7544 "apex_manifest.json": nil,
7545 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007546 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007547 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7548 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7549 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007550 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007551 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007552
Paul Duffin55607122021-03-30 23:32:51 +01007553 errorHandler := android.FixtureExpectsNoErrors
7554 if errmsg != "" {
7555 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007556 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007557
Paul Duffin55607122021-03-30 23:32:51 +01007558 result := android.GroupFixturePreparers(
7559 cc.PrepareForTestWithCcDefaultModules,
7560 java.PrepareForTestWithHiddenApiBuildComponents,
7561 java.PrepareForTestWithJavaDefaultModules,
7562 java.PrepareForTestWithJavaSdkLibraryFiles,
7563 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007564 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007565 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007566 android.FixtureModifyMockFS(func(fs android.MockFS) {
7567 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7568 insert := ""
7569 for _, fragment := range fragments {
7570 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7571 }
7572 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7573 platform_bootclasspath {
7574 name: "platform-bootclasspath",
7575 fragments: [
7576 %s
7577 ],
7578 }
7579 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007580 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007581 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007582 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007583 ).
7584 ExtendWithErrorHandler(errorHandler).
7585 RunTestWithBp(t, bp)
7586
7587 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007588}
7589
Paul Duffin5556c5f2022-06-09 17:32:21 +00007590func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007591 preparers := android.GroupFixturePreparers(
7592 java.PrepareForTestWithJavaDefaultModules,
7593 PrepareForTestWithApexBuildComponents,
7594 ).
7595 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7596 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7597
7598 bpBase := `
7599 apex_set {
7600 name: "com.android.myapex",
7601 installable: true,
7602 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7603 set: "myapex.apks",
7604 }
7605
7606 apex_set {
7607 name: "com.mycompany.android.myapex",
7608 apex_name: "com.android.myapex",
7609 installable: true,
7610 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7611 set: "company-myapex.apks",
7612 }
7613
7614 prebuilt_bootclasspath_fragment {
7615 name: "my-bootclasspath-fragment",
7616 apex_available: ["com.android.myapex"],
7617 %s
7618 }
7619 `
7620
7621 t.Run("java_import", func(t *testing.T) {
7622 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7623 java_import {
7624 name: "libfoo",
7625 jars: ["libfoo.jar"],
7626 apex_available: ["com.android.myapex"],
7627 }
7628 `)
7629 })
7630
7631 t.Run("java_sdk_library_import", func(t *testing.T) {
7632 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7633 java_sdk_library_import {
7634 name: "libfoo",
7635 public: {
7636 jars: ["libbar.jar"],
7637 },
7638 apex_available: ["com.android.myapex"],
7639 }
7640 `)
7641 })
7642
7643 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7644 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7645 image_name: "art",
7646 contents: ["libfoo"],
7647 `)+`
7648 java_sdk_library_import {
7649 name: "libfoo",
7650 public: {
7651 jars: ["libbar.jar"],
7652 },
7653 apex_available: ["com.android.myapex"],
7654 }
7655 `)
7656 })
7657}
7658
Paul Duffin5556c5f2022-06-09 17:32:21 +00007659func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7660 preparers := android.GroupFixturePreparers(
7661 java.PrepareForTestWithJavaDefaultModules,
7662 PrepareForTestWithApexBuildComponents,
7663 )
7664
7665 bpBase := `
7666 apex_set {
7667 name: "com.android.myapex",
7668 installable: true,
7669 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7670 set: "myapex.apks",
7671 }
7672
7673 apex_set {
7674 name: "com.android.myapex_compressed",
7675 apex_name: "com.android.myapex",
7676 installable: true,
7677 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7678 set: "myapex_compressed.apks",
7679 }
7680
7681 prebuilt_bootclasspath_fragment {
7682 name: "my-bootclasspath-fragment",
7683 apex_available: [
7684 "com.android.myapex",
7685 "com.android.myapex_compressed",
7686 ],
7687 hidden_api: {
7688 annotation_flags: "annotation-flags.csv",
7689 metadata: "metadata.csv",
7690 index: "index.csv",
7691 signature_patterns: "signature_patterns.csv",
7692 },
7693 %s
7694 }
7695 `
7696
7697 t.Run("java_import", func(t *testing.T) {
7698 result := preparers.RunTestWithBp(t,
7699 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7700 java_import {
7701 name: "libfoo",
7702 jars: ["libfoo.jar"],
7703 apex_available: [
7704 "com.android.myapex",
7705 "com.android.myapex_compressed",
7706 ],
7707 }
7708 `)
7709
7710 module := result.Module("libfoo", "android_common_com.android.myapex")
7711 usesLibraryDep := module.(java.UsesLibraryDependency)
7712 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7713 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7714 usesLibraryDep.DexJarBuildPath().Path())
7715 })
7716
7717 t.Run("java_sdk_library_import", func(t *testing.T) {
7718 result := preparers.RunTestWithBp(t,
7719 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7720 java_sdk_library_import {
7721 name: "libfoo",
7722 public: {
7723 jars: ["libbar.jar"],
7724 },
7725 apex_available: [
7726 "com.android.myapex",
7727 "com.android.myapex_compressed",
7728 ],
7729 compile_dex: true,
7730 }
7731 `)
7732
7733 module := result.Module("libfoo", "android_common_com.android.myapex")
7734 usesLibraryDep := module.(java.UsesLibraryDependency)
7735 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7736 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7737 usesLibraryDep.DexJarBuildPath().Path())
7738 })
7739
7740 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7741 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7742 image_name: "art",
7743 contents: ["libfoo"],
7744 `)+`
7745 java_sdk_library_import {
7746 name: "libfoo",
7747 public: {
7748 jars: ["libbar.jar"],
7749 },
7750 apex_available: [
7751 "com.android.myapex",
7752 "com.android.myapex_compressed",
7753 ],
7754 compile_dex: true,
7755 }
7756 `)
7757 })
7758}
7759
Jooyung Han548640b2020-04-27 12:10:30 +09007760func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7761 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7762 apex {
7763 name: "myapex",
7764 key: "myapex.key",
7765 updatable: true,
7766 }
7767
7768 apex_key {
7769 name: "myapex.key",
7770 public_key: "testkey.avbpubkey",
7771 private_key: "testkey.pem",
7772 }
7773 `)
7774}
7775
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007776func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7777 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7778 apex {
7779 name: "myapex",
7780 key: "myapex.key",
7781 }
7782
7783 apex_key {
7784 name: "myapex.key",
7785 public_key: "testkey.avbpubkey",
7786 private_key: "testkey.pem",
7787 }
7788 `)
7789}
7790
Daniel Norman69109112021-12-02 12:52:42 -08007791func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7792 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7793 apex {
7794 name: "myapex",
7795 key: "myapex.key",
7796 updatable: true,
7797 soc_specific: true,
7798 }
7799
7800 apex_key {
7801 name: "myapex.key",
7802 public_key: "testkey.avbpubkey",
7803 private_key: "testkey.pem",
7804 }
7805 `)
7806}
7807
satayevb98371c2021-06-15 16:49:50 +01007808func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7809 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7810 apex {
7811 name: "myapex",
7812 key: "myapex.key",
7813 systemserverclasspath_fragments: [
7814 "mysystemserverclasspathfragment",
7815 ],
7816 min_sdk_version: "29",
7817 updatable: true,
7818 }
7819
7820 apex_key {
7821 name: "myapex.key",
7822 public_key: "testkey.avbpubkey",
7823 private_key: "testkey.pem",
7824 }
7825
7826 java_library {
7827 name: "foo",
7828 srcs: ["b.java"],
7829 min_sdk_version: "29",
7830 installable: true,
7831 apex_available: [
7832 "myapex",
7833 ],
7834 }
7835
7836 systemserverclasspath_fragment {
7837 name: "mysystemserverclasspathfragment",
7838 generate_classpaths_proto: false,
7839 contents: [
7840 "foo",
7841 ],
7842 apex_available: [
7843 "myapex",
7844 ],
7845 }
satayevabcd5972021-08-06 17:49:46 +01007846 `,
7847 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7848 )
satayevb98371c2021-06-15 16:49:50 +01007849}
7850
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007851func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007852 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7853 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7854 // modules to be included in the BootJars.
7855 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7856 return android.GroupFixturePreparers(
7857 dexpreopt.FixtureSetBootJars(bootJars...),
7858 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7859 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7860 }),
7861 )
7862 }
7863
7864 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7865 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7866 // specified in the ArtApexJars configuration.
7867 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7868 return android.GroupFixturePreparers(
7869 dexpreopt.FixtureSetArtBootJars(bootJars...),
7870 dexpreopt.FixtureSetBootJars(bootJars...),
7871 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7872 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7873 }),
7874 )
7875 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007876
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007877 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007878 preparer := android.GroupFixturePreparers(
7879 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7880 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7881 )
7882 fragments := []java.ApexVariantReference{
7883 {
7884 Apex: proptools.StringPtr("com.android.art.debug"),
7885 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7886 },
7887 {
7888 Apex: proptools.StringPtr("some-non-updatable-apex"),
7889 Module: proptools.StringPtr("some-non-updatable-fragment"),
7890 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007891 }
satayevabcd5972021-08-06 17:49:46 +01007892 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007893 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007894
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007895 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007896 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7897 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007898 preparer := android.GroupFixturePreparers(
7899 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7900 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7901 )
Paul Duffin60264a02021-04-12 20:02:36 +01007902 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007903 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007904
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007905 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 +01007906 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 +01007907 // Update the dexpreopt ArtApexJars directly.
7908 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7909 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007910 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007911
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007912 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007913 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 +01007914 // Update the dexpreopt ArtApexJars directly.
7915 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7916 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007917 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007918
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007919 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 +01007920 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 +01007921 preparer := android.GroupFixturePreparers(
7922 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7923 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7924 )
Paul Duffin60264a02021-04-12 20:02:36 +01007925 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007926 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007927
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007928 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 +01007929 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007930 fragment := java.ApexVariantReference{
7931 Apex: proptools.StringPtr("some-non-updatable-apex"),
7932 Module: proptools.StringPtr("some-non-updatable-fragment"),
7933 }
7934 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007935 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007936
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007937 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007938 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007939 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7940 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007941 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007942
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007943 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007944 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007945 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7946 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007947 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007948
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007949 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007950 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007951 // Update the dexpreopt ArtApexJars directly.
7952 preparer := prepareSetArtJars("platform:some-platform-lib")
7953 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007954 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007955
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007956 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007957 preparer := android.GroupFixturePreparers(
7958 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7959 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7960 )
7961 fragments := []java.ApexVariantReference{
7962 {
7963 Apex: proptools.StringPtr("some-non-updatable-apex"),
7964 Module: proptools.StringPtr("some-non-updatable-fragment"),
7965 },
7966 }
7967 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007968 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007969}
7970
7971func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007972 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007973 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007974 fragment := java.ApexVariantReference{
7975 Apex: proptools.StringPtr("myapex"),
7976 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7977 }
7978
Paul Duffin064b70c2020-11-02 17:32:38 +00007979 testDexpreoptWithApexes(t, `
7980 prebuilt_apex {
7981 name: "myapex" ,
7982 arch: {
7983 arm64: {
7984 src: "myapex-arm64.apex",
7985 },
7986 arm: {
7987 src: "myapex-arm.apex",
7988 },
7989 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007990 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7991 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007992
Paul Duffin89f570a2021-06-16 01:42:33 +01007993 prebuilt_bootclasspath_fragment {
7994 name: "my-bootclasspath-fragment",
7995 contents: ["libfoo"],
7996 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007997 hidden_api: {
7998 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7999 metadata: "my-bootclasspath-fragment/metadata.csv",
8000 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008001 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8002 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8003 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008004 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008005 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008006
Paul Duffin89f570a2021-06-16 01:42:33 +01008007 java_import {
8008 name: "libfoo",
8009 jars: ["libfoo.jar"],
8010 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008011 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008012 }
8013 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008014 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008015}
8016
Spandan Dasf14e2542021-11-12 00:01:37 +00008017func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008018 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008019 bp += `
8020 apex_key {
8021 name: "myapex.key",
8022 public_key: "testkey.avbpubkey",
8023 private_key: "testkey.pem",
8024 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008025 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008026 "lib1/src/A.java": nil,
8027 "lib2/src/B.java": nil,
8028 "system/sepolicy/apex/myapex-file_contexts": nil,
8029 }
8030
Paul Duffin45338f02021-03-30 23:07:52 +01008031 errorHandler := android.FixtureExpectsNoErrors
8032 if errmsg != "" {
8033 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008034 }
Colin Crossae8600b2020-10-29 17:09:13 -07008035
Paul Duffin45338f02021-03-30 23:07:52 +01008036 android.GroupFixturePreparers(
8037 android.PrepareForTestWithAndroidBuildComponents,
8038 java.PrepareForTestWithJavaBuildComponents,
8039 PrepareForTestWithApexBuildComponents,
8040 android.PrepareForTestWithNeverallowRules(rules),
8041 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008042 apexBootJars := make([]string, 0, len(bootJars))
8043 for _, apexBootJar := range bootJars {
8044 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008045 }
satayevd604b212021-07-21 14:23:52 +01008046 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008047 }),
8048 fs.AddToFixture(),
8049 ).
8050 ExtendWithErrorHandler(errorHandler).
8051 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008052}
8053
8054func TestApexPermittedPackagesRules(t *testing.T) {
8055 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008056 name string
8057 expectedError string
8058 bp string
8059 bootJars []string
8060 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008061 }{
8062
8063 {
8064 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8065 expectedError: "",
8066 bp: `
8067 java_library {
8068 name: "bcp_lib1",
8069 srcs: ["lib1/src/*.java"],
8070 permitted_packages: ["foo.bar"],
8071 apex_available: ["myapex"],
8072 sdk_version: "none",
8073 system_modules: "none",
8074 }
8075 java_library {
8076 name: "nonbcp_lib2",
8077 srcs: ["lib2/src/*.java"],
8078 apex_available: ["myapex"],
8079 permitted_packages: ["a.b"],
8080 sdk_version: "none",
8081 system_modules: "none",
8082 }
8083 apex {
8084 name: "myapex",
8085 key: "myapex.key",
8086 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008087 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008088 }`,
8089 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008090 bcpPermittedPackages: map[string][]string{
8091 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008092 "foo.bar",
8093 },
8094 },
8095 },
8096 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008097 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008098 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 +01008099 bp: `
8100 java_library {
8101 name: "bcp_lib1",
8102 srcs: ["lib1/src/*.java"],
8103 apex_available: ["myapex"],
8104 permitted_packages: ["foo.bar"],
8105 sdk_version: "none",
8106 system_modules: "none",
8107 }
8108 java_library {
8109 name: "bcp_lib2",
8110 srcs: ["lib2/src/*.java"],
8111 apex_available: ["myapex"],
8112 permitted_packages: ["foo.bar", "bar.baz"],
8113 sdk_version: "none",
8114 system_modules: "none",
8115 }
8116 apex {
8117 name: "myapex",
8118 key: "myapex.key",
8119 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008120 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008121 }
8122 `,
8123 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008124 bcpPermittedPackages: map[string][]string{
8125 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008126 "foo.bar",
8127 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008128 "bcp_lib2": []string{
8129 "foo.bar",
8130 },
8131 },
8132 },
8133 {
8134 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8135 expectedError: "",
8136 bp: `
8137 java_library {
8138 name: "bcp_lib_restricted",
8139 srcs: ["lib1/src/*.java"],
8140 apex_available: ["myapex"],
8141 permitted_packages: ["foo.bar"],
8142 sdk_version: "none",
8143 min_sdk_version: "29",
8144 system_modules: "none",
8145 }
8146 java_library {
8147 name: "bcp_lib_unrestricted",
8148 srcs: ["lib2/src/*.java"],
8149 apex_available: ["myapex"],
8150 permitted_packages: ["foo.bar", "bar.baz"],
8151 sdk_version: "none",
8152 min_sdk_version: "29",
8153 system_modules: "none",
8154 }
8155 apex {
8156 name: "myapex",
8157 key: "myapex.key",
8158 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8159 updatable: true,
8160 min_sdk_version: "29",
8161 }
8162 `,
8163 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8164 bcpPermittedPackages: map[string][]string{
8165 "bcp_lib1_non_updateable": []string{
8166 "foo.bar",
8167 },
8168 // 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 +01008169 },
8170 },
8171 }
8172 for _, tc := range testcases {
8173 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008174 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8175 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008176 })
8177 }
8178}
8179
Jiyong Park62304bb2020-04-13 16:19:48 +09008180func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008181 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008182 apex {
8183 name: "myapex",
8184 key: "myapex.key",
8185 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008186 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008187 }
8188
8189 apex_key {
8190 name: "myapex.key",
8191 public_key: "testkey.avbpubkey",
8192 private_key: "testkey.pem",
8193 }
8194
8195 cc_library {
8196 name: "mylib",
8197 srcs: ["mylib.cpp"],
8198 system_shared_libs: [],
8199 stl: "none",
8200 stubs: {
8201 versions: ["1"],
8202 },
8203 apex_available: ["myapex"],
8204 }
8205
8206 cc_library {
8207 name: "myprivlib",
8208 srcs: ["mylib.cpp"],
8209 system_shared_libs: [],
8210 stl: "none",
8211 apex_available: ["myapex"],
8212 }
8213
8214
8215 cc_test {
8216 name: "mytest",
8217 gtest: false,
8218 srcs: ["mylib.cpp"],
8219 system_shared_libs: [],
8220 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008221 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008222 test_for: ["myapex"]
8223 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008224
8225 cc_library {
8226 name: "mytestlib",
8227 srcs: ["mylib.cpp"],
8228 system_shared_libs: [],
8229 shared_libs: ["mylib", "myprivlib"],
8230 stl: "none",
8231 test_for: ["myapex"],
8232 }
8233
8234 cc_benchmark {
8235 name: "mybench",
8236 srcs: ["mylib.cpp"],
8237 system_shared_libs: [],
8238 shared_libs: ["mylib", "myprivlib"],
8239 stl: "none",
8240 test_for: ["myapex"],
8241 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008242 `)
8243
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008244 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008245 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008246 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8247 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8248 }
8249
8250 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008251 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008252 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8253 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8254 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8255}
Jiyong Park46a512f2020-12-04 18:02:13 +09008256
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008257func TestIndirectTestFor(t *testing.T) {
8258 ctx := testApex(t, `
8259 apex {
8260 name: "myapex",
8261 key: "myapex.key",
8262 native_shared_libs: ["mylib", "myprivlib"],
8263 updatable: false,
8264 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008265
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008266 apex_key {
8267 name: "myapex.key",
8268 public_key: "testkey.avbpubkey",
8269 private_key: "testkey.pem",
8270 }
8271
8272 cc_library {
8273 name: "mylib",
8274 srcs: ["mylib.cpp"],
8275 system_shared_libs: [],
8276 stl: "none",
8277 stubs: {
8278 versions: ["1"],
8279 },
8280 apex_available: ["myapex"],
8281 }
8282
8283 cc_library {
8284 name: "myprivlib",
8285 srcs: ["mylib.cpp"],
8286 system_shared_libs: [],
8287 stl: "none",
8288 shared_libs: ["mylib"],
8289 apex_available: ["myapex"],
8290 }
8291
8292 cc_library {
8293 name: "mytestlib",
8294 srcs: ["mylib.cpp"],
8295 system_shared_libs: [],
8296 shared_libs: ["myprivlib"],
8297 stl: "none",
8298 test_for: ["myapex"],
8299 }
8300 `)
8301
8302 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008303 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008304 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8305 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8306 }
8307
8308 // The platform variant of mytestlib links to the platform variant of the
8309 // internal myprivlib.
8310 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8311
8312 // The platform variant of myprivlib links to the platform variant of mylib
8313 // and bypasses its stubs.
8314 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 +09008315}
8316
Martin Stjernholmec009002021-03-27 15:18:31 +00008317func TestTestForForLibInOtherApex(t *testing.T) {
8318 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8319 _ = testApex(t, `
8320 apex {
8321 name: "com.android.art",
8322 key: "myapex.key",
8323 native_shared_libs: ["mylib"],
8324 updatable: false,
8325 }
8326
8327 apex {
8328 name: "com.android.art.debug",
8329 key: "myapex.key",
8330 native_shared_libs: ["mylib", "mytestlib"],
8331 updatable: false,
8332 }
8333
8334 apex_key {
8335 name: "myapex.key",
8336 public_key: "testkey.avbpubkey",
8337 private_key: "testkey.pem",
8338 }
8339
8340 cc_library {
8341 name: "mylib",
8342 srcs: ["mylib.cpp"],
8343 system_shared_libs: [],
8344 stl: "none",
8345 stubs: {
8346 versions: ["1"],
8347 },
8348 apex_available: ["com.android.art", "com.android.art.debug"],
8349 }
8350
8351 cc_library {
8352 name: "mytestlib",
8353 srcs: ["mylib.cpp"],
8354 system_shared_libs: [],
8355 shared_libs: ["mylib"],
8356 stl: "none",
8357 apex_available: ["com.android.art.debug"],
8358 test_for: ["com.android.art"],
8359 }
8360 `,
8361 android.MockFS{
8362 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8363 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8364 }.AddToFixture())
8365}
8366
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008367// TODO(jungjw): Move this to proptools
8368func intPtr(i int) *int {
8369 return &i
8370}
8371
8372func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008373 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008374 apex_set {
8375 name: "myapex",
8376 set: "myapex.apks",
8377 filename: "foo_v2.apex",
8378 overrides: ["foo"],
8379 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008380 `,
8381 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8382 variables.Platform_sdk_version = intPtr(30)
8383 }),
8384 android.FixtureModifyConfig(func(config android.Config) {
8385 config.Targets[android.Android] = []android.Target{
8386 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8387 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8388 }
8389 }),
8390 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008391
Paul Duffin24704672021-04-06 16:09:30 +01008392 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008393
8394 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008395 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008396 actual := extractedApex.Args["abis"]
8397 expected := "ARMEABI_V7A,ARM64_V8A"
8398 if actual != expected {
8399 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8400 }
8401 actual = extractedApex.Args["sdk-version"]
8402 expected = "30"
8403 if actual != expected {
8404 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8405 }
8406
Paul Duffin6717d882021-06-15 19:09:41 +01008407 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008408 a := m.Module().(*ApexSet)
8409 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008410 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008411 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8412 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8413 }
8414}
8415
Jiyong Park7d95a512020-05-10 15:16:24 +09008416func TestNoStaticLinkingToStubsLib(t *testing.T) {
8417 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8418 apex {
8419 name: "myapex",
8420 key: "myapex.key",
8421 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008422 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008423 }
8424
8425 apex_key {
8426 name: "myapex.key",
8427 public_key: "testkey.avbpubkey",
8428 private_key: "testkey.pem",
8429 }
8430
8431 cc_library {
8432 name: "mylib",
8433 srcs: ["mylib.cpp"],
8434 static_libs: ["otherlib"],
8435 system_shared_libs: [],
8436 stl: "none",
8437 apex_available: [ "myapex" ],
8438 }
8439
8440 cc_library {
8441 name: "otherlib",
8442 srcs: ["mylib.cpp"],
8443 system_shared_libs: [],
8444 stl: "none",
8445 stubs: {
8446 versions: ["1", "2", "3"],
8447 },
8448 apex_available: [ "myapex" ],
8449 }
8450 `)
8451}
8452
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008453func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008454 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008455 apex {
8456 name: "myapex",
8457 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008458 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008459 custom_sign_tool: "sign_myapex",
8460 }
8461
8462 apex_key {
8463 name: "myapex.key",
8464 public_key: "testkey.avbpubkey",
8465 private_key: "testkey.pem",
8466 }
8467 `)
8468
8469 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8470 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8471 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"`)
8472}
8473
8474func TestApexKeysTxtOverrides(t *testing.T) {
8475 ctx := testApex(t, `
8476 apex {
8477 name: "myapex",
8478 key: "myapex.key",
8479 updatable: false,
8480 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008481 }
8482
8483 apex_key {
8484 name: "myapex.key",
8485 public_key: "testkey.avbpubkey",
8486 private_key: "testkey.pem",
8487 }
8488
8489 prebuilt_apex {
8490 name: "myapex",
8491 prefer: true,
8492 arch: {
8493 arm64: {
8494 src: "myapex-arm64.apex",
8495 },
8496 arm: {
8497 src: "myapex-arm.apex",
8498 },
8499 },
8500 }
8501
8502 apex_set {
8503 name: "myapex_set",
8504 set: "myapex.apks",
8505 filename: "myapex_set.apex",
8506 overrides: ["myapex"],
8507 }
8508 `)
8509
8510 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8511 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8512 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 +09008513 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 +09008514}
8515
Jooyung Han938b5932020-06-20 12:47:47 +09008516func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008517 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008518 apex {
8519 name: "myapex",
8520 key: "myapex.key",
8521 apps: ["app"],
8522 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008523 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008524 }
8525
8526 apex_key {
8527 name: "myapex.key",
8528 public_key: "testkey.avbpubkey",
8529 private_key: "testkey.pem",
8530 }
8531
8532 android_app {
8533 name: "app",
8534 srcs: ["foo/bar/MyClass.java"],
8535 package_name: "foo",
8536 sdk_version: "none",
8537 system_modules: "none",
8538 apex_available: [ "myapex" ],
8539 }
8540 `, withFiles(map[string][]byte{
8541 "sub/Android.bp": []byte(`
8542 override_apex {
8543 name: "override_myapex",
8544 base: "myapex",
8545 apps: ["override_app"],
8546 allowed_files: ":allowed",
8547 }
8548 // Overridable "path" property should be referenced indirectly
8549 filegroup {
8550 name: "allowed",
8551 srcs: ["allowed.txt"],
8552 }
8553 override_android_app {
8554 name: "override_app",
8555 base: "app",
8556 package_name: "bar",
8557 }
8558 `),
8559 }))
8560
8561 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8562 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8563 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8564 }
8565
8566 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8567 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8568 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8569 }
8570}
8571
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008572func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008573 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008574 apex {
8575 name: "myapex",
8576 key: "myapex.key",
8577 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008578 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008579 }
8580
8581 apex_key {
8582 name: "myapex.key",
8583 public_key: "testkey.avbpubkey",
8584 private_key: "testkey.pem",
8585 }
8586
8587 cc_library {
8588 name: "mylib",
8589 srcs: ["mylib.cpp"],
8590 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008591 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008592 },
8593 apex_available: ["myapex"],
8594 }
8595
8596 cc_prebuilt_library_shared {
8597 name: "mylib",
8598 prefer: false,
8599 srcs: ["prebuilt.so"],
8600 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008601 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008602 },
8603 apex_available: ["myapex"],
8604 }
8605 `)
8606}
8607
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008608func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008609 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008610 apex {
8611 name: "myapex",
8612 key: "myapex.key",
8613 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008614 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008615 }
8616 apex_key {
8617 name: "myapex.key",
8618 public_key: "testkey.avbpubkey",
8619 private_key: "testkey.pem",
8620 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008621 `,
8622 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8623 variables.CompressedApex = proptools.BoolPtr(true)
8624 }),
8625 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008626
8627 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8628 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8629
8630 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8631 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8632
8633 // Make sure output of bundle is .capex
8634 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8635 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8636
8637 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008638 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008639 var builder strings.Builder
8640 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8641 androidMk := builder.String()
8642 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8643}
8644
Martin Stjernholm2856c662020-12-02 15:03:42 +00008645func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008646 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008647 apex {
8648 name: "myapex",
8649 key: "myapex.key",
8650 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008651 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008652 }
8653
8654 apex_key {
8655 name: "myapex.key",
8656 public_key: "testkey.avbpubkey",
8657 private_key: "testkey.pem",
8658 }
8659
8660 cc_library {
8661 name: "mylib",
8662 srcs: ["mylib.cpp"],
8663 apex_available: ["myapex"],
8664 shared_libs: ["otherlib"],
8665 system_shared_libs: [],
8666 }
8667
8668 cc_library {
8669 name: "otherlib",
8670 srcs: ["mylib.cpp"],
8671 stubs: {
8672 versions: ["current"],
8673 },
8674 }
8675
8676 cc_prebuilt_library_shared {
8677 name: "otherlib",
8678 prefer: true,
8679 srcs: ["prebuilt.so"],
8680 stubs: {
8681 versions: ["current"],
8682 },
8683 }
8684 `)
8685
8686 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008687 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008688 var builder strings.Builder
8689 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8690 androidMk := builder.String()
8691
8692 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8693 // a thing there.
8694 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8695}
8696
Jiyong Parke3867542020-12-03 17:28:25 +09008697func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008698 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008699 apex {
8700 name: "myapex",
8701 key: "myapex.key",
8702 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008703 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008704 }
8705
8706 apex_key {
8707 name: "myapex.key",
8708 public_key: "testkey.avbpubkey",
8709 private_key: "testkey.pem",
8710 }
8711
8712 cc_library {
8713 name: "mylib",
8714 srcs: ["mylib.cpp"],
8715 system_shared_libs: [],
8716 stl: "none",
8717 apex_available: ["myapex"],
8718 shared_libs: ["mylib2"],
8719 target: {
8720 apex: {
8721 exclude_shared_libs: ["mylib2"],
8722 },
8723 },
8724 }
8725
8726 cc_library {
8727 name: "mylib2",
8728 srcs: ["mylib.cpp"],
8729 system_shared_libs: [],
8730 stl: "none",
8731 }
8732 `)
8733
8734 // Check if mylib is linked to mylib2 for the non-apex target
8735 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8736 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8737
8738 // Make sure that the link doesn't occur for the apex target
8739 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8740 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8741
8742 // It shouldn't appear in the copy cmd as well.
8743 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8744 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8745}
8746
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008747func TestPrebuiltStubLibDep(t *testing.T) {
8748 bpBase := `
8749 apex {
8750 name: "myapex",
8751 key: "myapex.key",
8752 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008753 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008754 }
8755 apex_key {
8756 name: "myapex.key",
8757 public_key: "testkey.avbpubkey",
8758 private_key: "testkey.pem",
8759 }
8760 cc_library {
8761 name: "mylib",
8762 srcs: ["mylib.cpp"],
8763 apex_available: ["myapex"],
8764 shared_libs: ["stublib"],
8765 system_shared_libs: [],
8766 }
8767 apex {
8768 name: "otherapex",
8769 enabled: %s,
8770 key: "myapex.key",
8771 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008772 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008773 }
8774 `
8775
8776 stublibSourceBp := `
8777 cc_library {
8778 name: "stublib",
8779 srcs: ["mylib.cpp"],
8780 apex_available: ["otherapex"],
8781 system_shared_libs: [],
8782 stl: "none",
8783 stubs: {
8784 versions: ["1"],
8785 },
8786 }
8787 `
8788
8789 stublibPrebuiltBp := `
8790 cc_prebuilt_library_shared {
8791 name: "stublib",
8792 srcs: ["prebuilt.so"],
8793 apex_available: ["otherapex"],
8794 stubs: {
8795 versions: ["1"],
8796 },
8797 %s
8798 }
8799 `
8800
8801 tests := []struct {
8802 name string
8803 stublibBp string
8804 usePrebuilt bool
8805 modNames []string // Modules to collect AndroidMkEntries for
8806 otherApexEnabled []string
8807 }{
8808 {
8809 name: "only_source",
8810 stublibBp: stublibSourceBp,
8811 usePrebuilt: false,
8812 modNames: []string{"stublib"},
8813 otherApexEnabled: []string{"true", "false"},
8814 },
8815 {
8816 name: "source_preferred",
8817 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8818 usePrebuilt: false,
8819 modNames: []string{"stublib", "prebuilt_stublib"},
8820 otherApexEnabled: []string{"true", "false"},
8821 },
8822 {
8823 name: "prebuilt_preferred",
8824 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8825 usePrebuilt: true,
8826 modNames: []string{"stublib", "prebuilt_stublib"},
8827 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8828 },
8829 {
8830 name: "only_prebuilt",
8831 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8832 usePrebuilt: true,
8833 modNames: []string{"stublib"},
8834 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8835 },
8836 }
8837
8838 for _, test := range tests {
8839 t.Run(test.name, func(t *testing.T) {
8840 for _, otherApexEnabled := range test.otherApexEnabled {
8841 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008842 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008843
8844 type modAndMkEntries struct {
8845 mod *cc.Module
8846 mkEntries android.AndroidMkEntries
8847 }
8848 entries := []*modAndMkEntries{}
8849
8850 // Gather shared lib modules that are installable
8851 for _, modName := range test.modNames {
8852 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8853 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8854 continue
8855 }
8856 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008857 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008858 continue
8859 }
Colin Crossaa255532020-07-03 13:18:24 -07008860 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008861 if ent.Disabled {
8862 continue
8863 }
8864 entries = append(entries, &modAndMkEntries{
8865 mod: mod,
8866 mkEntries: ent,
8867 })
8868 }
8869 }
8870 }
8871
8872 var entry *modAndMkEntries = nil
8873 for _, ent := range entries {
8874 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8875 if entry != nil {
8876 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8877 } else {
8878 entry = ent
8879 }
8880 }
8881 }
8882
8883 if entry == nil {
8884 t.Errorf("AndroidMk entry for \"stublib\" missing")
8885 } else {
8886 isPrebuilt := entry.mod.Prebuilt() != nil
8887 if isPrebuilt != test.usePrebuilt {
8888 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8889 }
8890 if !entry.mod.IsStubs() {
8891 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8892 }
8893 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8894 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8895 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008896 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008897 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008898 if !android.InList(expected, cflags) {
8899 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8900 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008901 }
8902 })
8903 }
8904 })
8905 }
8906}
8907
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008908func TestHostApexInHostOnlyBuild(t *testing.T) {
8909 testApex(t, `
8910 apex {
8911 name: "myapex",
8912 host_supported: true,
8913 key: "myapex.key",
8914 updatable: false,
8915 payload_type: "zip",
8916 }
8917 apex_key {
8918 name: "myapex.key",
8919 public_key: "testkey.avbpubkey",
8920 private_key: "testkey.pem",
8921 }
8922 `,
8923 android.FixtureModifyConfig(func(config android.Config) {
8924 // We may not have device targets in all builds, e.g. in
8925 // prebuilts/build-tools/build-prebuilts.sh
8926 config.Targets[android.Android] = []android.Target{}
8927 }))
8928}
8929
Colin Crossc33e5212021-05-25 18:16:02 -07008930func TestApexJavaCoverage(t *testing.T) {
8931 bp := `
8932 apex {
8933 name: "myapex",
8934 key: "myapex.key",
8935 java_libs: ["mylib"],
8936 bootclasspath_fragments: ["mybootclasspathfragment"],
8937 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8938 updatable: false,
8939 }
8940
8941 apex_key {
8942 name: "myapex.key",
8943 public_key: "testkey.avbpubkey",
8944 private_key: "testkey.pem",
8945 }
8946
8947 java_library {
8948 name: "mylib",
8949 srcs: ["mylib.java"],
8950 apex_available: ["myapex"],
8951 compile_dex: true,
8952 }
8953
8954 bootclasspath_fragment {
8955 name: "mybootclasspathfragment",
8956 contents: ["mybootclasspathlib"],
8957 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01008958 hidden_api: {
8959 split_packages: ["*"],
8960 },
Colin Crossc33e5212021-05-25 18:16:02 -07008961 }
8962
8963 java_library {
8964 name: "mybootclasspathlib",
8965 srcs: ["mybootclasspathlib.java"],
8966 apex_available: ["myapex"],
8967 compile_dex: true,
8968 }
8969
8970 systemserverclasspath_fragment {
8971 name: "mysystemserverclasspathfragment",
8972 contents: ["mysystemserverclasspathlib"],
8973 apex_available: ["myapex"],
8974 }
8975
8976 java_library {
8977 name: "mysystemserverclasspathlib",
8978 srcs: ["mysystemserverclasspathlib.java"],
8979 apex_available: ["myapex"],
8980 compile_dex: true,
8981 }
8982 `
8983
8984 result := android.GroupFixturePreparers(
8985 PrepareForTestWithApexBuildComponents,
8986 prepareForTestWithMyapex,
8987 java.PrepareForTestWithJavaDefaultModules,
8988 android.PrepareForTestWithAndroidBuildComponents,
8989 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008990 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8991 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04008992 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07008993 ).RunTest(t)
8994
8995 // Make sure jacoco ran on both mylib and mybootclasspathlib
8996 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8997 t.Errorf("Failed to find jacoco rule for mylib")
8998 }
8999 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9000 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9001 }
9002 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9003 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9004 }
9005}
9006
Jiyong Park192600a2021-08-03 07:52:17 +00009007func TestProhibitStaticExecutable(t *testing.T) {
9008 testApexError(t, `executable mybin is static`, `
9009 apex {
9010 name: "myapex",
9011 key: "myapex.key",
9012 binaries: ["mybin"],
9013 min_sdk_version: "29",
9014 }
9015
9016 apex_key {
9017 name: "myapex.key",
9018 public_key: "testkey.avbpubkey",
9019 private_key: "testkey.pem",
9020 }
9021
9022 cc_binary {
9023 name: "mybin",
9024 srcs: ["mylib.cpp"],
9025 relative_install_path: "foo/bar",
9026 static_executable: true,
9027 system_shared_libs: [],
9028 stl: "none",
9029 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009030 min_sdk_version: "29",
9031 }
9032 `)
9033
9034 testApexError(t, `executable mybin.rust is static`, `
9035 apex {
9036 name: "myapex",
9037 key: "myapex.key",
9038 binaries: ["mybin.rust"],
9039 min_sdk_version: "29",
9040 }
9041
9042 apex_key {
9043 name: "myapex.key",
9044 public_key: "testkey.avbpubkey",
9045 private_key: "testkey.pem",
9046 }
9047
9048 rust_binary {
9049 name: "mybin.rust",
9050 srcs: ["foo.rs"],
9051 static_executable: true,
9052 apex_available: ["myapex"],
9053 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009054 }
9055 `)
9056}
9057
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009058func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9059 ctx := testApex(t, `
9060 apex {
9061 name: "myapex",
9062 key: "myapex.key",
9063 updatable: false,
9064 java_libs: ["foo"],
9065 }
9066
9067 apex_key {
9068 name: "myapex.key",
9069 public_key: "testkey.avbpubkey",
9070 private_key: "testkey.pem",
9071 }
9072
9073 java_library {
9074 name: "foo",
9075 srcs: ["foo.java"],
9076 apex_available: ["myapex"],
9077 installable: true,
9078 }
9079 `,
9080 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9081 )
9082
9083 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9084 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9085 var builder strings.Builder
9086 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9087 androidMk := builder.String()
9088 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")
9089}
9090
9091func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9092 ctx := testApex(t, `
9093 prebuilt_apex {
9094 name: "myapex",
9095 arch: {
9096 arm64: {
9097 src: "myapex-arm64.apex",
9098 },
9099 arm: {
9100 src: "myapex-arm.apex",
9101 },
9102 },
9103 exported_java_libs: ["foo"],
9104 }
9105
9106 java_import {
9107 name: "foo",
9108 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009109 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009110 }
9111 `,
9112 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9113 )
9114
9115 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9116 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9117 mainModuleEntries := entriesList[0]
9118 android.AssertArrayString(t,
9119 "LOCAL_REQUIRED_MODULES",
9120 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9121 []string{
9122 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9123 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9124 })
9125}
9126
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009127func TestAndroidMk_RequiredModules(t *testing.T) {
9128 ctx := testApex(t, `
9129 apex {
9130 name: "myapex",
9131 key: "myapex.key",
9132 updatable: false,
9133 java_libs: ["foo"],
9134 required: ["otherapex"],
9135 }
9136
9137 apex {
9138 name: "otherapex",
9139 key: "myapex.key",
9140 updatable: false,
9141 java_libs: ["foo"],
9142 required: ["otherapex"],
9143 }
9144
9145 apex_key {
9146 name: "myapex.key",
9147 public_key: "testkey.avbpubkey",
9148 private_key: "testkey.pem",
9149 }
9150
9151 java_library {
9152 name: "foo",
9153 srcs: ["foo.java"],
9154 apex_available: ["myapex", "otherapex"],
9155 installable: true,
9156 }
9157 `)
9158
9159 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9160 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9161 var builder strings.Builder
9162 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9163 androidMk := builder.String()
9164 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
9165}
9166
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009167func TestAndroidMk_RequiredDeps(t *testing.T) {
9168 ctx := testApex(t, `
9169 apex {
9170 name: "myapex",
9171 key: "myapex.key",
9172 updatable: false,
9173 }
9174
9175 apex_key {
9176 name: "myapex.key",
9177 public_key: "testkey.avbpubkey",
9178 private_key: "testkey.pem",
9179 }
9180 `)
9181
9182 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9183 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9184 data := android.AndroidMkDataForTest(t, ctx, bundle)
9185 var builder strings.Builder
9186 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9187 androidMk := builder.String()
9188 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
9189
9190 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9191 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9192 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9193 var flattenedBuilder strings.Builder
9194 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9195 flattenedAndroidMk := flattenedBuilder.String()
9196 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
9197}
9198
Jooyung Hana6d36672022-02-24 13:58:07 +09009199func TestApexOutputFileProducer(t *testing.T) {
9200 for _, tc := range []struct {
9201 name string
9202 ref string
9203 expected_data []string
9204 }{
9205 {
9206 name: "test_using_output",
9207 ref: ":myapex",
9208 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9209 },
9210 {
9211 name: "test_using_apex",
9212 ref: ":myapex{.apex}",
9213 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9214 },
9215 } {
9216 t.Run(tc.name, func(t *testing.T) {
9217 ctx := testApex(t, `
9218 apex {
9219 name: "myapex",
9220 key: "myapex.key",
9221 compressible: true,
9222 updatable: false,
9223 }
9224
9225 apex_key {
9226 name: "myapex.key",
9227 public_key: "testkey.avbpubkey",
9228 private_key: "testkey.pem",
9229 }
9230
9231 java_test {
9232 name: "`+tc.name+`",
9233 srcs: ["a.java"],
9234 data: ["`+tc.ref+`"],
9235 }
9236 `,
9237 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9238 variables.CompressedApex = proptools.BoolPtr(true)
9239 }))
9240 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9241 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9242 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9243 })
9244 }
9245}
9246
satayev758968a2021-12-06 11:42:40 +00009247func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9248 preparer := android.GroupFixturePreparers(
9249 PrepareForTestWithApexBuildComponents,
9250 prepareForTestWithMyapex,
9251 java.PrepareForTestWithJavaSdkLibraryFiles,
9252 java.PrepareForTestWithJavaDefaultModules,
9253 android.PrepareForTestWithAndroidBuildComponents,
9254 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9255 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9256 )
9257
9258 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9259 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9260 preparer.RunTestWithBp(t, `
9261 apex {
9262 name: "myapex",
9263 key: "myapex.key",
9264 bootclasspath_fragments: ["mybootclasspathfragment"],
9265 min_sdk_version: "30",
9266 updatable: false,
9267 }
9268
9269 apex_key {
9270 name: "myapex.key",
9271 public_key: "testkey.avbpubkey",
9272 private_key: "testkey.pem",
9273 }
9274
9275 bootclasspath_fragment {
9276 name: "mybootclasspathfragment",
9277 contents: ["mybootclasspathlib"],
9278 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009279 hidden_api: {
9280 split_packages: ["*"],
9281 },
satayev758968a2021-12-06 11:42:40 +00009282 }
9283
9284 java_sdk_library {
9285 name: "mybootclasspathlib",
9286 srcs: ["mybootclasspathlib.java"],
9287 apex_available: ["myapex"],
9288 compile_dex: true,
9289 unsafe_ignore_missing_latest_api: true,
9290 min_sdk_version: "31",
9291 static_libs: ["util"],
9292 }
9293
9294 java_library {
9295 name: "util",
9296 srcs: ["a.java"],
9297 apex_available: ["myapex"],
9298 min_sdk_version: "31",
9299 static_libs: ["another_util"],
9300 }
9301
9302 java_library {
9303 name: "another_util",
9304 srcs: ["a.java"],
9305 min_sdk_version: "31",
9306 apex_available: ["myapex"],
9307 }
9308 `)
9309 })
9310
9311 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9312 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9313 preparer.RunTestWithBp(t, `
9314 apex {
9315 name: "myapex",
9316 key: "myapex.key",
9317 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9318 min_sdk_version: "30",
9319 updatable: false,
9320 }
9321
9322 apex_key {
9323 name: "myapex.key",
9324 public_key: "testkey.avbpubkey",
9325 private_key: "testkey.pem",
9326 }
9327
9328 systemserverclasspath_fragment {
9329 name: "mysystemserverclasspathfragment",
9330 contents: ["mysystemserverclasspathlib"],
9331 apex_available: ["myapex"],
9332 }
9333
9334 java_sdk_library {
9335 name: "mysystemserverclasspathlib",
9336 srcs: ["mysystemserverclasspathlib.java"],
9337 apex_available: ["myapex"],
9338 compile_dex: true,
9339 min_sdk_version: "32",
9340 unsafe_ignore_missing_latest_api: true,
9341 static_libs: ["util"],
9342 }
9343
9344 java_library {
9345 name: "util",
9346 srcs: ["a.java"],
9347 apex_available: ["myapex"],
9348 min_sdk_version: "31",
9349 static_libs: ["another_util"],
9350 }
9351
9352 java_library {
9353 name: "another_util",
9354 srcs: ["a.java"],
9355 min_sdk_version: "31",
9356 apex_available: ["myapex"],
9357 }
9358 `)
9359 })
9360
9361 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9362 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9363 RunTestWithBp(t, `
9364 apex {
9365 name: "myapex",
9366 key: "myapex.key",
9367 bootclasspath_fragments: ["mybootclasspathfragment"],
9368 min_sdk_version: "30",
9369 updatable: false,
9370 }
9371
9372 apex_key {
9373 name: "myapex.key",
9374 public_key: "testkey.avbpubkey",
9375 private_key: "testkey.pem",
9376 }
9377
9378 bootclasspath_fragment {
9379 name: "mybootclasspathfragment",
9380 contents: ["mybootclasspathlib"],
9381 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009382 hidden_api: {
9383 split_packages: ["*"],
9384 },
satayev758968a2021-12-06 11:42:40 +00009385 }
9386
9387 java_sdk_library {
9388 name: "mybootclasspathlib",
9389 srcs: ["mybootclasspathlib.java"],
9390 apex_available: ["myapex"],
9391 compile_dex: true,
9392 unsafe_ignore_missing_latest_api: true,
9393 }
9394 `)
9395 })
9396
9397 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9398 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9399 RunTestWithBp(t, `
9400 apex {
9401 name: "myapex",
9402 key: "myapex.key",
9403 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9404 min_sdk_version: "30",
9405 updatable: false,
9406 }
9407
9408 apex_key {
9409 name: "myapex.key",
9410 public_key: "testkey.avbpubkey",
9411 private_key: "testkey.pem",
9412 }
9413
9414 systemserverclasspath_fragment {
9415 name: "mysystemserverclasspathfragment",
9416 contents: ["mysystemserverclasspathlib"],
9417 apex_available: ["myapex"],
9418 }
9419
9420 java_sdk_library {
9421 name: "mysystemserverclasspathlib",
9422 srcs: ["mysystemserverclasspathlib.java"],
9423 apex_available: ["myapex"],
9424 compile_dex: true,
9425 unsafe_ignore_missing_latest_api: true,
9426 }
9427 `)
9428 })
9429}
9430
Jiakai Zhang6decef92022-01-12 17:56:19 +00009431// Verifies that the APEX depends on all the Make modules in the list.
9432func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9433 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9434 for _, dep := range deps {
9435 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9436 }
9437}
9438
9439// Verifies that the APEX does not depend on any of the Make modules in the list.
9440func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9441 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9442 for _, dep := range deps {
9443 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9444 }
9445}
9446
Spandan Das66773252022-01-15 00:23:18 +00009447func TestApexStrictUpdtabilityLint(t *testing.T) {
9448 bpTemplate := `
9449 apex {
9450 name: "myapex",
9451 key: "myapex.key",
9452 java_libs: ["myjavalib"],
9453 updatable: %v,
9454 min_sdk_version: "29",
9455 }
9456 apex_key {
9457 name: "myapex.key",
9458 }
9459 java_library {
9460 name: "myjavalib",
9461 srcs: ["MyClass.java"],
9462 apex_available: [ "myapex" ],
9463 lint: {
9464 strict_updatability_linting: %v,
9465 },
9466 sdk_version: "current",
9467 min_sdk_version: "29",
9468 }
9469 `
9470 fs := android.MockFS{
9471 "lint-baseline.xml": nil,
9472 }
9473
9474 testCases := []struct {
9475 testCaseName string
9476 apexUpdatable bool
9477 javaStrictUpdtabilityLint bool
9478 lintFileExists bool
9479 disallowedFlagExpected bool
9480 }{
9481 {
9482 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9483 apexUpdatable: true,
9484 javaStrictUpdtabilityLint: true,
9485 lintFileExists: false,
9486 disallowedFlagExpected: false,
9487 },
9488 {
9489 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9490 apexUpdatable: false,
9491 javaStrictUpdtabilityLint: false,
9492 lintFileExists: true,
9493 disallowedFlagExpected: false,
9494 },
9495 {
9496 testCaseName: "non-updatable apex respects strict updatability of javalib",
9497 apexUpdatable: false,
9498 javaStrictUpdtabilityLint: true,
9499 lintFileExists: true,
9500 disallowedFlagExpected: true,
9501 },
9502 {
9503 testCaseName: "updatable apex sets strict updatability of javalib to true",
9504 apexUpdatable: true,
9505 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9506 lintFileExists: true,
9507 disallowedFlagExpected: true,
9508 },
9509 }
9510
9511 for _, testCase := range testCases {
9512 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9513 fixtures := []android.FixturePreparer{}
9514 if testCase.lintFileExists {
9515 fixtures = append(fixtures, fs.AddToFixture())
9516 }
9517
9518 result := testApex(t, bp, fixtures...)
9519 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9520 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9521 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9522
9523 if disallowedFlagActual != testCase.disallowedFlagExpected {
9524 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9525 }
9526 }
9527}
9528
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009529func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9530 bp := `
9531 apex {
9532 name: "myapex",
9533 key: "myapex.key",
9534 java_libs: ["myjavalib"],
9535 updatable: true,
9536 min_sdk_version: "29",
9537 }
9538 apex_key {
9539 name: "myapex.key",
9540 }
9541 java_library {
9542 name: "myjavalib",
9543 srcs: ["MyClass.java"],
9544 apex_available: [ "myapex" ],
9545 sdk_version: "current",
9546 min_sdk_version: "29",
9547 }
9548 `
9549
9550 testCases := []struct {
9551 testCaseName string
9552 moduleDirectory string
9553 disallowedFlagExpected bool
9554 }{
9555 {
9556 testCaseName: "lintable module defined outside libcore",
9557 moduleDirectory: "",
9558 disallowedFlagExpected: true,
9559 },
9560 {
9561 testCaseName: "lintable module defined in libcore root directory",
9562 moduleDirectory: "libcore/",
9563 disallowedFlagExpected: false,
9564 },
9565 {
9566 testCaseName: "lintable module defined in libcore child directory",
9567 moduleDirectory: "libcore/childdir/",
9568 disallowedFlagExpected: true,
9569 },
9570 }
9571
9572 for _, testCase := range testCases {
9573 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9574 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9575 result := testApex(t, "", lintFileCreator, bpFileCreator)
9576 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9577 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9578 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9579 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9580
9581 if disallowedFlagActual != testCase.disallowedFlagExpected {
9582 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9583 }
9584 }
9585}
9586
Spandan Das66773252022-01-15 00:23:18 +00009587// checks transtive deps of an apex coming from bootclasspath_fragment
9588func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9589 bp := `
9590 apex {
9591 name: "myapex",
9592 key: "myapex.key",
9593 bootclasspath_fragments: ["mybootclasspathfragment"],
9594 updatable: true,
9595 min_sdk_version: "29",
9596 }
9597 apex_key {
9598 name: "myapex.key",
9599 }
9600 bootclasspath_fragment {
9601 name: "mybootclasspathfragment",
9602 contents: ["myjavalib"],
9603 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009604 hidden_api: {
9605 split_packages: ["*"],
9606 },
Spandan Das66773252022-01-15 00:23:18 +00009607 }
9608 java_library {
9609 name: "myjavalib",
9610 srcs: ["MyClass.java"],
9611 apex_available: [ "myapex" ],
9612 sdk_version: "current",
9613 min_sdk_version: "29",
9614 compile_dex: true,
9615 }
9616 `
9617 fs := android.MockFS{
9618 "lint-baseline.xml": nil,
9619 }
9620
9621 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9622 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9623 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9624 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9625 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9626 }
9627}
9628
Spandan Das42e89502022-05-06 22:12:55 +00009629// updatable apexes should propagate updatable=true to its apps
9630func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9631 bp := `
9632 apex {
9633 name: "myapex",
9634 key: "myapex.key",
9635 updatable: %v,
9636 apps: [
9637 "myapp",
9638 ],
9639 min_sdk_version: "30",
9640 }
9641 apex_key {
9642 name: "myapex.key",
9643 }
9644 android_app {
9645 name: "myapp",
9646 updatable: %v,
9647 apex_available: [
9648 "myapex",
9649 ],
9650 sdk_version: "current",
9651 min_sdk_version: "30",
9652 }
9653 `
9654 testCases := []struct {
9655 name string
9656 apex_is_updatable_bp bool
9657 app_is_updatable_bp bool
9658 app_is_updatable_expected bool
9659 }{
9660 {
9661 name: "Non-updatable apex respects updatable property of non-updatable app",
9662 apex_is_updatable_bp: false,
9663 app_is_updatable_bp: false,
9664 app_is_updatable_expected: false,
9665 },
9666 {
9667 name: "Non-updatable apex respects updatable property of updatable app",
9668 apex_is_updatable_bp: false,
9669 app_is_updatable_bp: true,
9670 app_is_updatable_expected: true,
9671 },
9672 {
9673 name: "Updatable apex respects updatable property of updatable app",
9674 apex_is_updatable_bp: true,
9675 app_is_updatable_bp: true,
9676 app_is_updatable_expected: true,
9677 },
9678 {
9679 name: "Updatable apex sets updatable=true on non-updatable app",
9680 apex_is_updatable_bp: true,
9681 app_is_updatable_bp: false,
9682 app_is_updatable_expected: true,
9683 },
9684 }
9685 for _, testCase := range testCases {
9686 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9687 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9688 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9689 }
9690}
9691
Kiyoung Kim487689e2022-07-26 09:48:22 +09009692func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9693 bp := `
9694 apex {
9695 name: "myapex",
9696 key: "myapex.key",
9697 native_shared_libs: ["libfoo"],
9698 min_sdk_version: "29",
9699 }
9700 apex_key {
9701 name: "myapex.key",
9702 }
9703 cc_library {
9704 name: "libfoo",
9705 shared_libs: ["libc"],
9706 apex_available: ["myapex"],
9707 min_sdk_version: "29",
9708 }
9709 cc_api_library {
9710 name: "libc",
9711 src: "libc.so",
9712 min_sdk_version: "29",
9713 recovery_available: true,
9714 }
9715 api_imports {
9716 name: "api_imports",
9717 shared_libs: [
9718 "libc",
9719 ],
9720 header_libs: [],
9721 }
9722 `
9723 result := testApex(t, bp)
9724
9725 hasDep := func(m android.Module, wantDep android.Module) bool {
9726 t.Helper()
9727 var found bool
9728 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9729 if dep == wantDep {
9730 found = true
9731 }
9732 })
9733 return found
9734 }
9735
9736 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9737 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9738
9739 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9740
9741 // libfoo core variant should be buildable in the same inner tree since
9742 // certain mcombo files might build system and apexes in the same inner tree
9743 // libfoo core variant should link against source libc
9744 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9745 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9746 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9747}
Liz Kammer0e255ef2022-11-04 16:07:04 -04009748
9749func TestApexImageInMixedBuilds(t *testing.T) {
9750 bp := `
9751apex_key{
9752 name: "foo_key",
9753}
9754apex {
9755 name: "foo",
9756 key: "foo_key",
9757 updatable: true,
9758 min_sdk_version: "31",
9759 file_contexts: ":myapex-file_contexts",
9760 bazel_module: { label: "//:foo" },
9761}`
9762
9763 outputBaseDir := "out/bazel"
9764 result := android.GroupFixturePreparers(
9765 prepareForApexTest,
9766 android.FixtureModifyConfig(func(config android.Config) {
9767 config.BazelContext = android.MockBazelContext{
9768 OutputBaseDir: outputBaseDir,
9769 LabelToApexInfo: map[string]cquery.ApexInfo{
9770 "//:foo": cquery.ApexInfo{
9771 SignedOutput: "signed_out.apex",
9772 UnsignedOutput: "unsigned_out.apex",
9773 BundleKeyInfo: []string{"public_key", "private_key"},
9774 ContainerKeyInfo: []string{"container_cert", "container_private"},
9775
9776 // unused
9777 PackageName: "pkg_name",
9778 ProvidesLibs: []string{"a", "b"},
9779 RequiresLibs: []string{"c", "d"},
9780 },
9781 },
9782 }
9783 }),
9784 ).RunTestWithBp(t, bp)
9785
9786 m := result.ModuleForTests("foo", "android_common_foo_image").Module()
9787 ab, ok := m.(*apexBundle)
9788 if !ok {
9789 t.Fatalf("Expected module to be an apexBundle, was not")
9790 }
9791
9792 if w, g := "out/bazel/execroot/__main__/public_key", ab.publicKeyFile.String(); w != g {
9793 t.Errorf("Expected public key %q, got %q", w, g)
9794 }
9795
9796 if w, g := "out/bazel/execroot/__main__/private_key", ab.privateKeyFile.String(); w != g {
9797 t.Errorf("Expected private key %q, got %q", w, g)
9798 }
9799
9800 if w, g := "out/bazel/execroot/__main__/container_cert", ab.containerCertificateFile.String(); w != g {
9801 t.Errorf("Expected public container key %q, got %q", w, g)
9802 }
9803
9804 if w, g := "out/bazel/execroot/__main__/container_private", ab.containerPrivateKeyFile.String(); w != g {
9805 t.Errorf("Expected private container key %q, got %q", w, g)
9806 }
9807
9808 if w, g := "out/bazel/execroot/__main__/signed_out.apex", ab.outputFile.String(); w != g {
9809 t.Errorf("Expected output file %q, got %q", w, g)
9810 }
9811}