blob: 7b290588473736700c07c14aba3db2b4440fef40 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jiyong Park25fc6a92018-11-18 18:02:45 +090019 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Paul Duffin37856732021-02-26 14:24:15 +000021 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070022 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010023 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
29 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Paul Duffin40b62572021-03-20 11:39:01 +000051func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090052 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010053 android.GroupFixturePreparers(
54 prepareForApexTest,
55 android.GroupFixturePreparers(preparers...),
56 ).
Paul Duffine05480a2021-03-08 15:07:14 +000057 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000058 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090059}
60
Paul Duffin40b62572021-03-20 11:39:01 +000061func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090062 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010063
64 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000065 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010066 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000067 }
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 result := android.GroupFixturePreparers(
70 prepareForApexTest,
71 android.GroupFixturePreparers(preparers...),
72 optionalBpPreparer,
73 ).RunTest(t)
74
Paul Duffine05480a2021-03-08 15:07:14 +000075 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Paul Duffin810f33d2021-03-09 14:12:32 +000078func withFiles(files android.MockFS) android.FixturePreparer {
79 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090080}
81
Paul Duffin810f33d2021-03-09 14:12:32 +000082func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
83 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090084 for k, v := range targets {
85 config.Targets[k] = v
86 }
Paul Duffin810f33d2021-03-09 14:12:32 +000087 })
Jooyung Han344d5432019-08-23 11:17:39 +090088}
89
Jooyung Han35155c42020-02-06 17:33:20 +090090// withNativeBridgeTargets sets configuration with targets including:
91// - X86_64 (primary)
92// - X86 (secondary)
93// - Arm64 on X86_64 (native bridge)
94// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000095var withNativeBridgeEnabled = android.FixtureModifyConfig(
96 func(config android.Config) {
97 config.Targets[android.Android] = []android.Target{
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
106 }
107 },
108)
109
110func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
111 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
112 variables.ManifestPackageNameOverrides = specs
113 })
Jooyung Han35155c42020-02-06 17:33:20 +0900114}
115
Albert Martineefabcf2022-03-21 20:11:16 +0000116func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
117 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
118 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
119 })
120}
121
Paul Duffin810f33d2021-03-09 14:12:32 +0000122var withBinder32bit = android.FixtureModifyProductVariables(
123 func(variables android.FixtureProductVariables) {
124 variables.Binder32bit = proptools.BoolPtr(true)
125 },
126)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900127
Paul Duffin810f33d2021-03-09 14:12:32 +0000128var withUnbundledBuild = android.FixtureModifyProductVariables(
129 func(variables android.FixtureProductVariables) {
130 variables.Unbundled_build = proptools.BoolPtr(true)
131 },
132)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900133
Paul Duffin284165a2021-03-29 01:50:31 +0100134// Legacy preparer used for running tests within the apex package.
135//
136// This includes everything that was needed to run any test in the apex package prior to the
137// introduction of the test fixtures. Tests that are being converted to use fixtures directly
138// rather than through the testApex...() methods should avoid using this and instead use the
139// various preparers directly, using android.GroupFixturePreparers(...) to group them when
140// necessary.
141//
142// deprecated
143var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000144 // General preparers in alphabetical order as test infrastructure will enforce correct
145 // registration order.
146 android.PrepareForTestWithAndroidBuildComponents,
147 bpf.PrepareForTestWithBpf,
148 cc.PrepareForTestWithCcBuildComponents,
149 java.PrepareForTestWithJavaDefaultModules,
150 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
151 rust.PrepareForTestWithRustDefaultModules,
152 sh.PrepareForTestWithShBuildComponents,
153
154 PrepareForTestWithApexBuildComponents,
155
156 // Additional apex test specific preparers.
157 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
158 filegroup {
159 name: "myapex-file_contexts",
160 srcs: [
161 "apex/myapex-file_contexts",
162 ],
163 }
164 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000165 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000166 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000167 "a.java": nil,
168 "PrebuiltAppFoo.apk": nil,
169 "PrebuiltAppFooPriv.apk": nil,
170 "apex_manifest.json": nil,
171 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000172 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
173 "system/sepolicy/apex/myapex2-file_contexts": nil,
174 "system/sepolicy/apex/otherapex-file_contexts": nil,
175 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700177 "mylib.cpp": nil,
178 "mytest.cpp": nil,
179 "mytest1.cpp": nil,
180 "mytest2.cpp": nil,
181 "mytest3.cpp": nil,
182 "myprebuilt": nil,
183 "my_include": nil,
184 "foo/bar/MyClass.java": nil,
185 "prebuilt.jar": nil,
186 "prebuilt.so": nil,
187 "vendor/foo/devkeys/test.x509.pem": nil,
188 "vendor/foo/devkeys/test.pk8": nil,
189 "testkey.x509.pem": nil,
190 "testkey.pk8": nil,
191 "testkey.override.x509.pem": nil,
192 "testkey.override.pk8": nil,
193 "vendor/foo/devkeys/testkey.avbpubkey": nil,
194 "vendor/foo/devkeys/testkey.pem": nil,
195 "NOTICE": nil,
196 "custom_notice": nil,
197 "custom_notice_for_static_lib": nil,
198 "testkey2.avbpubkey": nil,
199 "testkey2.pem": nil,
200 "myapex-arm64.apex": nil,
201 "myapex-arm.apex": nil,
202 "myapex.apks": nil,
203 "frameworks/base/api/current.txt": nil,
204 "framework/aidl/a.aidl": nil,
205 "dummy.txt": nil,
206 "baz": nil,
207 "bar/baz": nil,
208 "testdata/baz": nil,
209 "AppSet.apks": nil,
210 "foo.rs": nil,
211 "libfoo.jar": nil,
212 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000213 },
214 ),
215
216 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
217 variables.DeviceVndkVersion = proptools.StringPtr("current")
218 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
219 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
220 variables.Platform_sdk_codename = proptools.StringPtr("Q")
221 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000222 // "Tiramisu" needs to be in the next line for compatibility with soong code,
223 // not because of these tests specifically (it's not used by the tests)
224 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900225 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000226 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000227 }),
228)
229
Paul Duffin52bfaa42021-03-23 23:40:12 +0000230var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
231 "system/sepolicy/apex/myapex-file_contexts": nil,
232})
233
Jooyung Han643adc42020-02-27 13:50:06 +0900234// ensure that 'result' equals 'expected'
235func ensureEquals(t *testing.T, result string, expected string) {
236 t.Helper()
237 if result != expected {
238 t.Errorf("%q != %q", expected, result)
239 }
240}
241
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242// ensure that 'result' contains 'expected'
243func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900244 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245 if !strings.Contains(result, expected) {
246 t.Errorf("%q is not found in %q", expected, result)
247 }
248}
249
Liz Kammer5bd365f2020-05-27 15:15:11 -0700250// ensure that 'result' contains 'expected' exactly one time
251func ensureContainsOnce(t *testing.T, result string, expected string) {
252 t.Helper()
253 count := strings.Count(result, expected)
254 if count != 1 {
255 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
256 }
257}
258
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259// ensures that 'result' does not contain 'notExpected'
260func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900261 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262 if strings.Contains(result, notExpected) {
263 t.Errorf("%q is found in %q", notExpected, result)
264 }
265}
266
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700267func ensureMatches(t *testing.T, result string, expectedRex string) {
268 ok, err := regexp.MatchString(expectedRex, result)
269 if err != nil {
270 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
271 return
272 }
273 if !ok {
274 t.Errorf("%s does not match regular expession %s", result, expectedRex)
275 }
276}
277
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900279 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if !android.InList(expected, result) {
281 t.Errorf("%q is not found in %v", expected, result)
282 }
283}
284
285func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900286 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287 if android.InList(notExpected, result) {
288 t.Errorf("%q is found in %v", notExpected, result)
289 }
290}
291
Jooyung Hane1633032019-08-01 17:41:43 +0900292func ensureListEmpty(t *testing.T, result []string) {
293 t.Helper()
294 if len(result) > 0 {
295 t.Errorf("%q is expected to be empty", result)
296 }
297}
298
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000299func ensureListNotEmpty(t *testing.T, result []string) {
300 t.Helper()
301 if len(result) == 0 {
302 t.Errorf("%q is expected to be not empty", result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// Minimal test
307func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800308 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900309 apex_defaults {
310 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900311 manifest: ":myapex.manifest",
312 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900314 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900315 native_shared_libs: [
316 "mylib",
317 "libfoo.ffi",
318 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900319 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800320 multilib: {
321 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900322 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800323 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900324 },
Jiyong Park77acec62020-06-01 21:39:15 +0900325 java_libs: [
326 "myjar",
327 "myjar_dex",
328 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000329 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 }
331
Jiyong Park30ca9372019-02-07 16:27:23 +0900332 apex {
333 name: "myapex",
334 defaults: ["myapex-defaults"],
335 }
336
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 apex_key {
338 name: "myapex.key",
339 public_key: "testkey.avbpubkey",
340 private_key: "testkey.pem",
341 }
342
Jiyong Park809bb722019-02-13 21:33:49 +0900343 filegroup {
344 name: "myapex.manifest",
345 srcs: ["apex_manifest.json"],
346 }
347
348 filegroup {
349 name: "myapex.androidmanifest",
350 srcs: ["AndroidManifest.xml"],
351 }
352
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 cc_library {
354 name: "mylib",
355 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900356 shared_libs: [
357 "mylib2",
358 "libbar.ffi",
359 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900360 system_shared_libs: [],
361 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000362 // TODO: remove //apex_available:platform
363 apex_available: [
364 "//apex_available:platform",
365 "myapex",
366 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900367 }
368
Alex Light3d673592019-01-18 14:37:31 -0800369 cc_binary {
370 name: "foo",
371 srcs: ["mylib.cpp"],
372 compile_multilib: "both",
373 multilib: {
374 lib32: {
375 suffix: "32",
376 },
377 lib64: {
378 suffix: "64",
379 },
380 },
381 symlinks: ["foo_link_"],
382 symlink_preferred_arch: true,
383 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800384 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700385 apex_available: [ "myapex", "com.android.gki.*" ],
386 }
387
Jiyong Park99644e92020-11-17 22:21:02 +0900388 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000389 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900390 srcs: ["foo.rs"],
391 rlibs: ["libfoo.rlib.rust"],
392 dylibs: ["libfoo.dylib.rust"],
393 apex_available: ["myapex"],
394 }
395
396 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000397 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900398 srcs: ["foo.rs"],
399 crate_name: "foo",
400 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900401 shared_libs: ["libfoo.shared_from_rust"],
402 }
403
404 cc_library_shared {
405 name: "libfoo.shared_from_rust",
406 srcs: ["mylib.cpp"],
407 system_shared_libs: [],
408 stl: "none",
409 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900410 }
411
412 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000413 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900414 srcs: ["foo.rs"],
415 crate_name: "foo",
416 apex_available: ["myapex"],
417 }
418
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900419 rust_ffi_shared {
420 name: "libfoo.ffi",
421 srcs: ["foo.rs"],
422 crate_name: "foo",
423 apex_available: ["myapex"],
424 }
425
426 rust_ffi_shared {
427 name: "libbar.ffi",
428 srcs: ["foo.rs"],
429 crate_name: "bar",
430 apex_available: ["myapex"],
431 }
432
Yifan Hongd22a84a2020-07-28 17:37:46 -0700433 apex {
434 name: "com.android.gki.fake",
435 binaries: ["foo"],
436 key: "myapex.key",
437 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000438 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900442 name: "mylib2",
443 srcs: ["mylib.cpp"],
444 system_shared_libs: [],
445 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900446 notice: "custom_notice",
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",
470 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000471 // TODO: remove //apex_available:platform
472 apex_available: [
473 "//apex_available:platform",
474 "myapex",
475 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900476 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477
478 java_library {
479 name: "myjar",
480 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900481 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900482 sdk_version: "none",
483 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900485 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000486 // TODO: remove //apex_available:platform
487 apex_available: [
488 "//apex_available:platform",
489 "myapex",
490 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900491 }
492
Jiyong Park77acec62020-06-01 21:39:15 +0900493 dex_import {
494 name: "myjar_dex",
495 jars: ["prebuilt.jar"],
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
500 }
501
Jiyong Park7f7766d2019-07-25 22:02:35 +0900502 java_library {
503 name: "myotherjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900507 // TODO: remove //apex_available:platform
508 apex_available: [
509 "//apex_available:platform",
510 "myapex",
511 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900512 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900513
514 java_library {
515 name: "mysharedjar",
516 srcs: ["foo/bar/MyClass.java"],
517 sdk_version: "none",
518 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900519 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900520 `)
521
Paul Duffina71a67a2021-03-29 00:42:57 +0100522 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900523
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900524 // Make sure that Android.mk is created
525 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700526 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900527 var builder strings.Builder
528 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
529
530 androidMk := builder.String()
531 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
532 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
533
Jiyong Park42cca6c2019-04-01 11:15:50 +0900534 optFlags := apexRule.Args["opt_flags"]
535 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700536 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100537 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900538
Jiyong Park25fc6a92018-11-18 18:02:45 +0900539 copyCmds := apexRule.Args["copy_commands"]
540
541 // Ensure that main rule creates an output
542 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
543
544 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700545 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900550
551 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700552 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900558
559 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800560 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
561 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900563 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
566 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900567 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900568 // .. but not for java libs
569 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900570 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800571
Colin Cross7113d202019-11-20 16:39:12 -0800572 // Ensure that the platform variant ends with _shared or _common
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
574 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
576 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900577 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
578
579 // Ensure that dynamic dependency to java libs are not included
580 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800581
582 // Ensure that all symlinks are present.
583 found_foo_link_64 := false
584 found_foo := false
585 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900586 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800587 if strings.HasSuffix(cmd, "bin/foo") {
588 found_foo = true
589 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
590 found_foo_link_64 = true
591 }
592 }
593 }
594 good := found_foo && found_foo_link_64
595 if !good {
596 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
597 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900598
Artur Satayeva8bd1132020-04-27 18:07:06 +0100599 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100601 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
602 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
603 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100604
605 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100606 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100607 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
608 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
609 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800610}
611
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800613 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900614 apex_defaults {
615 name: "myapex-defaults",
616 key: "myapex.key",
617 prebuilts: ["myetc"],
618 native_shared_libs: ["mylib"],
619 java_libs: ["myjar"],
620 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900621 rros: ["rro"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800622 bpfs: ["bpf", "netd_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000623 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900624 }
625
626 prebuilt_etc {
627 name: "myetc",
628 src: "myprebuilt",
629 }
630
631 apex {
632 name: "myapex",
633 defaults: ["myapex-defaults"],
634 }
635
636 apex_key {
637 name: "myapex.key",
638 public_key: "testkey.avbpubkey",
639 private_key: "testkey.pem",
640 }
641
642 cc_library {
643 name: "mylib",
644 system_shared_libs: [],
645 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000646 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900647 }
648
649 java_library {
650 name: "myjar",
651 srcs: ["foo/bar/MyClass.java"],
652 sdk_version: "none",
653 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000654 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900655 }
656
657 android_app {
658 name: "AppFoo",
659 srcs: ["foo/bar/MyClass.java"],
660 sdk_version: "none",
661 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000662 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900663 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900664
665 runtime_resource_overlay {
666 name: "rro",
667 theme: "blue",
668 }
669
markchien2f59ec92020-09-02 16:23:38 +0800670 bpf {
671 name: "bpf",
672 srcs: ["bpf.c", "bpf2.c"],
673 }
674
Ken Chenfad7f9d2021-11-10 22:02:57 +0800675 bpf {
676 name: "netd_test",
677 srcs: ["netd_test.c"],
678 sub_dir: "netd",
679 }
680
Jooyung Hanf21c7972019-12-16 22:32:06 +0900681 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000682 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900683 "etc/myetc",
684 "javalib/myjar.jar",
685 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000686 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900687 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800688 "etc/bpf/bpf.o",
689 "etc/bpf/bpf2.o",
Ken Chenfad7f9d2021-11-10 22:02:57 +0800690 "etc/bpf/netd/netd_test.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900691 })
692}
693
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800695 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900696 apex {
697 name: "myapex",
698 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000699 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900700 }
701
702 apex_key {
703 name: "myapex.key",
704 public_key: "testkey.avbpubkey",
705 private_key: "testkey.pem",
706 }
707 `)
708
709 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900710 args := module.Rule("apexRule").Args
711 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
712 t.Error("manifest should be apex_manifest.pb, but " + manifest)
713 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900714}
715
Liz Kammer4854a7d2021-05-27 14:28:27 -0400716func TestApexManifestMinSdkVersion(t *testing.T) {
717 ctx := testApex(t, `
718 apex_defaults {
719 name: "my_defaults",
720 key: "myapex.key",
721 product_specific: true,
722 file_contexts: ":my-file-contexts",
723 updatable: false,
724 }
725 apex {
726 name: "myapex_30",
727 min_sdk_version: "30",
728 defaults: ["my_defaults"],
729 }
730
731 apex {
732 name: "myapex_current",
733 min_sdk_version: "current",
734 defaults: ["my_defaults"],
735 }
736
737 apex {
738 name: "myapex_none",
739 defaults: ["my_defaults"],
740 }
741
742 apex_key {
743 name: "myapex.key",
744 public_key: "testkey.avbpubkey",
745 private_key: "testkey.pem",
746 }
747
748 filegroup {
749 name: "my-file-contexts",
750 srcs: ["product_specific_file_contexts"],
751 }
752 `, withFiles(map[string][]byte{
753 "product_specific_file_contexts": nil,
754 }), android.FixtureModifyProductVariables(
755 func(variables android.FixtureProductVariables) {
756 variables.Unbundled_build = proptools.BoolPtr(true)
757 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
758 }), android.FixtureMergeEnv(map[string]string{
759 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
760 }))
761
762 testCases := []struct {
763 module string
764 minSdkVersion string
765 }{
766 {
767 module: "myapex_30",
768 minSdkVersion: "30",
769 },
770 {
771 module: "myapex_current",
772 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
773 },
774 {
775 module: "myapex_none",
776 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
777 },
778 }
779 for _, tc := range testCases {
780 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
781 args := module.Rule("apexRule").Args
782 optFlags := args["opt_flags"]
783 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
784 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
785 }
786 }
787}
788
Alex Light5098a612018-11-29 17:12:15 -0800789func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800790 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800791 apex {
792 name: "myapex",
793 key: "myapex.key",
794 payload_type: "zip",
795 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000796 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800797 }
798
799 apex_key {
800 name: "myapex.key",
801 public_key: "testkey.avbpubkey",
802 private_key: "testkey.pem",
803 }
804
805 cc_library {
806 name: "mylib",
807 srcs: ["mylib.cpp"],
808 shared_libs: ["mylib2"],
809 system_shared_libs: [],
810 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000811 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800812 }
813
814 cc_library {
815 name: "mylib2",
816 srcs: ["mylib.cpp"],
817 system_shared_libs: [],
818 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000819 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800820 }
821 `)
822
Sundong Ahnabb64432019-10-22 13:58:29 +0900823 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800824 copyCmds := zipApexRule.Args["copy_commands"]
825
826 // Ensure that main rule creates an output
827 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
828
829 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800831
832 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700833 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800834
835 // Ensure that both direct and indirect deps are copied into apex
836 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
837 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900838}
839
840func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800841 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900842 apex {
843 name: "myapex",
844 key: "myapex.key",
845 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900846 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000847 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900848 }
849
850 apex_key {
851 name: "myapex.key",
852 public_key: "testkey.avbpubkey",
853 private_key: "testkey.pem",
854 }
855
856 cc_library {
857 name: "mylib",
858 srcs: ["mylib.cpp"],
859 shared_libs: ["mylib2", "mylib3"],
860 system_shared_libs: [],
861 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000862 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900863 }
864
865 cc_library {
866 name: "mylib2",
867 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900868 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900869 system_shared_libs: [],
870 stl: "none",
871 stubs: {
872 versions: ["1", "2", "3"],
873 },
874 }
875
876 cc_library {
877 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900878 srcs: ["mylib.cpp"],
879 shared_libs: ["mylib4"],
880 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900881 stl: "none",
882 stubs: {
883 versions: ["10", "11", "12"],
884 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000885 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900886 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900887
888 cc_library {
889 name: "mylib4",
890 srcs: ["mylib.cpp"],
891 system_shared_libs: [],
892 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000893 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900894 }
Jiyong Park105dc322021-06-11 17:22:09 +0900895
896 rust_binary {
897 name: "foo.rust",
898 srcs: ["foo.rs"],
899 shared_libs: ["libfoo.shared_from_rust"],
900 prefer_rlib: true,
901 apex_available: ["myapex"],
902 }
903
904 cc_library_shared {
905 name: "libfoo.shared_from_rust",
906 srcs: ["mylib.cpp"],
907 system_shared_libs: [],
908 stl: "none",
909 stubs: {
910 versions: ["10", "11", "12"],
911 },
912 }
913
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914 `)
915
Sundong Ahnabb64432019-10-22 13:58:29 +0900916 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900917 copyCmds := apexRule.Args["copy_commands"]
918
919 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800920 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921
922 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800923 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924
925 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800926 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927
Colin Crossaede88c2020-08-11 12:17:01 -0700928 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900929
930 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900931 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900933 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900934
935 // 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 -0700936 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900937 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700938 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900939
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700940 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
941 // is replaced by sharing of "cFlags" in cc/builder.go.
942 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
943 // module variable representing "cflags". So it was not detected by ensureNotContains.
944 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
945 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
946 // including the original cflags's "-include mylib.h".
947 //
Jiyong Park64379952018-12-13 18:37:29 +0900948 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700949 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
950 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900951
952 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700953 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900954
Jooyung Hana57af4a2020-01-23 05:36:59 +0000955 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900956 "lib64/mylib.so",
957 "lib64/mylib3.so",
958 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900959 "bin/foo.rust",
960 "lib64/libc++.so", // by the implicit dependency from foo.rust
961 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900962 })
Jiyong Park105dc322021-06-11 17:22:09 +0900963
964 // Ensure that stub dependency from a rust module is not included
965 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
966 // The rust module is linked to the stub cc library
967 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
968 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
969 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900970
971 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
972 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973}
974
Jiyong Park1bc84122021-06-22 20:23:05 +0900975func TestApexCanUsePrivateApis(t *testing.T) {
976 ctx := testApex(t, `
977 apex {
978 name: "myapex",
979 key: "myapex.key",
980 native_shared_libs: ["mylib"],
981 binaries: ["foo.rust"],
982 updatable: false,
983 platform_apis: true,
984 }
985
986 apex_key {
987 name: "myapex.key",
988 public_key: "testkey.avbpubkey",
989 private_key: "testkey.pem",
990 }
991
992 cc_library {
993 name: "mylib",
994 srcs: ["mylib.cpp"],
995 shared_libs: ["mylib2"],
996 system_shared_libs: [],
997 stl: "none",
998 apex_available: [ "myapex" ],
999 }
1000
1001 cc_library {
1002 name: "mylib2",
1003 srcs: ["mylib.cpp"],
1004 cflags: ["-include mylib.h"],
1005 system_shared_libs: [],
1006 stl: "none",
1007 stubs: {
1008 versions: ["1", "2", "3"],
1009 },
1010 }
1011
1012 rust_binary {
1013 name: "foo.rust",
1014 srcs: ["foo.rs"],
1015 shared_libs: ["libfoo.shared_from_rust"],
1016 prefer_rlib: true,
1017 apex_available: ["myapex"],
1018 }
1019
1020 cc_library_shared {
1021 name: "libfoo.shared_from_rust",
1022 srcs: ["mylib.cpp"],
1023 system_shared_libs: [],
1024 stl: "none",
1025 stubs: {
1026 versions: ["10", "11", "12"],
1027 },
1028 }
1029 `)
1030
1031 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1032 copyCmds := apexRule.Args["copy_commands"]
1033
1034 // Ensure that indirect stubs dep is not included
1035 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1037
1038 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1039 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001040 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001041 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1042 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001043 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001044 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1046}
1047
Colin Cross7812fd32020-09-25 12:35:10 -07001048func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1049 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001050 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001051 apex {
1052 name: "myapex",
1053 key: "myapex.key",
1054 native_shared_libs: ["mylib", "mylib3"],
1055 min_sdk_version: "29",
1056 }
1057
1058 apex_key {
1059 name: "myapex.key",
1060 public_key: "testkey.avbpubkey",
1061 private_key: "testkey.pem",
1062 }
1063
1064 cc_library {
1065 name: "mylib",
1066 srcs: ["mylib.cpp"],
1067 shared_libs: ["mylib2", "mylib3"],
1068 system_shared_libs: [],
1069 stl: "none",
1070 apex_available: [ "myapex" ],
1071 min_sdk_version: "28",
1072 }
1073
1074 cc_library {
1075 name: "mylib2",
1076 srcs: ["mylib.cpp"],
1077 cflags: ["-include mylib.h"],
1078 system_shared_libs: [],
1079 stl: "none",
1080 stubs: {
1081 versions: ["28", "29", "30", "current"],
1082 },
1083 min_sdk_version: "28",
1084 }
1085
1086 cc_library {
1087 name: "mylib3",
1088 srcs: ["mylib.cpp"],
1089 shared_libs: ["mylib4"],
1090 system_shared_libs: [],
1091 stl: "none",
1092 stubs: {
1093 versions: ["28", "29", "30", "current"],
1094 },
1095 apex_available: [ "myapex" ],
1096 min_sdk_version: "28",
1097 }
1098
1099 cc_library {
1100 name: "mylib4",
1101 srcs: ["mylib.cpp"],
1102 system_shared_libs: [],
1103 stl: "none",
1104 apex_available: [ "myapex" ],
1105 min_sdk_version: "28",
1106 }
1107 `)
1108
1109 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1110 copyCmds := apexRule.Args["copy_commands"]
1111
1112 // Ensure that direct non-stubs dep is always included
1113 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1114
1115 // Ensure that indirect stubs dep is not included
1116 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1117
1118 // Ensure that direct stubs dep is included
1119 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1120
1121 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1122
Jiyong Park55549df2021-02-26 23:57:23 +09001123 // Ensure that mylib is linking with the latest version of stub for mylib2
1124 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001125 // ... and not linking to the non-stub (impl) variant of mylib2
1126 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1127
1128 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1129 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1130 // .. and not linking to the stubs variant of mylib3
1131 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1132
1133 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001134 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001135 ensureNotContains(t, mylib2Cflags, "-include ")
1136
1137 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -07001138 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -07001139
1140 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1141 "lib64/mylib.so",
1142 "lib64/mylib3.so",
1143 "lib64/mylib4.so",
1144 })
1145}
1146
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001147func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1148 t.Parallel()
1149 // myapex (Z)
1150 // mylib -----------------.
1151 // |
1152 // otherapex (29) |
1153 // libstub's versions: 29 Z current
1154 // |
1155 // <platform> |
1156 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001157 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001158 apex {
1159 name: "myapex",
1160 key: "myapex.key",
1161 native_shared_libs: ["mylib"],
1162 min_sdk_version: "Z", // non-final
1163 }
1164
1165 cc_library {
1166 name: "mylib",
1167 srcs: ["mylib.cpp"],
1168 shared_libs: ["libstub"],
1169 apex_available: ["myapex"],
1170 min_sdk_version: "Z",
1171 }
1172
1173 apex_key {
1174 name: "myapex.key",
1175 public_key: "testkey.avbpubkey",
1176 private_key: "testkey.pem",
1177 }
1178
1179 apex {
1180 name: "otherapex",
1181 key: "myapex.key",
1182 native_shared_libs: ["libstub"],
1183 min_sdk_version: "29",
1184 }
1185
1186 cc_library {
1187 name: "libstub",
1188 srcs: ["mylib.cpp"],
1189 stubs: {
1190 versions: ["29", "Z", "current"],
1191 },
1192 apex_available: ["otherapex"],
1193 min_sdk_version: "29",
1194 }
1195
1196 // platform module depending on libstub from otherapex should use the latest stub("current")
1197 cc_library {
1198 name: "libplatform",
1199 srcs: ["mylib.cpp"],
1200 shared_libs: ["libstub"],
1201 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001202 `,
1203 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1204 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1205 variables.Platform_sdk_final = proptools.BoolPtr(false)
1206 variables.Platform_version_active_codenames = []string{"Z"}
1207 }),
1208 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001209
Jiyong Park55549df2021-02-26 23:57:23 +09001210 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001211 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001212 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001213 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001214 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001215
1216 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1217 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1218 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1219 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1220 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1221}
1222
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001223func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001224 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001225 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001226 name: "myapex2",
1227 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001228 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001229 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 }
1231
1232 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001233 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234 public_key: "testkey.avbpubkey",
1235 private_key: "testkey.pem",
1236 }
1237
1238 cc_library {
1239 name: "mylib",
1240 srcs: ["mylib.cpp"],
1241 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001242 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001243 system_shared_libs: [],
1244 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001245 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001246 }
1247
1248 cc_library {
1249 name: "libfoo",
1250 srcs: ["mylib.cpp"],
1251 shared_libs: ["libbar"],
1252 system_shared_libs: [],
1253 stl: "none",
1254 stubs: {
1255 versions: ["10", "20", "30"],
1256 },
1257 }
1258
1259 cc_library {
1260 name: "libbar",
1261 srcs: ["mylib.cpp"],
1262 system_shared_libs: [],
1263 stl: "none",
1264 }
1265
Jiyong Park678c8812020-02-07 17:25:49 +09001266 cc_library_static {
1267 name: "libbaz",
1268 srcs: ["mylib.cpp"],
1269 system_shared_libs: [],
1270 stl: "none",
1271 apex_available: [ "myapex2" ],
1272 }
1273
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001274 `)
1275
Jiyong Park83dc74b2020-01-14 18:38:44 +09001276 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001277 copyCmds := apexRule.Args["copy_commands"]
1278
1279 // Ensure that direct non-stubs dep is always included
1280 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1281
1282 // Ensure that indirect stubs dep is not included
1283 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1284
1285 // Ensure that dependency of stubs is not included
1286 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1287
Colin Crossaede88c2020-08-11 12:17:01 -07001288 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289
1290 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001291 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001292 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001293 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001294
Jiyong Park3ff16992019-12-27 14:11:47 +09001295 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001296
1297 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1298 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001299
Artur Satayeva8bd1132020-04-27 18:07:06 +01001300 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001301 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001302
Artur Satayeva8bd1132020-04-27 18:07:06 +01001303 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001304 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001305}
1306
Jooyung Hand3639552019-08-09 12:57:43 +09001307func TestApexWithRuntimeLibsDependency(t *testing.T) {
1308 /*
1309 myapex
1310 |
1311 v (runtime_libs)
1312 mylib ------+------> libfoo [provides stub]
1313 |
1314 `------> libbar
1315 */
Colin Cross1c460562021-02-16 17:55:47 -08001316 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001317 apex {
1318 name: "myapex",
1319 key: "myapex.key",
1320 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001321 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001322 }
1323
1324 apex_key {
1325 name: "myapex.key",
1326 public_key: "testkey.avbpubkey",
1327 private_key: "testkey.pem",
1328 }
1329
1330 cc_library {
1331 name: "mylib",
1332 srcs: ["mylib.cpp"],
1333 runtime_libs: ["libfoo", "libbar"],
1334 system_shared_libs: [],
1335 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001336 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001337 }
1338
1339 cc_library {
1340 name: "libfoo",
1341 srcs: ["mylib.cpp"],
1342 system_shared_libs: [],
1343 stl: "none",
1344 stubs: {
1345 versions: ["10", "20", "30"],
1346 },
1347 }
1348
1349 cc_library {
1350 name: "libbar",
1351 srcs: ["mylib.cpp"],
1352 system_shared_libs: [],
1353 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001354 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001355 }
1356
1357 `)
1358
Sundong Ahnabb64432019-10-22 13:58:29 +09001359 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001360 copyCmds := apexRule.Args["copy_commands"]
1361
1362 // Ensure that direct non-stubs dep is always included
1363 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1364
1365 // Ensure that indirect stubs dep is not included
1366 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1367
1368 // Ensure that runtime_libs dep in included
1369 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1370
Sundong Ahnabb64432019-10-22 13:58:29 +09001371 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001372 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1373 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001374
1375}
1376
Paul Duffina02cae32021-03-09 01:44:06 +00001377var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1378 cc.PrepareForTestWithCcBuildComponents,
1379 PrepareForTestWithApexBuildComponents,
1380 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001381 apex {
1382 name: "com.android.runtime",
1383 key: "com.android.runtime.key",
1384 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001385 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001386 }
1387
1388 apex_key {
1389 name: "com.android.runtime.key",
1390 public_key: "testkey.avbpubkey",
1391 private_key: "testkey.pem",
1392 }
Paul Duffina02cae32021-03-09 01:44:06 +00001393 `),
1394 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1395)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001396
Paul Duffina02cae32021-03-09 01:44:06 +00001397func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001398 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001399 cc_library {
1400 name: "libc",
1401 no_libcrt: true,
1402 nocrt: true,
1403 stl: "none",
1404 system_shared_libs: [],
1405 stubs: { versions: ["1"] },
1406 apex_available: ["com.android.runtime"],
1407
1408 sanitize: {
1409 hwaddress: true,
1410 }
1411 }
1412
1413 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001414 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001415 no_libcrt: true,
1416 nocrt: true,
1417 stl: "none",
1418 system_shared_libs: [],
1419 srcs: [""],
1420 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001421 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001422
1423 sanitize: {
1424 never: true,
1425 },
Paul Duffina02cae32021-03-09 01:44:06 +00001426 } `)
1427 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001428
1429 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1430 "lib64/bionic/libc.so",
1431 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1432 })
1433
Colin Cross4c4c1be2022-02-10 11:41:18 -08001434 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001435
1436 installed := hwasan.Description("install libclang_rt.hwasan")
1437 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1438
1439 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1440 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1441 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1442}
1443
1444func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001445 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001446 prepareForTestOfRuntimeApexWithHwasan,
1447 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1448 variables.SanitizeDevice = []string{"hwaddress"}
1449 }),
1450 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001451 cc_library {
1452 name: "libc",
1453 no_libcrt: true,
1454 nocrt: true,
1455 stl: "none",
1456 system_shared_libs: [],
1457 stubs: { versions: ["1"] },
1458 apex_available: ["com.android.runtime"],
1459 }
1460
1461 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001462 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001463 no_libcrt: true,
1464 nocrt: true,
1465 stl: "none",
1466 system_shared_libs: [],
1467 srcs: [""],
1468 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001469 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001470
1471 sanitize: {
1472 never: true,
1473 },
1474 }
Paul Duffina02cae32021-03-09 01:44:06 +00001475 `)
1476 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477
1478 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1479 "lib64/bionic/libc.so",
1480 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1481 })
1482
Colin Cross4c4c1be2022-02-10 11:41:18 -08001483 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001484
1485 installed := hwasan.Description("install libclang_rt.hwasan")
1486 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1487
1488 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1489 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1490 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1491}
1492
Jooyung Han61b66e92020-03-21 14:21:46 +00001493func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1494 testcases := []struct {
1495 name string
1496 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001497 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001498 shouldLink string
1499 shouldNotLink []string
1500 }{
1501 {
Jiyong Park55549df2021-02-26 23:57:23 +09001502 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001503 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001504 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001505 shouldLink: "current",
1506 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001507 },
1508 {
Jiyong Park55549df2021-02-26 23:57:23 +09001509 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001510 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001511 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001512 shouldLink: "current",
1513 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001514 },
1515 }
1516 for _, tc := range testcases {
1517 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001518 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001519 apex {
1520 name: "myapex",
1521 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001522 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001523 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001524 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001525 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001526
Jooyung Han61b66e92020-03-21 14:21:46 +00001527 apex_key {
1528 name: "myapex.key",
1529 public_key: "testkey.avbpubkey",
1530 private_key: "testkey.pem",
1531 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001532
Jooyung Han61b66e92020-03-21 14:21:46 +00001533 cc_library {
1534 name: "mylib",
1535 srcs: ["mylib.cpp"],
1536 vendor_available: true,
1537 shared_libs: ["libbar"],
1538 system_shared_libs: [],
1539 stl: "none",
1540 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001541 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001542 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001543
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 cc_library {
1545 name: "libbar",
1546 srcs: ["mylib.cpp"],
1547 system_shared_libs: [],
1548 stl: "none",
1549 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001550 llndk: {
1551 symbol_file: "libbar.map.txt",
1552 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001553 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001554 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001555 withUnbundledBuild,
1556 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001557
Jooyung Han61b66e92020-03-21 14:21:46 +00001558 // Ensure that LLNDK dep is not included
1559 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1560 "lib64/mylib.so",
1561 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 // Ensure that LLNDK dep is required
1564 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1565 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1566 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001567
Steven Moreland2c4000c2021-04-27 02:08:49 +00001568 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1569 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001571 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001573
Steven Moreland2c4000c2021-04-27 02:08:49 +00001574 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001575 ver := tc.shouldLink
1576 if tc.shouldLink == "current" {
1577 ver = strconv.Itoa(android.FutureApiLevelInt)
1578 }
1579 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001580 })
1581 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001582}
1583
Jiyong Park25fc6a92018-11-18 18:02:45 +09001584func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001585 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586 apex {
1587 name: "myapex",
1588 key: "myapex.key",
1589 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001590 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001591 }
1592
1593 apex_key {
1594 name: "myapex.key",
1595 public_key: "testkey.avbpubkey",
1596 private_key: "testkey.pem",
1597 }
1598
1599 cc_library {
1600 name: "mylib",
1601 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001602 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001603 shared_libs: ["libdl#27"],
1604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001605 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001606 }
1607
1608 cc_library_shared {
1609 name: "mylib_shared",
1610 srcs: ["mylib.cpp"],
1611 shared_libs: ["libdl#27"],
1612 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001613 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001614 }
1615
1616 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001617 name: "libBootstrap",
1618 srcs: ["mylib.cpp"],
1619 stl: "none",
1620 bootstrap: true,
1621 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622 `)
1623
Sundong Ahnabb64432019-10-22 13:58:29 +09001624 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001625 copyCmds := apexRule.Args["copy_commands"]
1626
1627 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001628 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001629 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1630 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001631
1632 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001633 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001634
Colin Crossaede88c2020-08-11 12:17:01 -07001635 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1636 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1637 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001638
1639 // For dependency to libc
1640 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001641 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001642 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001643 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001645 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1646 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001647
1648 // For dependency to libm
1649 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001650 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001652 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001653 // ... and is not compiling with the stub
1654 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1655 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1656
1657 // For dependency to libdl
1658 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001659 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001661 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1662 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001664 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665 // ... Cflags from stub is correctly exported to mylib
1666 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1667 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001668
1669 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001670 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1671 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1672 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1673 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001675
Jooyung Han749dc692020-04-15 11:03:39 +09001676func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001677 // there are three links between liba --> libz.
1678 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001679 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001680 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001681 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001682 apex {
1683 name: "myapex",
1684 key: "myapex.key",
1685 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001686 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001687 }
1688
1689 apex {
1690 name: "otherapex",
1691 key: "myapex.key",
1692 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001693 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001694 }
1695
1696 apex_key {
1697 name: "myapex.key",
1698 public_key: "testkey.avbpubkey",
1699 private_key: "testkey.pem",
1700 }
1701
1702 cc_library {
1703 name: "libx",
1704 shared_libs: ["liba"],
1705 system_shared_libs: [],
1706 stl: "none",
1707 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001708 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001709 }
1710
1711 cc_library {
1712 name: "liby",
1713 shared_libs: ["liba"],
1714 system_shared_libs: [],
1715 stl: "none",
1716 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001717 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001718 }
1719
1720 cc_library {
1721 name: "liba",
1722 shared_libs: ["libz"],
1723 system_shared_libs: [],
1724 stl: "none",
1725 apex_available: [
1726 "//apex_available:anyapex",
1727 "//apex_available:platform",
1728 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001729 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001730 }
1731
1732 cc_library {
1733 name: "libz",
1734 system_shared_libs: [],
1735 stl: "none",
1736 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001737 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001738 },
1739 }
Jooyung Han749dc692020-04-15 11:03:39 +09001740 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001741
1742 expectLink := func(from, from_variant, to, to_variant string) {
1743 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1744 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1745 }
1746 expectNoLink := func(from, from_variant, to, to_variant string) {
1747 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1748 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1749 }
1750 // platform liba is linked to non-stub version
1751 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001752 // liba in myapex is linked to current
1753 expectLink("liba", "shared_apex29", "libz", "shared_current")
1754 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001755 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001756 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001757 // liba in otherapex is linked to current
1758 expectLink("liba", "shared_apex30", "libz", "shared_current")
1759 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001760 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1761 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001762}
1763
Jooyung Hanaed150d2020-04-02 01:41:41 +09001764func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["libx"],
1770 min_sdk_version: "R",
1771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "libx",
1781 shared_libs: ["libz"],
1782 system_shared_libs: [],
1783 stl: "none",
1784 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001785 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001786 }
1787
1788 cc_library {
1789 name: "libz",
1790 system_shared_libs: [],
1791 stl: "none",
1792 stubs: {
1793 versions: ["29", "R"],
1794 },
1795 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001796 `,
1797 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1798 variables.Platform_version_active_codenames = []string{"R"}
1799 }),
1800 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001801
1802 expectLink := func(from, from_variant, to, to_variant string) {
1803 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1804 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1805 }
1806 expectNoLink := func(from, from_variant, to, to_variant string) {
1807 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1808 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1809 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001810 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1811 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001812 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1813 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001814}
1815
Jooyung Han4c4da062021-06-23 10:23:16 +09001816func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1817 testApex(t, `
1818 apex {
1819 name: "myapex",
1820 key: "myapex.key",
1821 java_libs: ["libx"],
1822 min_sdk_version: "S",
1823 }
1824
1825 apex_key {
1826 name: "myapex.key",
1827 public_key: "testkey.avbpubkey",
1828 private_key: "testkey.pem",
1829 }
1830
1831 java_library {
1832 name: "libx",
1833 srcs: ["a.java"],
1834 apex_available: [ "myapex" ],
1835 sdk_version: "current",
1836 min_sdk_version: "S", // should be okay
1837 }
1838 `,
1839 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1840 variables.Platform_version_active_codenames = []string{"S"}
1841 variables.Platform_sdk_codename = proptools.StringPtr("S")
1842 }),
1843 )
1844}
1845
Jooyung Han749dc692020-04-15 11:03:39 +09001846func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001847 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001852 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 cc_library {
1862 name: "libx",
1863 shared_libs: ["libz"],
1864 system_shared_libs: [],
1865 stl: "none",
1866 apex_available: [ "myapex" ],
1867 }
1868
1869 cc_library {
1870 name: "libz",
1871 system_shared_libs: [],
1872 stl: "none",
1873 stubs: {
1874 versions: ["1", "2"],
1875 },
1876 }
1877 `)
1878
1879 expectLink := func(from, from_variant, to, to_variant string) {
1880 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1881 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1882 }
1883 expectNoLink := func(from, from_variant, to, to_variant string) {
1884 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1885 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1886 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001887 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001888 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001889 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001890 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001891}
1892
Jiyong Park5df7bd32021-08-25 16:18:46 +09001893func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1894 ctx := testApex(t, `
1895 apex {
1896 name: "myapex",
1897 key: "myapex.key",
1898 native_shared_libs: ["mylib"],
1899 updatable: false,
1900 vendor: true,
1901 min_sdk_version: "29",
1902 }
1903
1904 apex_key {
1905 name: "myapex.key",
1906 public_key: "testkey.avbpubkey",
1907 private_key: "testkey.pem",
1908 }
1909
1910 cc_library {
1911 name: "mylib",
1912 vendor_available: true,
1913 system_shared_libs: [],
1914 stl: "none",
1915 apex_available: [ "myapex" ],
1916 min_sdk_version: "29",
1917 }
1918 `)
1919
1920 vendorVariant := "android_vendor.29_arm64_armv8-a"
1921
1922 // First check that the correct variant of crtbegin_so is used.
1923 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1924 crtBegin := names(ldRule.Args["crtBegin"])
1925 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1926
1927 // Ensure that the crtbegin_so used by the APEX is targeting 29
1928 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1929 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1930}
1931
Jooyung Han03b51852020-02-26 22:45:42 +09001932func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001933 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001934 apex {
1935 name: "myapex",
1936 key: "myapex.key",
1937 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001938 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001939 }
1940
1941 apex_key {
1942 name: "myapex.key",
1943 public_key: "testkey.avbpubkey",
1944 private_key: "testkey.pem",
1945 }
1946
1947 cc_library {
1948 name: "libx",
1949 system_shared_libs: [],
1950 stl: "none",
1951 apex_available: [ "myapex" ],
1952 stubs: {
1953 versions: ["1", "2"],
1954 },
1955 }
1956
1957 cc_library {
1958 name: "libz",
1959 shared_libs: ["libx"],
1960 system_shared_libs: [],
1961 stl: "none",
1962 }
1963 `)
1964
1965 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001966 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001967 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1968 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1969 }
1970 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001971 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001972 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1973 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1974 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001975 expectLink("libz", "shared", "libx", "shared_current")
1976 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001977 expectNoLink("libz", "shared", "libz", "shared_1")
1978 expectNoLink("libz", "shared", "libz", "shared")
1979}
1980
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001981var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1982 func(variables android.FixtureProductVariables) {
1983 variables.SanitizeDevice = []string{"hwaddress"}
1984 },
1985)
1986
Jooyung Han75568392020-03-20 04:29:24 +09001987func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001988 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001989 apex {
1990 name: "myapex",
1991 key: "myapex.key",
1992 native_shared_libs: ["libx"],
1993 min_sdk_version: "29",
1994 }
1995
1996 apex_key {
1997 name: "myapex.key",
1998 public_key: "testkey.avbpubkey",
1999 private_key: "testkey.pem",
2000 }
2001
2002 cc_library {
2003 name: "libx",
2004 shared_libs: ["libbar"],
2005 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002006 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002007 }
2008
2009 cc_library {
2010 name: "libbar",
2011 stubs: {
2012 versions: ["29", "30"],
2013 },
2014 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002015 `,
2016 prepareForTestWithSantitizeHwaddress,
2017 )
Jooyung Han03b51852020-02-26 22:45:42 +09002018 expectLink := func(from, from_variant, to, to_variant string) {
2019 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2020 libFlags := ld.Args["libFlags"]
2021 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2022 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002023 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002024}
2025
Jooyung Han75568392020-03-20 04:29:24 +09002026func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002027 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002028 apex {
2029 name: "myapex",
2030 key: "myapex.key",
2031 native_shared_libs: ["libx"],
2032 min_sdk_version: "29",
2033 }
2034
2035 apex_key {
2036 name: "myapex.key",
2037 public_key: "testkey.avbpubkey",
2038 private_key: "testkey.pem",
2039 }
2040
2041 cc_library {
2042 name: "libx",
2043 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002044 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002045 }
Jooyung Han75568392020-03-20 04:29:24 +09002046 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002047
2048 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002049 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002050 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002051 // note that platform variant is not.
2052 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002053 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002054}
2055
Jooyung Han749dc692020-04-15 11:03:39 +09002056func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2057 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002058 apex {
2059 name: "myapex",
2060 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002061 native_shared_libs: ["mylib"],
2062 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002063 }
2064
2065 apex_key {
2066 name: "myapex.key",
2067 public_key: "testkey.avbpubkey",
2068 private_key: "testkey.pem",
2069 }
Jooyung Han749dc692020-04-15 11:03:39 +09002070
2071 cc_library {
2072 name: "mylib",
2073 srcs: ["mylib.cpp"],
2074 system_shared_libs: [],
2075 stl: "none",
2076 apex_available: [
2077 "myapex",
2078 ],
2079 min_sdk_version: "30",
2080 }
2081 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002082
2083 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2084 apex {
2085 name: "myapex",
2086 key: "myapex.key",
2087 native_shared_libs: ["libfoo.ffi"],
2088 min_sdk_version: "29",
2089 }
2090
2091 apex_key {
2092 name: "myapex.key",
2093 public_key: "testkey.avbpubkey",
2094 private_key: "testkey.pem",
2095 }
2096
2097 rust_ffi_shared {
2098 name: "libfoo.ffi",
2099 srcs: ["foo.rs"],
2100 crate_name: "foo",
2101 apex_available: [
2102 "myapex",
2103 ],
2104 min_sdk_version: "30",
2105 }
2106 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002107
2108 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2109 apex {
2110 name: "myapex",
2111 key: "myapex.key",
2112 java_libs: ["libfoo"],
2113 min_sdk_version: "29",
2114 }
2115
2116 apex_key {
2117 name: "myapex.key",
2118 public_key: "testkey.avbpubkey",
2119 private_key: "testkey.pem",
2120 }
2121
2122 java_import {
2123 name: "libfoo",
2124 jars: ["libfoo.jar"],
2125 apex_available: [
2126 "myapex",
2127 ],
2128 min_sdk_version: "30",
2129 }
2130 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002131}
2132
2133func TestApexMinSdkVersion_Okay(t *testing.T) {
2134 testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 native_shared_libs: ["libfoo"],
2139 java_libs: ["libbar"],
2140 min_sdk_version: "29",
2141 }
2142
2143 apex_key {
2144 name: "myapex.key",
2145 public_key: "testkey.avbpubkey",
2146 private_key: "testkey.pem",
2147 }
2148
2149 cc_library {
2150 name: "libfoo",
2151 srcs: ["mylib.cpp"],
2152 shared_libs: ["libfoo_dep"],
2153 apex_available: ["myapex"],
2154 min_sdk_version: "29",
2155 }
2156
2157 cc_library {
2158 name: "libfoo_dep",
2159 srcs: ["mylib.cpp"],
2160 apex_available: ["myapex"],
2161 min_sdk_version: "29",
2162 }
2163
2164 java_library {
2165 name: "libbar",
2166 sdk_version: "current",
2167 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002168 static_libs: [
2169 "libbar_dep",
2170 "libbar_import_dep",
2171 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002172 apex_available: ["myapex"],
2173 min_sdk_version: "29",
2174 }
2175
2176 java_library {
2177 name: "libbar_dep",
2178 sdk_version: "current",
2179 srcs: ["a.java"],
2180 apex_available: ["myapex"],
2181 min_sdk_version: "29",
2182 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002183
2184 java_import {
2185 name: "libbar_import_dep",
2186 jars: ["libbar.jar"],
2187 apex_available: ["myapex"],
2188 min_sdk_version: "29",
2189 }
Jooyung Han03b51852020-02-26 22:45:42 +09002190 `)
2191}
2192
Artur Satayev8cf899a2020-04-15 17:29:42 +01002193func TestJavaStableSdkVersion(t *testing.T) {
2194 testCases := []struct {
2195 name string
2196 expectedError string
2197 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002198 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002199 }{
2200 {
2201 name: "Non-updatable apex with non-stable dep",
2202 bp: `
2203 apex {
2204 name: "myapex",
2205 java_libs: ["myjar"],
2206 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002207 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002208 }
2209 apex_key {
2210 name: "myapex.key",
2211 public_key: "testkey.avbpubkey",
2212 private_key: "testkey.pem",
2213 }
2214 java_library {
2215 name: "myjar",
2216 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002217 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002218 apex_available: ["myapex"],
2219 }
2220 `,
2221 },
2222 {
2223 name: "Updatable apex with stable dep",
2224 bp: `
2225 apex {
2226 name: "myapex",
2227 java_libs: ["myjar"],
2228 key: "myapex.key",
2229 updatable: true,
2230 min_sdk_version: "29",
2231 }
2232 apex_key {
2233 name: "myapex.key",
2234 public_key: "testkey.avbpubkey",
2235 private_key: "testkey.pem",
2236 }
2237 java_library {
2238 name: "myjar",
2239 srcs: ["foo/bar/MyClass.java"],
2240 sdk_version: "current",
2241 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002242 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002243 }
2244 `,
2245 },
2246 {
2247 name: "Updatable apex with non-stable dep",
2248 expectedError: "cannot depend on \"myjar\"",
2249 bp: `
2250 apex {
2251 name: "myapex",
2252 java_libs: ["myjar"],
2253 key: "myapex.key",
2254 updatable: true,
2255 }
2256 apex_key {
2257 name: "myapex.key",
2258 public_key: "testkey.avbpubkey",
2259 private_key: "testkey.pem",
2260 }
2261 java_library {
2262 name: "myjar",
2263 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002264 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002265 apex_available: ["myapex"],
2266 }
2267 `,
2268 },
2269 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002270 name: "Updatable apex with non-stable legacy core platform dep",
2271 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2272 bp: `
2273 apex {
2274 name: "myapex",
2275 java_libs: ["myjar-uses-legacy"],
2276 key: "myapex.key",
2277 updatable: true,
2278 }
2279 apex_key {
2280 name: "myapex.key",
2281 public_key: "testkey.avbpubkey",
2282 private_key: "testkey.pem",
2283 }
2284 java_library {
2285 name: "myjar-uses-legacy",
2286 srcs: ["foo/bar/MyClass.java"],
2287 sdk_version: "core_platform",
2288 apex_available: ["myapex"],
2289 }
2290 `,
2291 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2292 },
2293 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002294 name: "Updatable apex with non-stable transitive dep",
2295 // This is not actually detecting that the transitive dependency is unstable, rather it is
2296 // detecting that the transitive dependency is building against a wider API surface than the
2297 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002298 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002299 bp: `
2300 apex {
2301 name: "myapex",
2302 java_libs: ["myjar"],
2303 key: "myapex.key",
2304 updatable: true,
2305 }
2306 apex_key {
2307 name: "myapex.key",
2308 public_key: "testkey.avbpubkey",
2309 private_key: "testkey.pem",
2310 }
2311 java_library {
2312 name: "myjar",
2313 srcs: ["foo/bar/MyClass.java"],
2314 sdk_version: "current",
2315 apex_available: ["myapex"],
2316 static_libs: ["transitive-jar"],
2317 }
2318 java_library {
2319 name: "transitive-jar",
2320 srcs: ["foo/bar/MyClass.java"],
2321 sdk_version: "core_platform",
2322 apex_available: ["myapex"],
2323 }
2324 `,
2325 },
2326 }
2327
2328 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002329 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2330 continue
2331 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002332 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002333 errorHandler := android.FixtureExpectsNoErrors
2334 if test.expectedError != "" {
2335 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002336 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002337 android.GroupFixturePreparers(
2338 java.PrepareForTestWithJavaDefaultModules,
2339 PrepareForTestWithApexBuildComponents,
2340 prepareForTestWithMyapex,
2341 android.OptionalFixturePreparer(test.preparer),
2342 ).
2343 ExtendWithErrorHandler(errorHandler).
2344 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002345 })
2346 }
2347}
2348
Jooyung Han749dc692020-04-15 11:03:39 +09002349func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2350 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2351 apex {
2352 name: "myapex",
2353 key: "myapex.key",
2354 native_shared_libs: ["mylib"],
2355 min_sdk_version: "29",
2356 }
2357
2358 apex_key {
2359 name: "myapex.key",
2360 public_key: "testkey.avbpubkey",
2361 private_key: "testkey.pem",
2362 }
2363
2364 cc_library {
2365 name: "mylib",
2366 srcs: ["mylib.cpp"],
2367 shared_libs: ["mylib2"],
2368 system_shared_libs: [],
2369 stl: "none",
2370 apex_available: [
2371 "myapex",
2372 ],
2373 min_sdk_version: "29",
2374 }
2375
2376 // indirect part of the apex
2377 cc_library {
2378 name: "mylib2",
2379 srcs: ["mylib.cpp"],
2380 system_shared_libs: [],
2381 stl: "none",
2382 apex_available: [
2383 "myapex",
2384 ],
2385 min_sdk_version: "30",
2386 }
2387 `)
2388}
2389
2390func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2391 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2392 apex {
2393 name: "myapex",
2394 key: "myapex.key",
2395 apps: ["AppFoo"],
2396 min_sdk_version: "29",
2397 }
2398
2399 apex_key {
2400 name: "myapex.key",
2401 public_key: "testkey.avbpubkey",
2402 private_key: "testkey.pem",
2403 }
2404
2405 android_app {
2406 name: "AppFoo",
2407 srcs: ["foo/bar/MyClass.java"],
2408 sdk_version: "current",
2409 min_sdk_version: "29",
2410 system_modules: "none",
2411 stl: "none",
2412 static_libs: ["bar"],
2413 apex_available: [ "myapex" ],
2414 }
2415
2416 java_library {
2417 name: "bar",
2418 sdk_version: "current",
2419 srcs: ["a.java"],
2420 apex_available: [ "myapex" ],
2421 }
2422 `)
2423}
2424
2425func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002426 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002427 apex {
2428 name: "myapex",
2429 key: "myapex.key",
2430 native_shared_libs: ["mylib"],
2431 min_sdk_version: "29",
2432 }
2433
2434 apex_key {
2435 name: "myapex.key",
2436 public_key: "testkey.avbpubkey",
2437 private_key: "testkey.pem",
2438 }
2439
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002440 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002441 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2442 cc_library {
2443 name: "mylib",
2444 srcs: ["mylib.cpp"],
2445 shared_libs: ["mylib2"],
2446 system_shared_libs: [],
2447 stl: "none",
2448 apex_available: ["myapex", "otherapex"],
2449 min_sdk_version: "29",
2450 }
2451
2452 cc_library {
2453 name: "mylib2",
2454 srcs: ["mylib.cpp"],
2455 system_shared_libs: [],
2456 stl: "none",
2457 apex_available: ["otherapex"],
2458 stubs: { versions: ["29", "30"] },
2459 min_sdk_version: "30",
2460 }
2461
2462 apex {
2463 name: "otherapex",
2464 key: "myapex.key",
2465 native_shared_libs: ["mylib", "mylib2"],
2466 min_sdk_version: "30",
2467 }
2468 `)
2469 expectLink := func(from, from_variant, to, to_variant string) {
2470 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2471 libFlags := ld.Args["libFlags"]
2472 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2473 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002474 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002475 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002476}
2477
Jooyung Haned124c32021-01-26 11:43:46 +09002478func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002479 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2480 func(variables android.FixtureProductVariables) {
2481 variables.Platform_sdk_codename = proptools.StringPtr("S")
2482 variables.Platform_version_active_codenames = []string{"S"}
2483 },
2484 )
Jooyung Haned124c32021-01-26 11:43:46 +09002485 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2486 apex {
2487 name: "myapex",
2488 key: "myapex.key",
2489 native_shared_libs: ["libfoo"],
2490 min_sdk_version: "S",
2491 }
2492 apex_key {
2493 name: "myapex.key",
2494 public_key: "testkey.avbpubkey",
2495 private_key: "testkey.pem",
2496 }
2497 cc_library {
2498 name: "libfoo",
2499 shared_libs: ["libbar"],
2500 apex_available: ["myapex"],
2501 min_sdk_version: "29",
2502 }
2503 cc_library {
2504 name: "libbar",
2505 apex_available: ["myapex"],
2506 }
2507 `, withSAsActiveCodeNames)
2508}
2509
2510func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002511 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2512 variables.Platform_sdk_codename = proptools.StringPtr("S")
2513 variables.Platform_version_active_codenames = []string{"S", "T"}
2514 })
Colin Cross1c460562021-02-16 17:55:47 -08002515 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002516 apex {
2517 name: "myapex",
2518 key: "myapex.key",
2519 native_shared_libs: ["libfoo"],
2520 min_sdk_version: "S",
2521 }
2522 apex_key {
2523 name: "myapex.key",
2524 public_key: "testkey.avbpubkey",
2525 private_key: "testkey.pem",
2526 }
2527 cc_library {
2528 name: "libfoo",
2529 shared_libs: ["libbar"],
2530 apex_available: ["myapex"],
2531 min_sdk_version: "S",
2532 }
2533 cc_library {
2534 name: "libbar",
2535 stubs: {
2536 symbol_file: "libbar.map.txt",
2537 versions: ["30", "S", "T"],
2538 },
2539 }
2540 `, withSAsActiveCodeNames)
2541
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002542 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002543 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2544 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002545 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002546}
2547
Jiyong Park7c2ee712018-12-07 00:42:25 +09002548func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002549 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002550 apex {
2551 name: "myapex",
2552 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002553 native_shared_libs: ["mylib"],
2554 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002555 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002556 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002557 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002558 }
2559
2560 apex_key {
2561 name: "myapex.key",
2562 public_key: "testkey.avbpubkey",
2563 private_key: "testkey.pem",
2564 }
2565
2566 prebuilt_etc {
2567 name: "myetc",
2568 src: "myprebuilt",
2569 sub_dir: "foo/bar",
2570 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002571
2572 cc_library {
2573 name: "mylib",
2574 srcs: ["mylib.cpp"],
2575 relative_install_path: "foo/bar",
2576 system_shared_libs: [],
2577 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002578 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002579 }
2580
2581 cc_binary {
2582 name: "mybin",
2583 srcs: ["mylib.cpp"],
2584 relative_install_path: "foo/bar",
2585 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002586 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002587 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002588 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002589 `)
2590
Sundong Ahnabb64432019-10-22 13:58:29 +09002591 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002592 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002593
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002594 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002595 ensureContains(t, cmd, "/etc ")
2596 ensureContains(t, cmd, "/etc/foo ")
2597 ensureContains(t, cmd, "/etc/foo/bar ")
2598 ensureContains(t, cmd, "/lib64 ")
2599 ensureContains(t, cmd, "/lib64/foo ")
2600 ensureContains(t, cmd, "/lib64/foo/bar ")
2601 ensureContains(t, cmd, "/lib ")
2602 ensureContains(t, cmd, "/lib/foo ")
2603 ensureContains(t, cmd, "/lib/foo/bar ")
2604 ensureContains(t, cmd, "/bin ")
2605 ensureContains(t, cmd, "/bin/foo ")
2606 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002607}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002608
Jooyung Han35155c42020-02-06 17:33:20 +09002609func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002610 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002611 apex {
2612 name: "myapex",
2613 key: "myapex.key",
2614 multilib: {
2615 both: {
2616 native_shared_libs: ["mylib"],
2617 binaries: ["mybin"],
2618 },
2619 },
2620 compile_multilib: "both",
2621 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002622 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002623 }
2624
2625 apex_key {
2626 name: "myapex.key",
2627 public_key: "testkey.avbpubkey",
2628 private_key: "testkey.pem",
2629 }
2630
2631 cc_library {
2632 name: "mylib",
2633 relative_install_path: "foo/bar",
2634 system_shared_libs: [],
2635 stl: "none",
2636 apex_available: [ "myapex" ],
2637 native_bridge_supported: true,
2638 }
2639
2640 cc_binary {
2641 name: "mybin",
2642 relative_install_path: "foo/bar",
2643 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002644 stl: "none",
2645 apex_available: [ "myapex" ],
2646 native_bridge_supported: true,
2647 compile_multilib: "both", // default is "first" for binary
2648 multilib: {
2649 lib64: {
2650 suffix: "64",
2651 },
2652 },
2653 }
2654 `, withNativeBridgeEnabled)
2655 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2656 "bin/foo/bar/mybin",
2657 "bin/foo/bar/mybin64",
2658 "bin/arm/foo/bar/mybin",
2659 "bin/arm64/foo/bar/mybin64",
2660 "lib/foo/bar/mylib.so",
2661 "lib/arm/foo/bar/mylib.so",
2662 "lib64/foo/bar/mylib.so",
2663 "lib64/arm64/foo/bar/mylib.so",
2664 })
2665}
2666
Jooyung Han85d61762020-06-24 23:50:26 +09002667func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002668 result := android.GroupFixturePreparers(
2669 prepareForApexTest,
2670 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2671 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002672 apex {
2673 name: "myapex",
2674 key: "myapex.key",
2675 binaries: ["mybin"],
2676 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002677 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002678 }
2679 apex_key {
2680 name: "myapex.key",
2681 public_key: "testkey.avbpubkey",
2682 private_key: "testkey.pem",
2683 }
2684 cc_binary {
2685 name: "mybin",
2686 vendor: true,
2687 shared_libs: ["libfoo"],
2688 }
2689 cc_library {
2690 name: "libfoo",
2691 proprietary: true,
2692 }
2693 `)
2694
Colin Crossc68db4b2021-11-11 18:59:15 -08002695 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002696 "bin/mybin",
2697 "lib64/libfoo.so",
2698 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2699 "lib64/libc++.so",
2700 })
2701
Colin Crossc68db4b2021-11-11 18:59:15 -08002702 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2703 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002704 name := apexBundle.BaseModuleName()
2705 prefix := "TARGET_"
2706 var builder strings.Builder
2707 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002708 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002709 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002710 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002711
Colin Crossc68db4b2021-11-11 18:59:15 -08002712 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002713 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2714 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002715}
2716
Jooyung Hanc5a96762022-02-04 11:54:50 +09002717func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2718 testApexError(t, `Trying to include a VNDK library`, `
2719 apex {
2720 name: "myapex",
2721 key: "myapex.key",
2722 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2723 vendor: true,
2724 use_vndk_as_stable: true,
2725 updatable: false,
2726 }
2727 apex_key {
2728 name: "myapex.key",
2729 public_key: "testkey.avbpubkey",
2730 private_key: "testkey.pem",
2731 }`)
2732}
2733
Jooyung Handf78e212020-07-22 15:54:47 +09002734func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002735 // myapex myapex2
2736 // | |
2737 // mybin ------. mybin2
2738 // \ \ / |
2739 // (stable) .---\--------` |
2740 // \ / \ |
2741 // \ / \ /
2742 // libvndk libvendor
2743 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002744 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002745 apex {
2746 name: "myapex",
2747 key: "myapex.key",
2748 binaries: ["mybin"],
2749 vendor: true,
2750 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002751 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002752 }
2753 apex_key {
2754 name: "myapex.key",
2755 public_key: "testkey.avbpubkey",
2756 private_key: "testkey.pem",
2757 }
2758 cc_binary {
2759 name: "mybin",
2760 vendor: true,
2761 shared_libs: ["libvndk", "libvendor"],
2762 }
2763 cc_library {
2764 name: "libvndk",
2765 vndk: {
2766 enabled: true,
2767 },
2768 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002769 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002770 }
2771 cc_library {
2772 name: "libvendor",
2773 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002774 stl: "none",
2775 }
2776 apex {
2777 name: "myapex2",
2778 key: "myapex.key",
2779 binaries: ["mybin2"],
2780 vendor: true,
2781 use_vndk_as_stable: false,
2782 updatable: false,
2783 }
2784 cc_binary {
2785 name: "mybin2",
2786 vendor: true,
2787 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002788 }
2789 `)
2790
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002791 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002792
Jooyung Han91f92032022-02-04 12:36:33 +09002793 for _, tc := range []struct {
2794 name string
2795 apexName string
2796 moduleName string
2797 moduleVariant string
2798 libs []string
2799 contents []string
2800 requireVndkNamespace bool
2801 }{
2802 {
2803 name: "use_vndk_as_stable",
2804 apexName: "myapex",
2805 moduleName: "mybin",
2806 moduleVariant: vendorVariant + "_apex10000",
2807 libs: []string{
2808 // should link with vendor variants of VNDK libs(libvndk/libc++)
2809 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2810 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2811 // unstable Vendor libs as APEX variant
2812 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2813 },
2814 contents: []string{
2815 "bin/mybin",
2816 "lib64/libvendor.so",
2817 // VNDK libs (libvndk/libc++) are not included
2818 },
2819 requireVndkNamespace: true,
2820 },
2821 {
2822 name: "!use_vndk_as_stable",
2823 apexName: "myapex2",
2824 moduleName: "mybin2",
2825 moduleVariant: vendorVariant + "_myapex2",
2826 libs: []string{
2827 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2828 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2829 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2830 // unstable vendor libs have "merged" APEX variants
2831 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2832 },
2833 contents: []string{
2834 "bin/mybin2",
2835 "lib64/libvendor.so",
2836 // VNDK libs are included as well
2837 "lib64/libvndk.so",
2838 "lib64/libc++.so",
2839 },
2840 requireVndkNamespace: false,
2841 },
2842 } {
2843 t.Run(tc.name, func(t *testing.T) {
2844 // Check linked libs
2845 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2846 libs := names(ldRule.Args["libFlags"])
2847 for _, lib := range tc.libs {
2848 ensureListContains(t, libs, lib)
2849 }
2850 // Check apex contents
2851 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002852
Jooyung Han91f92032022-02-04 12:36:33 +09002853 // Check "requireNativeLibs"
2854 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2855 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2856 if tc.requireVndkNamespace {
2857 ensureListContains(t, requireNativeLibs, ":vndk")
2858 } else {
2859 ensureListNotContains(t, requireNativeLibs, ":vndk")
2860 }
2861 })
2862 }
Jooyung Handf78e212020-07-22 15:54:47 +09002863}
2864
Justin Yun13decfb2021-03-08 19:25:55 +09002865func TestProductVariant(t *testing.T) {
2866 ctx := testApex(t, `
2867 apex {
2868 name: "myapex",
2869 key: "myapex.key",
2870 updatable: false,
2871 product_specific: true,
2872 binaries: ["foo"],
2873 }
2874
2875 apex_key {
2876 name: "myapex.key",
2877 public_key: "testkey.avbpubkey",
2878 private_key: "testkey.pem",
2879 }
2880
2881 cc_binary {
2882 name: "foo",
2883 product_available: true,
2884 apex_available: ["myapex"],
2885 srcs: ["foo.cpp"],
2886 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002887 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2888 variables.ProductVndkVersion = proptools.StringPtr("current")
2889 }),
2890 )
Justin Yun13decfb2021-03-08 19:25:55 +09002891
2892 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002893 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002894 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2895 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2896 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2897 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2898}
2899
Jooyung Han8e5685d2020-09-21 11:02:57 +09002900func TestApex_withPrebuiltFirmware(t *testing.T) {
2901 testCases := []struct {
2902 name string
2903 additionalProp string
2904 }{
2905 {"system apex with prebuilt_firmware", ""},
2906 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2907 }
2908 for _, tc := range testCases {
2909 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002910 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002911 apex {
2912 name: "myapex",
2913 key: "myapex.key",
2914 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002915 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002916 `+tc.additionalProp+`
2917 }
2918 apex_key {
2919 name: "myapex.key",
2920 public_key: "testkey.avbpubkey",
2921 private_key: "testkey.pem",
2922 }
2923 prebuilt_firmware {
2924 name: "myfirmware",
2925 src: "myfirmware.bin",
2926 filename_from_src: true,
2927 `+tc.additionalProp+`
2928 }
2929 `)
2930 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2931 "etc/firmware/myfirmware.bin",
2932 })
2933 })
2934 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002935}
2936
Jooyung Hanefb184e2020-06-25 17:14:25 +09002937func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002938 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002939 apex {
2940 name: "myapex",
2941 key: "myapex.key",
2942 vendor: true,
2943 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002944 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002945 }
2946
2947 apex_key {
2948 name: "myapex.key",
2949 public_key: "testkey.avbpubkey",
2950 private_key: "testkey.pem",
2951 }
2952
2953 cc_library {
2954 name: "mylib",
2955 vendor_available: true,
2956 }
2957 `)
2958
2959 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002960 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002961 name := apexBundle.BaseModuleName()
2962 prefix := "TARGET_"
2963 var builder strings.Builder
2964 data.Custom(&builder, name, prefix, "", data)
2965 androidMk := builder.String()
2966 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2967}
2968
Jooyung Han2ed99d02020-06-24 23:26:26 +09002969func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002970 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002971 apex {
2972 name: "myapex",
2973 key: "myapex.key",
2974 vintf_fragments: ["fragment.xml"],
2975 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002976 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002977 }
2978 apex_key {
2979 name: "myapex.key",
2980 public_key: "testkey.avbpubkey",
2981 private_key: "testkey.pem",
2982 }
2983 cc_binary {
2984 name: "mybin",
2985 }
2986 `)
2987
2988 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002989 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002990 name := apexBundle.BaseModuleName()
2991 prefix := "TARGET_"
2992 var builder strings.Builder
2993 data.Custom(&builder, name, prefix, "", data)
2994 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002995 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002996 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002997}
2998
Jiyong Park16e91a02018-12-20 18:18:08 +09002999func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003000 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003001 apex {
3002 name: "myapex",
3003 key: "myapex.key",
3004 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003005 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003006 }
3007
3008 apex_key {
3009 name: "myapex.key",
3010 public_key: "testkey.avbpubkey",
3011 private_key: "testkey.pem",
3012 }
3013
3014 cc_library {
3015 name: "mylib",
3016 srcs: ["mylib.cpp"],
3017 system_shared_libs: [],
3018 stl: "none",
3019 stubs: {
3020 versions: ["1", "2", "3"],
3021 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003022 apex_available: [
3023 "//apex_available:platform",
3024 "myapex",
3025 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003026 }
3027
3028 cc_binary {
3029 name: "not_in_apex",
3030 srcs: ["mylib.cpp"],
3031 static_libs: ["mylib"],
3032 static_executable: true,
3033 system_shared_libs: [],
3034 stl: "none",
3035 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003036 `)
3037
Colin Cross7113d202019-11-20 16:39:12 -08003038 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003039
3040 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003041 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003042}
Jiyong Park9335a262018-12-24 11:31:58 +09003043
3044func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003045 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003046 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003047 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003048 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003049 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003050 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003051 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003052 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003053 }
3054
3055 cc_library {
3056 name: "mylib",
3057 srcs: ["mylib.cpp"],
3058 system_shared_libs: [],
3059 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003060 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003061 }
3062
3063 apex_key {
3064 name: "myapex.key",
3065 public_key: "testkey.avbpubkey",
3066 private_key: "testkey.pem",
3067 }
3068
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003069 android_app_certificate {
3070 name: "myapex.certificate",
3071 certificate: "testkey",
3072 }
3073
3074 android_app_certificate {
3075 name: "myapex.certificate.override",
3076 certificate: "testkey.override",
3077 }
3078
Jiyong Park9335a262018-12-24 11:31:58 +09003079 `)
3080
3081 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003082 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003083
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003084 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3085 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003086 "vendor/foo/devkeys/testkey.avbpubkey")
3087 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003088 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3089 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003090 "vendor/foo/devkeys/testkey.pem")
3091 }
3092
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003093 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003094 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003095 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003096 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003097 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003098 }
3099}
Jiyong Park58e364a2019-01-19 19:24:06 +09003100
Jooyung Hanf121a652019-12-17 14:30:11 +09003101func TestCertificate(t *testing.T) {
3102 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003103 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003104 apex {
3105 name: "myapex",
3106 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003107 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003108 }
3109 apex_key {
3110 name: "myapex.key",
3111 public_key: "testkey.avbpubkey",
3112 private_key: "testkey.pem",
3113 }`)
3114 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3115 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3116 if actual := rule.Args["certificates"]; actual != expected {
3117 t.Errorf("certificates should be %q, not %q", expected, actual)
3118 }
3119 })
3120 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003121 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003122 apex {
3123 name: "myapex_keytest",
3124 key: "myapex.key",
3125 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003126 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003127 }
3128 apex_key {
3129 name: "myapex.key",
3130 public_key: "testkey.avbpubkey",
3131 private_key: "testkey.pem",
3132 }
3133 android_app_certificate {
3134 name: "myapex.certificate.override",
3135 certificate: "testkey.override",
3136 }`)
3137 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3138 expected := "testkey.override.x509.pem testkey.override.pk8"
3139 if actual := rule.Args["certificates"]; actual != expected {
3140 t.Errorf("certificates should be %q, not %q", expected, actual)
3141 }
3142 })
3143 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003144 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003145 apex {
3146 name: "myapex",
3147 key: "myapex.key",
3148 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003149 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003150 }
3151 apex_key {
3152 name: "myapex.key",
3153 public_key: "testkey.avbpubkey",
3154 private_key: "testkey.pem",
3155 }
3156 android_app_certificate {
3157 name: "myapex.certificate",
3158 certificate: "testkey",
3159 }`)
3160 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3161 expected := "testkey.x509.pem testkey.pk8"
3162 if actual := rule.Args["certificates"]; actual != expected {
3163 t.Errorf("certificates should be %q, not %q", expected, actual)
3164 }
3165 })
3166 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003167 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003168 apex {
3169 name: "myapex_keytest",
3170 key: "myapex.key",
3171 file_contexts: ":myapex-file_contexts",
3172 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003173 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003174 }
3175 apex_key {
3176 name: "myapex.key",
3177 public_key: "testkey.avbpubkey",
3178 private_key: "testkey.pem",
3179 }
3180 android_app_certificate {
3181 name: "myapex.certificate.override",
3182 certificate: "testkey.override",
3183 }`)
3184 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3185 expected := "testkey.override.x509.pem testkey.override.pk8"
3186 if actual := rule.Args["certificates"]; actual != expected {
3187 t.Errorf("certificates should be %q, not %q", expected, actual)
3188 }
3189 })
3190 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003191 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003192 apex {
3193 name: "myapex",
3194 key: "myapex.key",
3195 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003196 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003197 }
3198 apex_key {
3199 name: "myapex.key",
3200 public_key: "testkey.avbpubkey",
3201 private_key: "testkey.pem",
3202 }`)
3203 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3204 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3205 if actual := rule.Args["certificates"]; actual != expected {
3206 t.Errorf("certificates should be %q, not %q", expected, actual)
3207 }
3208 })
3209 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003210 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003211 apex {
3212 name: "myapex_keytest",
3213 key: "myapex.key",
3214 file_contexts: ":myapex-file_contexts",
3215 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003216 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003217 }
3218 apex_key {
3219 name: "myapex.key",
3220 public_key: "testkey.avbpubkey",
3221 private_key: "testkey.pem",
3222 }
3223 android_app_certificate {
3224 name: "myapex.certificate.override",
3225 certificate: "testkey.override",
3226 }`)
3227 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3228 expected := "testkey.override.x509.pem testkey.override.pk8"
3229 if actual := rule.Args["certificates"]; actual != expected {
3230 t.Errorf("certificates should be %q, not %q", expected, actual)
3231 }
3232 })
3233}
3234
Jiyong Park58e364a2019-01-19 19:24:06 +09003235func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003236 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003237 apex {
3238 name: "myapex",
3239 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003240 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003241 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003242 }
3243
3244 apex {
3245 name: "otherapex",
3246 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003247 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003248 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003249 }
3250
3251 apex_key {
3252 name: "myapex.key",
3253 public_key: "testkey.avbpubkey",
3254 private_key: "testkey.pem",
3255 }
3256
3257 cc_library {
3258 name: "mylib",
3259 srcs: ["mylib.cpp"],
3260 system_shared_libs: [],
3261 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003262 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003263 "myapex",
3264 "otherapex",
3265 ],
Jooyung Han24282772020-03-21 23:20:55 +09003266 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003267 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003268 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003269 cc_library {
3270 name: "mylib2",
3271 srcs: ["mylib.cpp"],
3272 system_shared_libs: [],
3273 stl: "none",
3274 apex_available: [
3275 "myapex",
3276 "otherapex",
3277 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003278 static_libs: ["mylib3"],
3279 recovery_available: true,
3280 min_sdk_version: "29",
3281 }
3282 cc_library {
3283 name: "mylib3",
3284 srcs: ["mylib.cpp"],
3285 system_shared_libs: [],
3286 stl: "none",
3287 apex_available: [
3288 "myapex",
3289 "otherapex",
3290 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003291 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003292 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003293 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003294 `)
3295
Jooyung Hanc87a0592020-03-02 17:44:33 +09003296 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003297 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003298 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003299 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003300
Jooyung Hanccce2f22020-03-07 03:45:53 +09003301 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003302 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003303 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003304 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003305
Jooyung Hanccce2f22020-03-07 03:45:53 +09003306 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003307 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003308 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003309 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003310
Colin Crossaede88c2020-08-11 12:17:01 -07003311 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3312 // each variant defines additional macros to distinguish which apex variant it is built for
3313
3314 // non-APEX variant does not have __ANDROID_APEX__ defined
3315 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3316 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3317
Dan Albertb19953d2020-11-17 15:29:36 -08003318 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003319 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3320 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003321 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003322
Jooyung Hanc87a0592020-03-02 17:44:33 +09003323 // non-APEX variant does not have __ANDROID_APEX__ defined
3324 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3325 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3326
Dan Albertb19953d2020-11-17 15:29:36 -08003327 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003328 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003329 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003330 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003331}
Jiyong Park7e636d02019-01-28 16:16:54 +09003332
3333func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003334 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003335 apex {
3336 name: "myapex",
3337 key: "myapex.key",
3338 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003339 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003340 }
3341
3342 apex_key {
3343 name: "myapex.key",
3344 public_key: "testkey.avbpubkey",
3345 private_key: "testkey.pem",
3346 }
3347
3348 cc_library_headers {
3349 name: "mylib_headers",
3350 export_include_dirs: ["my_include"],
3351 system_shared_libs: [],
3352 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003353 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003354 }
3355
3356 cc_library {
3357 name: "mylib",
3358 srcs: ["mylib.cpp"],
3359 system_shared_libs: [],
3360 stl: "none",
3361 header_libs: ["mylib_headers"],
3362 export_header_lib_headers: ["mylib_headers"],
3363 stubs: {
3364 versions: ["1", "2", "3"],
3365 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003366 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003367 }
3368
3369 cc_library {
3370 name: "otherlib",
3371 srcs: ["mylib.cpp"],
3372 system_shared_libs: [],
3373 stl: "none",
3374 shared_libs: ["mylib"],
3375 }
3376 `)
3377
Colin Cross7113d202019-11-20 16:39:12 -08003378 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003379
3380 // Ensure that the include path of the header lib is exported to 'otherlib'
3381 ensureContains(t, cFlags, "-Imy_include")
3382}
Alex Light9670d332019-01-29 18:07:33 -08003383
Jiyong Park7cd10e32020-01-14 09:22:18 +09003384type fileInApex struct {
3385 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003386 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003387 isLink bool
3388}
3389
Jooyung Hana57af4a2020-01-23 05:36:59 +00003390func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003391 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003392 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003393 copyCmds := apexRule.Args["copy_commands"]
3394 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003395 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003396 for _, cmd := range strings.Split(copyCmds, "&&") {
3397 cmd = strings.TrimSpace(cmd)
3398 if cmd == "" {
3399 continue
3400 }
3401 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003402 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003403 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003404 switch terms[0] {
3405 case "mkdir":
3406 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003407 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003408 t.Fatal("copyCmds contains invalid cp command", cmd)
3409 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003410 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003411 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003412 isLink = false
3413 case "ln":
3414 if len(terms) != 3 && len(terms) != 4 {
3415 // ln LINK TARGET or ln -s LINK TARGET
3416 t.Fatal("copyCmds contains invalid ln command", cmd)
3417 }
3418 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003419 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003420 isLink = true
3421 default:
3422 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3423 }
3424 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003425 index := strings.Index(dst, imageApexDir)
3426 if index == -1 {
3427 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3428 }
3429 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003430 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003431 }
3432 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003433 return ret
3434}
3435
Jooyung Hana57af4a2020-01-23 05:36:59 +00003436func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3437 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003438 var failed bool
3439 var surplus []string
3440 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003441 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003442 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003443 for _, expected := range files {
3444 if matched, _ := path.Match(expected, file.path); matched {
3445 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003446 mactchFound = true
3447 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003448 }
3449 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003450 if !mactchFound {
3451 surplus = append(surplus, file.path)
3452 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003453 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003454
Jooyung Han31c470b2019-10-18 16:26:59 +09003455 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003456 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003457 t.Log("surplus files", surplus)
3458 failed = true
3459 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003460
3461 if len(files) > len(filesMatched) {
3462 var missing []string
3463 for _, expected := range files {
3464 if !filesMatched[expected] {
3465 missing = append(missing, expected)
3466 }
3467 }
3468 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003469 t.Log("missing files", missing)
3470 failed = true
3471 }
3472 if failed {
3473 t.Fail()
3474 }
3475}
3476
Jooyung Han344d5432019-08-23 11:17:39 +09003477func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003478 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003479 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003480 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003481 "etc/llndk.libraries.29.txt",
3482 "etc/vndkcore.libraries.29.txt",
3483 "etc/vndksp.libraries.29.txt",
3484 "etc/vndkprivate.libraries.29.txt",
3485 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003486 }
3487 testCases := []struct {
3488 vndkVersion string
3489 expectedFiles []string
3490 }{
3491 {
3492 vndkVersion: "current",
3493 expectedFiles: append(commonFiles,
3494 "lib/libvndk.so",
3495 "lib/libvndksp.so",
3496 "lib64/libvndk.so",
3497 "lib64/libvndksp.so"),
3498 },
3499 {
3500 vndkVersion: "",
3501 expectedFiles: append(commonFiles,
3502 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3503 "lib/libvndksp.so",
3504 "lib64/libvndksp.so"),
3505 },
3506 }
3507 for _, tc := range testCases {
3508 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3509 ctx := testApex(t, `
3510 apex_vndk {
3511 name: "com.android.vndk.current",
3512 key: "com.android.vndk.current.key",
3513 updatable: false,
3514 }
3515
3516 apex_key {
3517 name: "com.android.vndk.current.key",
3518 public_key: "testkey.avbpubkey",
3519 private_key: "testkey.pem",
3520 }
3521
3522 cc_library {
3523 name: "libvndk",
3524 srcs: ["mylib.cpp"],
3525 vendor_available: true,
3526 product_available: true,
3527 vndk: {
3528 enabled: true,
3529 },
3530 system_shared_libs: [],
3531 stl: "none",
3532 apex_available: [ "com.android.vndk.current" ],
3533 }
3534
3535 cc_library {
3536 name: "libvndksp",
3537 srcs: ["mylib.cpp"],
3538 vendor_available: true,
3539 product_available: true,
3540 vndk: {
3541 enabled: true,
3542 support_system_process: true,
3543 },
3544 system_shared_libs: [],
3545 stl: "none",
3546 apex_available: [ "com.android.vndk.current" ],
3547 }
3548
3549 // VNDK-Ext should not cause any problems
3550
3551 cc_library {
3552 name: "libvndk.ext",
3553 srcs: ["mylib2.cpp"],
3554 vendor: true,
3555 vndk: {
3556 enabled: true,
3557 extends: "libvndk",
3558 },
3559 system_shared_libs: [],
3560 stl: "none",
3561 }
3562
3563 cc_library {
3564 name: "libvndksp.ext",
3565 srcs: ["mylib2.cpp"],
3566 vendor: true,
3567 vndk: {
3568 enabled: true,
3569 support_system_process: true,
3570 extends: "libvndksp",
3571 },
3572 system_shared_libs: [],
3573 stl: "none",
3574 }
3575 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3576 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3577 }))
3578 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3579 })
3580 }
Jooyung Han344d5432019-08-23 11:17:39 +09003581}
3582
3583func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003584 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003585 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003586 name: "com.android.vndk.current",
3587 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003588 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003589 }
3590
3591 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003592 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003593 public_key: "testkey.avbpubkey",
3594 private_key: "testkey.pem",
3595 }
3596
3597 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003598 name: "libvndk",
3599 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003600 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003601 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003602 vndk: {
3603 enabled: true,
3604 },
3605 system_shared_libs: [],
3606 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003607 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003608 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003609
3610 cc_prebuilt_library_shared {
3611 name: "libvndk.arm",
3612 srcs: ["libvndk.arm.so"],
3613 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003614 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003615 vndk: {
3616 enabled: true,
3617 },
3618 enabled: false,
3619 arch: {
3620 arm: {
3621 enabled: true,
3622 },
3623 },
3624 system_shared_libs: [],
3625 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003626 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003627 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003628 `+vndkLibrariesTxtFiles("current"),
3629 withFiles(map[string][]byte{
3630 "libvndk.so": nil,
3631 "libvndk.arm.so": nil,
3632 }))
Colin Cross2807f002021-03-02 10:15:29 -08003633 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003634 "lib/libvndk.so",
3635 "lib/libvndk.arm.so",
3636 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003637 "lib/libc++.so",
3638 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003639 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003640 })
Jooyung Han344d5432019-08-23 11:17:39 +09003641}
3642
Jooyung Han39edb6c2019-11-06 16:53:07 +09003643func vndkLibrariesTxtFiles(vers ...string) (result string) {
3644 for _, v := range vers {
3645 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003646 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003647 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003648 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003649 name: "` + txt + `.libraries.txt",
3650 }
3651 `
3652 }
3653 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003654 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003655 result += `
3656 prebuilt_etc {
3657 name: "` + txt + `.libraries.` + v + `.txt",
3658 src: "dummy.txt",
3659 }
3660 `
3661 }
3662 }
3663 }
3664 return
3665}
3666
Jooyung Han344d5432019-08-23 11:17:39 +09003667func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003668 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003669 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003670 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003671 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003672 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003673 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003674 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003675 }
3676
3677 apex_key {
3678 name: "myapex.key",
3679 public_key: "testkey.avbpubkey",
3680 private_key: "testkey.pem",
3681 }
3682
Jooyung Han31c470b2019-10-18 16:26:59 +09003683 vndk_prebuilt_shared {
3684 name: "libvndk27",
3685 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003686 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003687 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003688 vndk: {
3689 enabled: true,
3690 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003691 target_arch: "arm64",
3692 arch: {
3693 arm: {
3694 srcs: ["libvndk27_arm.so"],
3695 },
3696 arm64: {
3697 srcs: ["libvndk27_arm64.so"],
3698 },
3699 },
Colin Cross2807f002021-03-02 10:15:29 -08003700 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003701 }
3702
3703 vndk_prebuilt_shared {
3704 name: "libvndk27",
3705 version: "27",
3706 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003707 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003708 vndk: {
3709 enabled: true,
3710 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003711 target_arch: "x86_64",
3712 arch: {
3713 x86: {
3714 srcs: ["libvndk27_x86.so"],
3715 },
3716 x86_64: {
3717 srcs: ["libvndk27_x86_64.so"],
3718 },
3719 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003720 }
3721 `+vndkLibrariesTxtFiles("27"),
3722 withFiles(map[string][]byte{
3723 "libvndk27_arm.so": nil,
3724 "libvndk27_arm64.so": nil,
3725 "libvndk27_x86.so": nil,
3726 "libvndk27_x86_64.so": nil,
3727 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003728
Colin Cross2807f002021-03-02 10:15:29 -08003729 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003730 "lib/libvndk27_arm.so",
3731 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003732 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003733 })
Jooyung Han344d5432019-08-23 11:17:39 +09003734}
3735
Jooyung Han90eee022019-10-01 20:02:42 +09003736func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003737 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003738 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003739 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003740 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003741 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003742 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003743 }
3744 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003745 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003746 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003747 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003748 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003749 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003750 }
3751 apex_key {
3752 name: "myapex.key",
3753 public_key: "testkey.avbpubkey",
3754 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003755 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003756
3757 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003758 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003759 actual := proptools.String(bundle.properties.Apex_name)
3760 if !reflect.DeepEqual(actual, expected) {
3761 t.Errorf("Got '%v', expected '%v'", actual, expected)
3762 }
3763 }
3764
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003765 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003766 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003767}
3768
Jooyung Han344d5432019-08-23 11:17:39 +09003769func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003770 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003771 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003772 name: "com.android.vndk.current",
3773 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003774 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003775 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003776 }
3777
3778 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003779 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003780 public_key: "testkey.avbpubkey",
3781 private_key: "testkey.pem",
3782 }
3783
3784 cc_library {
3785 name: "libvndk",
3786 srcs: ["mylib.cpp"],
3787 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003788 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003789 native_bridge_supported: true,
3790 host_supported: true,
3791 vndk: {
3792 enabled: true,
3793 },
3794 system_shared_libs: [],
3795 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003796 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003797 }
Colin Cross2807f002021-03-02 10:15:29 -08003798 `+vndkLibrariesTxtFiles("current"),
3799 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003800
Colin Cross2807f002021-03-02 10:15:29 -08003801 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003802 "lib/libvndk.so",
3803 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003804 "lib/libc++.so",
3805 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003806 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003807 })
Jooyung Han344d5432019-08-23 11:17:39 +09003808}
3809
3810func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003811 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003812 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003813 name: "com.android.vndk.current",
3814 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003815 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003816 native_bridge_supported: true,
3817 }
3818
3819 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003820 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003821 public_key: "testkey.avbpubkey",
3822 private_key: "testkey.pem",
3823 }
3824
3825 cc_library {
3826 name: "libvndk",
3827 srcs: ["mylib.cpp"],
3828 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003829 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003830 native_bridge_supported: true,
3831 host_supported: true,
3832 vndk: {
3833 enabled: true,
3834 },
3835 system_shared_libs: [],
3836 stl: "none",
3837 }
3838 `)
3839}
3840
Jooyung Han31c470b2019-10-18 16:26:59 +09003841func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003842 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003843 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003844 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003845 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003846 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003847 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003848 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003849 }
3850
3851 apex_key {
3852 name: "myapex.key",
3853 public_key: "testkey.avbpubkey",
3854 private_key: "testkey.pem",
3855 }
3856
3857 vndk_prebuilt_shared {
3858 name: "libvndk27",
3859 version: "27",
3860 target_arch: "arm",
3861 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003862 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003863 vndk: {
3864 enabled: true,
3865 },
3866 arch: {
3867 arm: {
3868 srcs: ["libvndk27.so"],
3869 }
3870 },
3871 }
3872
3873 vndk_prebuilt_shared {
3874 name: "libvndk27",
3875 version: "27",
3876 target_arch: "arm",
3877 binder32bit: true,
3878 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003879 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003880 vndk: {
3881 enabled: true,
3882 },
3883 arch: {
3884 arm: {
3885 srcs: ["libvndk27binder32.so"],
3886 }
3887 },
Colin Cross2807f002021-03-02 10:15:29 -08003888 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003889 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003890 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003891 withFiles(map[string][]byte{
3892 "libvndk27.so": nil,
3893 "libvndk27binder32.so": nil,
3894 }),
3895 withBinder32bit,
3896 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003897 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003898 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3899 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003900 },
3901 }),
3902 )
3903
Colin Cross2807f002021-03-02 10:15:29 -08003904 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003905 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003906 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003907 })
3908}
3909
Jooyung Han45a96772020-06-15 14:59:42 +09003910func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003911 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003912 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003913 name: "com.android.vndk.current",
3914 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003915 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003916 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003917 }
3918
3919 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003920 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003921 public_key: "testkey.avbpubkey",
3922 private_key: "testkey.pem",
3923 }
3924
3925 cc_library {
3926 name: "libz",
3927 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003928 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003929 vndk: {
3930 enabled: true,
3931 },
3932 stubs: {
3933 symbol_file: "libz.map.txt",
3934 versions: ["30"],
3935 }
3936 }
3937 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3938 "libz.map.txt": nil,
3939 }))
3940
Colin Cross2807f002021-03-02 10:15:29 -08003941 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003942 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3943 ensureListEmpty(t, provideNativeLibs)
3944}
3945
Jooyung Hane1633032019-08-01 17:41:43 +09003946func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003947 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003948 apex {
3949 name: "myapex_nodep",
3950 key: "myapex.key",
3951 native_shared_libs: ["lib_nodep"],
3952 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003953 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003954 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003955 }
3956
3957 apex {
3958 name: "myapex_dep",
3959 key: "myapex.key",
3960 native_shared_libs: ["lib_dep"],
3961 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003962 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003963 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003964 }
3965
3966 apex {
3967 name: "myapex_provider",
3968 key: "myapex.key",
3969 native_shared_libs: ["libfoo"],
3970 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003971 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003972 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003973 }
3974
3975 apex {
3976 name: "myapex_selfcontained",
3977 key: "myapex.key",
3978 native_shared_libs: ["lib_dep", "libfoo"],
3979 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003980 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003981 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003982 }
3983
3984 apex_key {
3985 name: "myapex.key",
3986 public_key: "testkey.avbpubkey",
3987 private_key: "testkey.pem",
3988 }
3989
3990 cc_library {
3991 name: "lib_nodep",
3992 srcs: ["mylib.cpp"],
3993 system_shared_libs: [],
3994 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003995 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003996 }
3997
3998 cc_library {
3999 name: "lib_dep",
4000 srcs: ["mylib.cpp"],
4001 shared_libs: ["libfoo"],
4002 system_shared_libs: [],
4003 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004004 apex_available: [
4005 "myapex_dep",
4006 "myapex_provider",
4007 "myapex_selfcontained",
4008 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004009 }
4010
4011 cc_library {
4012 name: "libfoo",
4013 srcs: ["mytest.cpp"],
4014 stubs: {
4015 versions: ["1"],
4016 },
4017 system_shared_libs: [],
4018 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004019 apex_available: [
4020 "myapex_provider",
4021 "myapex_selfcontained",
4022 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004023 }
4024 `)
4025
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004026 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004027 var provideNativeLibs, requireNativeLibs []string
4028
Sundong Ahnabb64432019-10-22 13:58:29 +09004029 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004030 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4031 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004032 ensureListEmpty(t, provideNativeLibs)
4033 ensureListEmpty(t, requireNativeLibs)
4034
Sundong Ahnabb64432019-10-22 13:58:29 +09004035 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004036 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4037 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004038 ensureListEmpty(t, provideNativeLibs)
4039 ensureListContains(t, requireNativeLibs, "libfoo.so")
4040
Sundong Ahnabb64432019-10-22 13:58:29 +09004041 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004042 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4043 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004044 ensureListContains(t, provideNativeLibs, "libfoo.so")
4045 ensureListEmpty(t, requireNativeLibs)
4046
Sundong Ahnabb64432019-10-22 13:58:29 +09004047 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004048 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4049 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004050 ensureListContains(t, provideNativeLibs, "libfoo.so")
4051 ensureListEmpty(t, requireNativeLibs)
4052}
4053
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004054func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004055 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004056 apex {
4057 name: "myapex",
4058 key: "myapex.key",
4059 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004060 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004061 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004062 }
4063
4064 apex_key {
4065 name: "myapex.key",
4066 public_key: "testkey.avbpubkey",
4067 private_key: "testkey.pem",
4068 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004069
4070 cc_library {
4071 name: "mylib",
4072 srcs: ["mylib.cpp"],
4073 system_shared_libs: [],
4074 stl: "none",
4075 apex_available: [
4076 "//apex_available:platform",
4077 "myapex",
4078 ],
4079 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004080 `)
4081
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004082 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004083 apexManifestRule := module.Rule("apexManifestRule")
4084 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4085 apexRule := module.Rule("apexRule")
4086 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004087
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004088 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004089 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004090 name := apexBundle.BaseModuleName()
4091 prefix := "TARGET_"
4092 var builder strings.Builder
4093 data.Custom(&builder, name, prefix, "", data)
4094 androidMk := builder.String()
4095 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4096 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004097}
4098
Alex Light0851b882019-02-07 13:20:53 -08004099func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004100 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004101 apex {
4102 name: "myapex",
4103 key: "myapex.key",
4104 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004105 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004106 }
4107
4108 apex_key {
4109 name: "myapex.key",
4110 public_key: "testkey.avbpubkey",
4111 private_key: "testkey.pem",
4112 }
4113
4114 cc_library {
4115 name: "mylib_common",
4116 srcs: ["mylib.cpp"],
4117 system_shared_libs: [],
4118 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004119 apex_available: [
4120 "//apex_available:platform",
4121 "myapex",
4122 ],
Alex Light0851b882019-02-07 13:20:53 -08004123 }
4124 `)
4125
Sundong Ahnabb64432019-10-22 13:58:29 +09004126 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004127 apexRule := module.Rule("apexRule")
4128 copyCmds := apexRule.Args["copy_commands"]
4129
4130 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4131 t.Log("Apex was a test apex!")
4132 t.Fail()
4133 }
4134 // Ensure that main rule creates an output
4135 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4136
4137 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004138 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004139
4140 // Ensure that both direct and indirect deps are copied into apex
4141 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4142
Colin Cross7113d202019-11-20 16:39:12 -08004143 // Ensure that the platform variant ends with _shared
4144 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004145
Colin Cross56a83212020-09-15 18:30:11 -07004146 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004147 t.Log("Found mylib_common not in any apex!")
4148 t.Fail()
4149 }
4150}
4151
4152func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004153 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004154 apex_test {
4155 name: "myapex",
4156 key: "myapex.key",
4157 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004158 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004159 }
4160
4161 apex_key {
4162 name: "myapex.key",
4163 public_key: "testkey.avbpubkey",
4164 private_key: "testkey.pem",
4165 }
4166
4167 cc_library {
4168 name: "mylib_common_test",
4169 srcs: ["mylib.cpp"],
4170 system_shared_libs: [],
4171 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004172 // TODO: remove //apex_available:platform
4173 apex_available: [
4174 "//apex_available:platform",
4175 "myapex",
4176 ],
Alex Light0851b882019-02-07 13:20:53 -08004177 }
4178 `)
4179
Sundong Ahnabb64432019-10-22 13:58:29 +09004180 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004181 apexRule := module.Rule("apexRule")
4182 copyCmds := apexRule.Args["copy_commands"]
4183
4184 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4185 t.Log("Apex was not a test apex!")
4186 t.Fail()
4187 }
4188 // Ensure that main rule creates an output
4189 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4190
4191 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004192 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004193
4194 // Ensure that both direct and indirect deps are copied into apex
4195 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4196
Colin Cross7113d202019-11-20 16:39:12 -08004197 // Ensure that the platform variant ends with _shared
4198 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004199}
4200
Alex Light9670d332019-01-29 18:07:33 -08004201func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004202 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004203 apex {
4204 name: "myapex",
4205 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004206 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004207 multilib: {
4208 first: {
4209 native_shared_libs: ["mylib_common"],
4210 }
4211 },
4212 target: {
4213 android: {
4214 multilib: {
4215 first: {
4216 native_shared_libs: ["mylib"],
4217 }
4218 }
4219 },
4220 host: {
4221 multilib: {
4222 first: {
4223 native_shared_libs: ["mylib2"],
4224 }
4225 }
4226 }
4227 }
4228 }
4229
4230 apex_key {
4231 name: "myapex.key",
4232 public_key: "testkey.avbpubkey",
4233 private_key: "testkey.pem",
4234 }
4235
4236 cc_library {
4237 name: "mylib",
4238 srcs: ["mylib.cpp"],
4239 system_shared_libs: [],
4240 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004241 // TODO: remove //apex_available:platform
4242 apex_available: [
4243 "//apex_available:platform",
4244 "myapex",
4245 ],
Alex Light9670d332019-01-29 18:07:33 -08004246 }
4247
4248 cc_library {
4249 name: "mylib_common",
4250 srcs: ["mylib.cpp"],
4251 system_shared_libs: [],
4252 stl: "none",
4253 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004254 // TODO: remove //apex_available:platform
4255 apex_available: [
4256 "//apex_available:platform",
4257 "myapex",
4258 ],
Alex Light9670d332019-01-29 18:07:33 -08004259 }
4260
4261 cc_library {
4262 name: "mylib2",
4263 srcs: ["mylib.cpp"],
4264 system_shared_libs: [],
4265 stl: "none",
4266 compile_multilib: "first",
4267 }
4268 `)
4269
Sundong Ahnabb64432019-10-22 13:58:29 +09004270 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004271 copyCmds := apexRule.Args["copy_commands"]
4272
4273 // Ensure that main rule creates an output
4274 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4275
4276 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004277 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4278 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4279 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004280
4281 // Ensure that both direct and indirect deps are copied into apex
4282 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4283 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4284 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4285
Colin Cross7113d202019-11-20 16:39:12 -08004286 // Ensure that the platform variant ends with _shared
4287 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4288 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4289 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004290}
Jiyong Park04480cf2019-02-06 00:16:29 +09004291
Jiyong Park59140302020-12-14 18:44:04 +09004292func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004293 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004294 apex {
4295 name: "myapex",
4296 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004297 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004298 arch: {
4299 arm64: {
4300 native_shared_libs: ["mylib.arm64"],
4301 },
4302 x86_64: {
4303 native_shared_libs: ["mylib.x64"],
4304 },
4305 }
4306 }
4307
4308 apex_key {
4309 name: "myapex.key",
4310 public_key: "testkey.avbpubkey",
4311 private_key: "testkey.pem",
4312 }
4313
4314 cc_library {
4315 name: "mylib.arm64",
4316 srcs: ["mylib.cpp"],
4317 system_shared_libs: [],
4318 stl: "none",
4319 // TODO: remove //apex_available:platform
4320 apex_available: [
4321 "//apex_available:platform",
4322 "myapex",
4323 ],
4324 }
4325
4326 cc_library {
4327 name: "mylib.x64",
4328 srcs: ["mylib.cpp"],
4329 system_shared_libs: [],
4330 stl: "none",
4331 // TODO: remove //apex_available:platform
4332 apex_available: [
4333 "//apex_available:platform",
4334 "myapex",
4335 ],
4336 }
4337 `)
4338
4339 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4340 copyCmds := apexRule.Args["copy_commands"]
4341
4342 // Ensure that apex variant is created for the direct dep
4343 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4344 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4345
4346 // Ensure that both direct and indirect deps are copied into apex
4347 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4348 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4349}
4350
Jiyong Park04480cf2019-02-06 00:16:29 +09004351func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004352 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004353 apex {
4354 name: "myapex",
4355 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004356 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004357 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004358 }
4359
4360 apex_key {
4361 name: "myapex.key",
4362 public_key: "testkey.avbpubkey",
4363 private_key: "testkey.pem",
4364 }
4365
4366 sh_binary {
4367 name: "myscript",
4368 src: "mylib.cpp",
4369 filename: "myscript.sh",
4370 sub_dir: "script",
4371 }
4372 `)
4373
Sundong Ahnabb64432019-10-22 13:58:29 +09004374 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004375 copyCmds := apexRule.Args["copy_commands"]
4376
4377 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4378}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004379
Jooyung Han91df2082019-11-20 01:49:42 +09004380func TestApexInVariousPartition(t *testing.T) {
4381 testcases := []struct {
4382 propName, parition, flattenedPartition string
4383 }{
4384 {"", "system", "system_ext"},
4385 {"product_specific: true", "product", "product"},
4386 {"soc_specific: true", "vendor", "vendor"},
4387 {"proprietary: true", "vendor", "vendor"},
4388 {"vendor: true", "vendor", "vendor"},
4389 {"system_ext_specific: true", "system_ext", "system_ext"},
4390 }
4391 for _, tc := range testcases {
4392 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004393 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004394 apex {
4395 name: "myapex",
4396 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004397 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004398 `+tc.propName+`
4399 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004400
Jooyung Han91df2082019-11-20 01:49:42 +09004401 apex_key {
4402 name: "myapex.key",
4403 public_key: "testkey.avbpubkey",
4404 private_key: "testkey.pem",
4405 }
4406 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004407
Jooyung Han91df2082019-11-20 01:49:42 +09004408 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004409 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4410 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004411 if actual != expected {
4412 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4413 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004414
Jooyung Han91df2082019-11-20 01:49:42 +09004415 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004416 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4417 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004418 if actual != expected {
4419 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4420 }
4421 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004422 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004423}
Jiyong Park67882562019-03-21 01:11:21 +09004424
Jooyung Han580eb4f2020-06-24 19:33:06 +09004425func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004426 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004427 apex {
4428 name: "myapex",
4429 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004430 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004431 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004432
Jooyung Han580eb4f2020-06-24 19:33:06 +09004433 apex_key {
4434 name: "myapex.key",
4435 public_key: "testkey.avbpubkey",
4436 private_key: "testkey.pem",
4437 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004438 `)
4439 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004440 rule := module.Output("file_contexts")
4441 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4442}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004443
Jooyung Han580eb4f2020-06-24 19:33:06 +09004444func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004445 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004446 apex {
4447 name: "myapex",
4448 key: "myapex.key",
4449 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004450 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004451 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004452
Jooyung Han580eb4f2020-06-24 19:33:06 +09004453 apex_key {
4454 name: "myapex.key",
4455 public_key: "testkey.avbpubkey",
4456 private_key: "testkey.pem",
4457 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004458 `, withFiles(map[string][]byte{
4459 "my_own_file_contexts": nil,
4460 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004461}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004462
Jooyung Han580eb4f2020-06-24 19:33:06 +09004463func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004464 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004465 apex {
4466 name: "myapex",
4467 key: "myapex.key",
4468 product_specific: true,
4469 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004470 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004471 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004472
Jooyung Han580eb4f2020-06-24 19:33:06 +09004473 apex_key {
4474 name: "myapex.key",
4475 public_key: "testkey.avbpubkey",
4476 private_key: "testkey.pem",
4477 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004478 `)
4479
Colin Cross1c460562021-02-16 17:55:47 -08004480 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004481 apex {
4482 name: "myapex",
4483 key: "myapex.key",
4484 product_specific: true,
4485 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004486 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004487 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004488
Jooyung Han580eb4f2020-06-24 19:33:06 +09004489 apex_key {
4490 name: "myapex.key",
4491 public_key: "testkey.avbpubkey",
4492 private_key: "testkey.pem",
4493 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004494 `, withFiles(map[string][]byte{
4495 "product_specific_file_contexts": nil,
4496 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004497 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4498 rule := module.Output("file_contexts")
4499 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4500}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004501
Jooyung Han580eb4f2020-06-24 19:33:06 +09004502func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004503 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004504 apex {
4505 name: "myapex",
4506 key: "myapex.key",
4507 product_specific: true,
4508 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004509 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004510 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004511
Jooyung Han580eb4f2020-06-24 19:33:06 +09004512 apex_key {
4513 name: "myapex.key",
4514 public_key: "testkey.avbpubkey",
4515 private_key: "testkey.pem",
4516 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004517
Jooyung Han580eb4f2020-06-24 19:33:06 +09004518 filegroup {
4519 name: "my-file-contexts",
4520 srcs: ["product_specific_file_contexts"],
4521 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004522 `, withFiles(map[string][]byte{
4523 "product_specific_file_contexts": nil,
4524 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004525 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4526 rule := module.Output("file_contexts")
4527 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004528}
4529
Jiyong Park67882562019-03-21 01:11:21 +09004530func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004531 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004532 apex_key {
4533 name: "myapex.key",
4534 public_key: ":my.avbpubkey",
4535 private_key: ":my.pem",
4536 product_specific: true,
4537 }
4538
4539 filegroup {
4540 name: "my.avbpubkey",
4541 srcs: ["testkey2.avbpubkey"],
4542 }
4543
4544 filegroup {
4545 name: "my.pem",
4546 srcs: ["testkey2.pem"],
4547 }
4548 `)
4549
4550 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4551 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004552 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004553 if actual_pubkey != expected_pubkey {
4554 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4555 }
4556 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004557 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004558 if actual_privkey != expected_privkey {
4559 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4560 }
4561}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004562
4563func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004564 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004565 prebuilt_apex {
4566 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004567 arch: {
4568 arm64: {
4569 src: "myapex-arm64.apex",
4570 },
4571 arm: {
4572 src: "myapex-arm.apex",
4573 },
4574 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004575 }
4576 `)
4577
Wei Li340ee8e2022-03-18 17:33:24 -07004578 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4579 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004580
Jiyong Parkc95714e2019-03-29 14:23:10 +09004581 expectedInput := "myapex-arm64.apex"
4582 if prebuilt.inputApex.String() != expectedInput {
4583 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4584 }
Wei Li340ee8e2022-03-18 17:33:24 -07004585 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4586 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4587 rule := testingModule.Rule("genProvenanceMetaData")
4588 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4589 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4590 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4591 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004592}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004593
Paul Duffinc0609c62021-03-01 17:27:16 +00004594func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004595 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004596 prebuilt_apex {
4597 name: "myapex",
4598 }
4599 `)
4600}
4601
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004602func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004603 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004604 prebuilt_apex {
4605 name: "myapex",
4606 src: "myapex-arm.apex",
4607 filename: "notmyapex.apex",
4608 }
4609 `)
4610
Wei Li340ee8e2022-03-18 17:33:24 -07004611 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4612 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004613
4614 expected := "notmyapex.apex"
4615 if p.installFilename != expected {
4616 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4617 }
Wei Li340ee8e2022-03-18 17:33:24 -07004618 rule := testingModule.Rule("genProvenanceMetaData")
4619 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4620 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4621 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4622 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004623}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004624
Samiul Islam7c02e262021-09-08 17:48:28 +01004625func TestApexSetFilenameOverride(t *testing.T) {
4626 testApex(t, `
4627 apex_set {
4628 name: "com.company.android.myapex",
4629 apex_name: "com.android.myapex",
4630 set: "company-myapex.apks",
4631 filename: "com.company.android.myapex.apex"
4632 }
4633 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4634
4635 testApex(t, `
4636 apex_set {
4637 name: "com.company.android.myapex",
4638 apex_name: "com.android.myapex",
4639 set: "company-myapex.apks",
4640 filename: "com.company.android.myapex.capex"
4641 }
4642 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4643
4644 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4645 apex_set {
4646 name: "com.company.android.myapex",
4647 apex_name: "com.android.myapex",
4648 set: "company-myapex.apks",
4649 filename: "some-random-suffix"
4650 }
4651 `)
4652}
4653
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004654func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004655 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004656 prebuilt_apex {
4657 name: "myapex.prebuilt",
4658 src: "myapex-arm.apex",
4659 overrides: [
4660 "myapex",
4661 ],
4662 }
4663 `)
4664
Wei Li340ee8e2022-03-18 17:33:24 -07004665 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4666 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004667
4668 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004669 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004670 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004671 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004672 }
Wei Li340ee8e2022-03-18 17:33:24 -07004673 rule := testingModule.Rule("genProvenanceMetaData")
4674 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4675 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4676 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4677 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004678}
4679
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004680func TestPrebuiltApexName(t *testing.T) {
4681 testApex(t, `
4682 prebuilt_apex {
4683 name: "com.company.android.myapex",
4684 apex_name: "com.android.myapex",
4685 src: "company-myapex-arm.apex",
4686 }
4687 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4688
4689 testApex(t, `
4690 apex_set {
4691 name: "com.company.android.myapex",
4692 apex_name: "com.android.myapex",
4693 set: "company-myapex.apks",
4694 }
4695 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4696}
4697
4698func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4699 _ = android.GroupFixturePreparers(
4700 java.PrepareForTestWithJavaDefaultModules,
4701 PrepareForTestWithApexBuildComponents,
4702 android.FixtureWithRootAndroidBp(`
4703 platform_bootclasspath {
4704 name: "platform-bootclasspath",
4705 fragments: [
4706 {
4707 apex: "com.android.art",
4708 module: "art-bootclasspath-fragment",
4709 },
4710 ],
4711 }
4712
4713 prebuilt_apex {
4714 name: "com.company.android.art",
4715 apex_name: "com.android.art",
4716 src: "com.company.android.art-arm.apex",
4717 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4718 }
4719
4720 prebuilt_bootclasspath_fragment {
4721 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004722 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004723 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004724 hidden_api: {
4725 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4726 metadata: "my-bootclasspath-fragment/metadata.csv",
4727 index: "my-bootclasspath-fragment/index.csv",
4728 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4729 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4730 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004731 }
4732
4733 java_import {
4734 name: "core-oj",
4735 jars: ["prebuilt.jar"],
4736 }
4737 `),
4738 ).RunTest(t)
4739}
4740
Paul Duffin092153d2021-01-26 11:42:39 +00004741// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4742// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004743func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004744 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004745
Paul Duffin89886cb2021-02-05 16:44:03 +00004746 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004747 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004748 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004749 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004750 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004751 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004752 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4753 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4754 android.NormalizePathForTesting(dexJarBuildPath))
4755 }
4756
4757 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004758 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004759 // Make sure the import has been given the correct path to the dex jar.
4760 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4761 dexJarBuildPath := p.DexJarInstallPath()
4762 stem := android.RemoveOptionalPrebuiltPrefix(name)
4763 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4764 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4765 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004766 }
4767
Paul Duffin39853512021-02-26 11:09:39 +00004768 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004769 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004770 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004771 android.AssertArrayString(t, "Check if there is no source variant",
4772 []string{"android_common"},
4773 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004774 }
4775
4776 t.Run("prebuilt only", func(t *testing.T) {
4777 bp := `
4778 prebuilt_apex {
4779 name: "myapex",
4780 arch: {
4781 arm64: {
4782 src: "myapex-arm64.apex",
4783 },
4784 arm: {
4785 src: "myapex-arm.apex",
4786 },
4787 },
Paul Duffin39853512021-02-26 11:09:39 +00004788 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004789 }
4790
4791 java_import {
4792 name: "libfoo",
4793 jars: ["libfoo.jar"],
4794 }
Paul Duffin39853512021-02-26 11:09:39 +00004795
4796 java_sdk_library_import {
4797 name: "libbar",
4798 public: {
4799 jars: ["libbar.jar"],
4800 },
4801 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004802 `
4803
4804 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4805 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4806
Martin Stjernholm44825602021-09-17 01:44:12 +01004807 deapexerName := deapexerModuleName("myapex")
4808 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4809
Paul Duffinf6932af2021-02-26 18:21:56 +00004810 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004811 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004812 rule := deapexer.Rule("deapexer")
4813 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4814 t.Errorf("expected: %q, found: %q", expected, actual)
4815 }
4816
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004817 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004818 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004819 rule = prebuiltApex.Rule("android/soong/android.Cp")
4820 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4821 t.Errorf("expected: %q, found: %q", expected, actual)
4822 }
4823
Paul Duffin89886cb2021-02-05 16:44:03 +00004824 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004825 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004826
4827 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004828 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004829 })
4830
4831 t.Run("prebuilt with source preferred", func(t *testing.T) {
4832
4833 bp := `
4834 prebuilt_apex {
4835 name: "myapex",
4836 arch: {
4837 arm64: {
4838 src: "myapex-arm64.apex",
4839 },
4840 arm: {
4841 src: "myapex-arm.apex",
4842 },
4843 },
Paul Duffin39853512021-02-26 11:09:39 +00004844 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004845 }
4846
4847 java_import {
4848 name: "libfoo",
4849 jars: ["libfoo.jar"],
4850 }
4851
4852 java_library {
4853 name: "libfoo",
4854 }
Paul Duffin39853512021-02-26 11:09:39 +00004855
4856 java_sdk_library_import {
4857 name: "libbar",
4858 public: {
4859 jars: ["libbar.jar"],
4860 },
4861 }
4862
4863 java_sdk_library {
4864 name: "libbar",
4865 srcs: ["foo/bar/MyClass.java"],
4866 unsafe_ignore_missing_latest_api: true,
4867 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004868 `
4869
4870 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4871 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4872
Paul Duffin89886cb2021-02-05 16:44:03 +00004873 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004874 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004875 ensureNoSourceVariant(t, ctx, "libfoo")
4876
4877 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004878 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004879 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004880 })
4881
4882 t.Run("prebuilt preferred with source", func(t *testing.T) {
4883 bp := `
4884 prebuilt_apex {
4885 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004886 arch: {
4887 arm64: {
4888 src: "myapex-arm64.apex",
4889 },
4890 arm: {
4891 src: "myapex-arm.apex",
4892 },
4893 },
Paul Duffin39853512021-02-26 11:09:39 +00004894 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004895 }
4896
4897 java_import {
4898 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004899 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004900 jars: ["libfoo.jar"],
4901 }
4902
4903 java_library {
4904 name: "libfoo",
4905 }
Paul Duffin39853512021-02-26 11:09:39 +00004906
4907 java_sdk_library_import {
4908 name: "libbar",
4909 prefer: true,
4910 public: {
4911 jars: ["libbar.jar"],
4912 },
4913 }
4914
4915 java_sdk_library {
4916 name: "libbar",
4917 srcs: ["foo/bar/MyClass.java"],
4918 unsafe_ignore_missing_latest_api: true,
4919 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004920 `
4921
4922 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4923 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4924
Paul Duffin89886cb2021-02-05 16:44:03 +00004925 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004926 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004927 ensureNoSourceVariant(t, ctx, "libfoo")
4928
4929 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004930 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004931 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004932 })
4933}
4934
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004935func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004936 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004937 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004938 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4939 // is disabled.
4940 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4941 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004942
Paul Duffin37856732021-02-26 14:24:15 +00004943 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4944 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004945 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004946 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004947 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004948 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004949 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004950 foundLibfooJar = true
4951 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004952 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004953 }
4954 }
4955 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004956 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 +00004957 }
4958 }
4959
Paul Duffin40a3f652021-07-19 13:11:24 +01004960 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004961 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004962 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004963 var rule android.TestingBuildParams
4964
4965 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4966 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004967 }
4968
Paul Duffin40a3f652021-07-19 13:11:24 +01004969 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4970 t.Helper()
4971 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4972 var rule android.TestingBuildParams
4973
4974 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4975 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4976 }
4977
Paul Duffin89f570a2021-06-16 01:42:33 +01004978 fragment := java.ApexVariantReference{
4979 Apex: proptools.StringPtr("myapex"),
4980 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4981 }
4982
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004983 t.Run("prebuilt only", func(t *testing.T) {
4984 bp := `
4985 prebuilt_apex {
4986 name: "myapex",
4987 arch: {
4988 arm64: {
4989 src: "myapex-arm64.apex",
4990 },
4991 arm: {
4992 src: "myapex-arm.apex",
4993 },
4994 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004995 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4996 }
4997
4998 prebuilt_bootclasspath_fragment {
4999 name: "my-bootclasspath-fragment",
5000 contents: ["libfoo", "libbar"],
5001 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005002 hidden_api: {
5003 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5004 metadata: "my-bootclasspath-fragment/metadata.csv",
5005 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005006 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5007 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5008 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005009 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005010 }
5011
5012 java_import {
5013 name: "libfoo",
5014 jars: ["libfoo.jar"],
5015 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005016 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005017 }
Paul Duffin37856732021-02-26 14:24:15 +00005018
5019 java_sdk_library_import {
5020 name: "libbar",
5021 public: {
5022 jars: ["libbar.jar"],
5023 },
5024 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005025 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005026 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005027 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005028 `
5029
Paul Duffin89f570a2021-06-16 01:42:33 +01005030 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005031 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5032 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005033
Paul Duffin537ea3d2021-05-14 10:38:00 +01005034 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005035 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005036 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005037 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005038 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5039 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005040 })
5041
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005042 t.Run("apex_set only", func(t *testing.T) {
5043 bp := `
5044 apex_set {
5045 name: "myapex",
5046 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005047 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5048 }
5049
5050 prebuilt_bootclasspath_fragment {
5051 name: "my-bootclasspath-fragment",
5052 contents: ["libfoo", "libbar"],
5053 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005054 hidden_api: {
5055 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5056 metadata: "my-bootclasspath-fragment/metadata.csv",
5057 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005058 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5059 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5060 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005061 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005062 }
5063
5064 java_import {
5065 name: "libfoo",
5066 jars: ["libfoo.jar"],
5067 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005068 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005069 }
5070
5071 java_sdk_library_import {
5072 name: "libbar",
5073 public: {
5074 jars: ["libbar.jar"],
5075 },
5076 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005077 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005078 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005079 }
5080 `
5081
Paul Duffin89f570a2021-06-16 01:42:33 +01005082 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005083 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5084 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5085
Paul Duffin537ea3d2021-05-14 10:38:00 +01005086 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005087 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005088 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005089 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005090 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5091 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005092 })
5093
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005094 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5095 bp := `
5096 prebuilt_apex {
5097 name: "myapex",
5098 arch: {
5099 arm64: {
5100 src: "myapex-arm64.apex",
5101 },
5102 arm: {
5103 src: "myapex-arm.apex",
5104 },
5105 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005106 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5107 }
5108
5109 prebuilt_bootclasspath_fragment {
5110 name: "my-bootclasspath-fragment",
5111 contents: ["libfoo", "libbar"],
5112 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005113 hidden_api: {
5114 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5115 metadata: "my-bootclasspath-fragment/metadata.csv",
5116 index: "my-bootclasspath-fragment/index.csv",
5117 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5118 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5119 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005120 }
5121
5122 java_import {
5123 name: "libfoo",
5124 jars: ["libfoo.jar"],
5125 apex_available: ["myapex"],
5126 }
5127
5128 java_library {
5129 name: "libfoo",
5130 srcs: ["foo/bar/MyClass.java"],
5131 apex_available: ["myapex"],
5132 }
Paul Duffin37856732021-02-26 14:24:15 +00005133
5134 java_sdk_library_import {
5135 name: "libbar",
5136 public: {
5137 jars: ["libbar.jar"],
5138 },
5139 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005140 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005141 }
5142
5143 java_sdk_library {
5144 name: "libbar",
5145 srcs: ["foo/bar/MyClass.java"],
5146 unsafe_ignore_missing_latest_api: true,
5147 apex_available: ["myapex"],
5148 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005149 `
5150
5151 // In this test the source (java_library) libfoo is active since the
5152 // prebuilt (java_import) defaults to prefer:false. However the
5153 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5154 // find the dex boot jar in it. We either need to disable the source libfoo
5155 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005156 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005157 // dexbootjar check is skipped if AllowMissingDependencies is true
5158 preparerAllowMissingDeps := android.GroupFixturePreparers(
5159 preparer,
5160 android.PrepareForTestWithAllowMissingDependencies,
5161 )
5162 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005163 })
5164
5165 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5166 bp := `
5167 prebuilt_apex {
5168 name: "myapex",
5169 arch: {
5170 arm64: {
5171 src: "myapex-arm64.apex",
5172 },
5173 arm: {
5174 src: "myapex-arm.apex",
5175 },
5176 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005177 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5178 }
5179
5180 prebuilt_bootclasspath_fragment {
5181 name: "my-bootclasspath-fragment",
5182 contents: ["libfoo", "libbar"],
5183 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005184 hidden_api: {
5185 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5186 metadata: "my-bootclasspath-fragment/metadata.csv",
5187 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005188 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5189 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5190 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005191 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005192 }
5193
5194 java_import {
5195 name: "libfoo",
5196 prefer: true,
5197 jars: ["libfoo.jar"],
5198 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005199 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005200 }
5201
5202 java_library {
5203 name: "libfoo",
5204 srcs: ["foo/bar/MyClass.java"],
5205 apex_available: ["myapex"],
5206 }
Paul Duffin37856732021-02-26 14:24:15 +00005207
5208 java_sdk_library_import {
5209 name: "libbar",
5210 prefer: true,
5211 public: {
5212 jars: ["libbar.jar"],
5213 },
5214 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005215 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005216 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005217 }
5218
5219 java_sdk_library {
5220 name: "libbar",
5221 srcs: ["foo/bar/MyClass.java"],
5222 unsafe_ignore_missing_latest_api: true,
5223 apex_available: ["myapex"],
5224 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005225 `
5226
Paul Duffin89f570a2021-06-16 01:42:33 +01005227 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005228 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5229 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005230
Paul Duffin537ea3d2021-05-14 10:38:00 +01005231 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005232 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005233 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005234 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005235 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5236 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005237 })
5238
5239 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5240 bp := `
5241 apex {
5242 name: "myapex",
5243 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005244 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005245 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005246 }
5247
5248 apex_key {
5249 name: "myapex.key",
5250 public_key: "testkey.avbpubkey",
5251 private_key: "testkey.pem",
5252 }
5253
5254 prebuilt_apex {
5255 name: "myapex",
5256 arch: {
5257 arm64: {
5258 src: "myapex-arm64.apex",
5259 },
5260 arm: {
5261 src: "myapex-arm.apex",
5262 },
5263 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005264 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5265 }
5266
5267 prebuilt_bootclasspath_fragment {
5268 name: "my-bootclasspath-fragment",
5269 contents: ["libfoo", "libbar"],
5270 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005271 hidden_api: {
5272 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5273 metadata: "my-bootclasspath-fragment/metadata.csv",
5274 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005275 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5276 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5277 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005278 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005279 }
5280
5281 java_import {
5282 name: "libfoo",
5283 jars: ["libfoo.jar"],
5284 apex_available: ["myapex"],
5285 }
5286
5287 java_library {
5288 name: "libfoo",
5289 srcs: ["foo/bar/MyClass.java"],
5290 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005291 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005292 }
Paul Duffin37856732021-02-26 14:24:15 +00005293
5294 java_sdk_library_import {
5295 name: "libbar",
5296 public: {
5297 jars: ["libbar.jar"],
5298 },
5299 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005300 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005301 }
5302
5303 java_sdk_library {
5304 name: "libbar",
5305 srcs: ["foo/bar/MyClass.java"],
5306 unsafe_ignore_missing_latest_api: true,
5307 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005308 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005309 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005310 `
5311
Paul Duffin89f570a2021-06-16 01:42:33 +01005312 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005313 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5314 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005315
Paul Duffin537ea3d2021-05-14 10:38:00 +01005316 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005317 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005318 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005319 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005320 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5321 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005322 })
5323
5324 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5325 bp := `
5326 apex {
5327 name: "myapex",
5328 enabled: false,
5329 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005330 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005331 }
5332
5333 apex_key {
5334 name: "myapex.key",
5335 public_key: "testkey.avbpubkey",
5336 private_key: "testkey.pem",
5337 }
5338
5339 prebuilt_apex {
5340 name: "myapex",
5341 arch: {
5342 arm64: {
5343 src: "myapex-arm64.apex",
5344 },
5345 arm: {
5346 src: "myapex-arm.apex",
5347 },
5348 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005349 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5350 }
5351
5352 prebuilt_bootclasspath_fragment {
5353 name: "my-bootclasspath-fragment",
5354 contents: ["libfoo", "libbar"],
5355 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005356 hidden_api: {
5357 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5358 metadata: "my-bootclasspath-fragment/metadata.csv",
5359 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005360 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5361 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5362 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005363 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005364 }
5365
5366 java_import {
5367 name: "libfoo",
5368 prefer: true,
5369 jars: ["libfoo.jar"],
5370 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005371 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005372 }
5373
5374 java_library {
5375 name: "libfoo",
5376 srcs: ["foo/bar/MyClass.java"],
5377 apex_available: ["myapex"],
5378 }
Paul Duffin37856732021-02-26 14:24:15 +00005379
5380 java_sdk_library_import {
5381 name: "libbar",
5382 prefer: true,
5383 public: {
5384 jars: ["libbar.jar"],
5385 },
5386 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005387 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005388 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005389 }
5390
5391 java_sdk_library {
5392 name: "libbar",
5393 srcs: ["foo/bar/MyClass.java"],
5394 unsafe_ignore_missing_latest_api: true,
5395 apex_available: ["myapex"],
5396 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005397 `
5398
Paul Duffin89f570a2021-06-16 01:42:33 +01005399 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005400 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5401 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005402
Paul Duffin537ea3d2021-05-14 10:38:00 +01005403 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005404 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005405 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005406 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005407 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5408 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005409 })
5410}
5411
Roland Levillain630846d2019-06-26 12:48:34 +01005412func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005413 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005414 apex_test {
5415 name: "myapex",
5416 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005417 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005418 tests: [
5419 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005420 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005421 ],
5422 }
5423
5424 apex_key {
5425 name: "myapex.key",
5426 public_key: "testkey.avbpubkey",
5427 private_key: "testkey.pem",
5428 }
5429
Liz Kammer1c14a212020-05-12 15:26:55 -07005430 filegroup {
5431 name: "fg",
5432 srcs: [
5433 "baz",
5434 "bar/baz"
5435 ],
5436 }
5437
Roland Levillain630846d2019-06-26 12:48:34 +01005438 cc_test {
5439 name: "mytest",
5440 gtest: false,
5441 srcs: ["mytest.cpp"],
5442 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005443 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005444 system_shared_libs: [],
5445 static_executable: true,
5446 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005447 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005448 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005449
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005450 cc_library {
5451 name: "mylib",
5452 srcs: ["mylib.cpp"],
5453 system_shared_libs: [],
5454 stl: "none",
5455 }
5456
Liz Kammer5bd365f2020-05-27 15:15:11 -07005457 filegroup {
5458 name: "fg2",
5459 srcs: [
5460 "testdata/baz"
5461 ],
5462 }
5463
Roland Levillain9b5fde92019-06-28 15:41:19 +01005464 cc_test {
5465 name: "mytests",
5466 gtest: false,
5467 srcs: [
5468 "mytest1.cpp",
5469 "mytest2.cpp",
5470 "mytest3.cpp",
5471 ],
5472 test_per_src: true,
5473 relative_install_path: "test",
5474 system_shared_libs: [],
5475 static_executable: true,
5476 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005477 data: [
5478 ":fg",
5479 ":fg2",
5480 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005481 }
Roland Levillain630846d2019-06-26 12:48:34 +01005482 `)
5483
Sundong Ahnabb64432019-10-22 13:58:29 +09005484 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005485 copyCmds := apexRule.Args["copy_commands"]
5486
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005487 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005488 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005489 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005490
Liz Kammer1c14a212020-05-12 15:26:55 -07005491 //Ensure that test data are copied into apex.
5492 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5493 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5494
Roland Levillain9b5fde92019-06-28 15:41:19 +01005495 // Ensure that test deps built with `test_per_src` are copied into apex.
5496 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5497 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5498 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005499
5500 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005501 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005502 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005503 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005504 prefix := "TARGET_"
5505 var builder strings.Builder
5506 data.Custom(&builder, name, prefix, "", data)
5507 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005508 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5509 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5510 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5511 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005512 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005513 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005514 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005515
5516 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005517 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005518 data.Custom(&builder, name, prefix, "", data)
5519 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005520 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5521 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005522}
5523
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005524func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005525 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005526 apex {
5527 name: "myapex",
5528 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005529 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005530 }
5531 apex_key {
5532 name: "myapex.key",
5533 public_key: "testkey.avbpubkey",
5534 private_key: "testkey.pem",
5535 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005536 `,
5537 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5538 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5539 }),
5540 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005541 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005542 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005543 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005544 var builder strings.Builder
5545 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5546 androidMk := builder.String()
5547 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5548}
5549
Jooyung Hand48f3c32019-08-23 11:18:57 +09005550func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5551 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5552 apex {
5553 name: "myapex",
5554 key: "myapex.key",
5555 native_shared_libs: ["libfoo"],
5556 }
5557
5558 apex_key {
5559 name: "myapex.key",
5560 public_key: "testkey.avbpubkey",
5561 private_key: "testkey.pem",
5562 }
5563
5564 cc_library {
5565 name: "libfoo",
5566 stl: "none",
5567 system_shared_libs: [],
5568 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005569 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005570 }
5571 `)
5572 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5573 apex {
5574 name: "myapex",
5575 key: "myapex.key",
5576 java_libs: ["myjar"],
5577 }
5578
5579 apex_key {
5580 name: "myapex.key",
5581 public_key: "testkey.avbpubkey",
5582 private_key: "testkey.pem",
5583 }
5584
5585 java_library {
5586 name: "myjar",
5587 srcs: ["foo/bar/MyClass.java"],
5588 sdk_version: "none",
5589 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005590 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005591 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005592 }
5593 `)
5594}
5595
Bill Peckhama41a6962021-01-11 10:58:54 -08005596func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005597 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005598 apex {
5599 name: "myapex",
5600 key: "myapex.key",
5601 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005602 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005603 }
5604
5605 apex_key {
5606 name: "myapex.key",
5607 public_key: "testkey.avbpubkey",
5608 private_key: "testkey.pem",
5609 }
5610
5611 java_import {
5612 name: "myjavaimport",
5613 apex_available: ["myapex"],
5614 jars: ["my.jar"],
5615 compile_dex: true,
5616 }
5617 `)
5618
5619 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5620 apexRule := module.Rule("apexRule")
5621 copyCmds := apexRule.Args["copy_commands"]
5622 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5623}
5624
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005625func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005626 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005627 apex {
5628 name: "myapex",
5629 key: "myapex.key",
5630 apps: [
5631 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005632 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005633 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005634 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005635 }
5636
5637 apex_key {
5638 name: "myapex.key",
5639 public_key: "testkey.avbpubkey",
5640 private_key: "testkey.pem",
5641 }
5642
5643 android_app {
5644 name: "AppFoo",
5645 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005646 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005647 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005648 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005650 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005651 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005652
5653 android_app {
5654 name: "AppFooPriv",
5655 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005656 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005657 system_modules: "none",
5658 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005659 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005660 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005661 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005662
5663 cc_library_shared {
5664 name: "libjni",
5665 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005666 shared_libs: ["libfoo"],
5667 stl: "none",
5668 system_shared_libs: [],
5669 apex_available: [ "myapex" ],
5670 sdk_version: "current",
5671 }
5672
5673 cc_library_shared {
5674 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005675 stl: "none",
5676 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005677 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005678 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005679 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005680 `)
5681
Sundong Ahnabb64432019-10-22 13:58:29 +09005682 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005683 apexRule := module.Rule("apexRule")
5684 copyCmds := apexRule.Args["copy_commands"]
5685
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005686 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5687 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005688
Colin Crossaede88c2020-08-11 12:17:01 -07005689 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005690 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005691 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005692 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005693 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005694 // JNI libraries including transitive deps are
5695 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005696 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005697 // ... embedded inside APK (jnilibs.zip)
5698 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5699 // ... and not directly inside the APEX
5700 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5701 }
Dario Frenicde2a032019-10-27 00:29:22 +01005702}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005703
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005704func TestApexWithAppImportBuildId(t *testing.T) {
5705 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5706 for _, id := range invalidBuildIds {
5707 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5708 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5709 variables.BuildId = proptools.StringPtr(id)
5710 })
5711 testApexError(t, message, `apex {
5712 name: "myapex",
5713 key: "myapex.key",
5714 apps: ["AppFooPrebuilt"],
5715 updatable: false,
5716 }
5717
5718 apex_key {
5719 name: "myapex.key",
5720 public_key: "testkey.avbpubkey",
5721 private_key: "testkey.pem",
5722 }
5723
5724 android_app_import {
5725 name: "AppFooPrebuilt",
5726 apk: "PrebuiltAppFoo.apk",
5727 presigned: true,
5728 apex_available: ["myapex"],
5729 }
5730 `, fixture)
5731 }
5732}
5733
Dario Frenicde2a032019-10-27 00:29:22 +01005734func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005735 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005736 apex {
5737 name: "myapex",
5738 key: "myapex.key",
5739 apps: [
5740 "AppFooPrebuilt",
5741 "AppFooPrivPrebuilt",
5742 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005743 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005744 }
5745
5746 apex_key {
5747 name: "myapex.key",
5748 public_key: "testkey.avbpubkey",
5749 private_key: "testkey.pem",
5750 }
5751
5752 android_app_import {
5753 name: "AppFooPrebuilt",
5754 apk: "PrebuiltAppFoo.apk",
5755 presigned: true,
5756 dex_preopt: {
5757 enabled: false,
5758 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005759 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005760 }
5761
5762 android_app_import {
5763 name: "AppFooPrivPrebuilt",
5764 apk: "PrebuiltAppFooPriv.apk",
5765 privileged: true,
5766 presigned: true,
5767 dex_preopt: {
5768 enabled: false,
5769 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005770 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005771 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005772 }
5773 `)
5774
Sundong Ahnabb64432019-10-22 13:58:29 +09005775 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005776 apexRule := module.Rule("apexRule")
5777 copyCmds := apexRule.Args["copy_commands"]
5778
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005779 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5780 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005781}
5782
5783func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005784 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005785 apex {
5786 name: "myapex",
5787 key: "myapex.key",
5788 apps: [
5789 "AppFoo",
5790 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005791 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005792 }
5793
5794 apex_key {
5795 name: "myapex.key",
5796 public_key: "testkey.avbpubkey",
5797 private_key: "testkey.pem",
5798 }
5799
5800 android_app {
5801 name: "AppFoo",
5802 srcs: ["foo/bar/MyClass.java"],
5803 sdk_version: "none",
5804 system_modules: "none",
5805 apex_available: [ "myapex" ],
5806 }
5807
5808 android_app_import {
5809 name: "AppFoo",
5810 apk: "AppFooPrebuilt.apk",
5811 filename: "AppFooPrebuilt.apk",
5812 presigned: true,
5813 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005814 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005815 }
5816 `, withFiles(map[string][]byte{
5817 "AppFooPrebuilt.apk": nil,
5818 }))
5819
5820 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005821 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005822 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005823}
5824
Dario Freni6f3937c2019-12-20 22:58:03 +00005825func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005826 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005827 apex {
5828 name: "myapex",
5829 key: "myapex.key",
5830 apps: [
5831 "TesterHelpAppFoo",
5832 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005833 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005834 }
5835
5836 apex_key {
5837 name: "myapex.key",
5838 public_key: "testkey.avbpubkey",
5839 private_key: "testkey.pem",
5840 }
5841
5842 android_test_helper_app {
5843 name: "TesterHelpAppFoo",
5844 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005845 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005846 }
5847
5848 `)
5849
5850 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5851 apexRule := module.Rule("apexRule")
5852 copyCmds := apexRule.Args["copy_commands"]
5853
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005854 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005855}
5856
Jooyung Han18020ea2019-11-13 10:50:48 +09005857func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5858 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005859 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005860 apex {
5861 name: "myapex",
5862 key: "myapex.key",
5863 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005864 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005865 }
5866
5867 apex_key {
5868 name: "myapex.key",
5869 public_key: "testkey.avbpubkey",
5870 private_key: "testkey.pem",
5871 }
5872
5873 apex {
5874 name: "otherapex",
5875 key: "myapex.key",
5876 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005877 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005878 }
5879
5880 cc_defaults {
5881 name: "libfoo-defaults",
5882 apex_available: ["otherapex"],
5883 }
5884
5885 cc_library {
5886 name: "libfoo",
5887 defaults: ["libfoo-defaults"],
5888 stl: "none",
5889 system_shared_libs: [],
5890 }`)
5891}
5892
Paul Duffine52e66f2020-03-30 17:54:29 +01005893func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005894 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005895 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005896 apex {
5897 name: "myapex",
5898 key: "myapex.key",
5899 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005900 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005901 }
5902
5903 apex_key {
5904 name: "myapex.key",
5905 public_key: "testkey.avbpubkey",
5906 private_key: "testkey.pem",
5907 }
5908
5909 apex {
5910 name: "otherapex",
5911 key: "otherapex.key",
5912 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005913 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005914 }
5915
5916 apex_key {
5917 name: "otherapex.key",
5918 public_key: "testkey.avbpubkey",
5919 private_key: "testkey.pem",
5920 }
5921
5922 cc_library {
5923 name: "libfoo",
5924 stl: "none",
5925 system_shared_libs: [],
5926 apex_available: ["otherapex"],
5927 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005928}
Jiyong Park127b40b2019-09-30 16:04:35 +09005929
Paul Duffine52e66f2020-03-30 17:54:29 +01005930func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005931 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005932 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005933.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005934.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005935.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005936.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005937.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005938.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005939 apex {
5940 name: "myapex",
5941 key: "myapex.key",
5942 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005943 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005944 }
5945
5946 apex_key {
5947 name: "myapex.key",
5948 public_key: "testkey.avbpubkey",
5949 private_key: "testkey.pem",
5950 }
5951
Jiyong Park127b40b2019-09-30 16:04:35 +09005952 cc_library {
5953 name: "libfoo",
5954 stl: "none",
5955 shared_libs: ["libbar"],
5956 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005957 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005958 }
5959
5960 cc_library {
5961 name: "libbar",
5962 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005963 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005964 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005965 apex_available: ["myapex"],
5966 }
5967
5968 cc_library {
5969 name: "libbaz",
5970 stl: "none",
5971 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005972 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005973}
Jiyong Park127b40b2019-09-30 16:04:35 +09005974
Paul Duffine52e66f2020-03-30 17:54:29 +01005975func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005976 testApexError(t, "\"otherapex\" is not a valid module name", `
5977 apex {
5978 name: "myapex",
5979 key: "myapex.key",
5980 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005981 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005982 }
5983
5984 apex_key {
5985 name: "myapex.key",
5986 public_key: "testkey.avbpubkey",
5987 private_key: "testkey.pem",
5988 }
5989
5990 cc_library {
5991 name: "libfoo",
5992 stl: "none",
5993 system_shared_libs: [],
5994 apex_available: ["otherapex"],
5995 }`)
5996
Paul Duffine52e66f2020-03-30 17:54:29 +01005997 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005998 apex {
5999 name: "myapex",
6000 key: "myapex.key",
6001 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006002 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006003 }
6004
6005 apex_key {
6006 name: "myapex.key",
6007 public_key: "testkey.avbpubkey",
6008 private_key: "testkey.pem",
6009 }
6010
6011 cc_library {
6012 name: "libfoo",
6013 stl: "none",
6014 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006015 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006016 apex_available: ["myapex"],
6017 }
6018
6019 cc_library {
6020 name: "libbar",
6021 stl: "none",
6022 system_shared_libs: [],
6023 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006024 }
6025
6026 cc_library {
6027 name: "libbaz",
6028 stl: "none",
6029 system_shared_libs: [],
6030 stubs: {
6031 versions: ["10", "20", "30"],
6032 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006033 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006034}
Jiyong Park127b40b2019-09-30 16:04:35 +09006035
Jiyong Park89e850a2020-04-07 16:37:39 +09006036func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006037 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006038 apex {
6039 name: "myapex",
6040 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006041 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006042 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006043 }
6044
6045 apex_key {
6046 name: "myapex.key",
6047 public_key: "testkey.avbpubkey",
6048 private_key: "testkey.pem",
6049 }
6050
6051 cc_library {
6052 name: "libfoo",
6053 stl: "none",
6054 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006055 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006056 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006057 }
6058
6059 cc_library {
6060 name: "libfoo2",
6061 stl: "none",
6062 system_shared_libs: [],
6063 shared_libs: ["libbaz"],
6064 apex_available: ["//apex_available:platform"],
6065 }
6066
6067 cc_library {
6068 name: "libbar",
6069 stl: "none",
6070 system_shared_libs: [],
6071 apex_available: ["myapex"],
6072 }
6073
6074 cc_library {
6075 name: "libbaz",
6076 stl: "none",
6077 system_shared_libs: [],
6078 apex_available: ["myapex"],
6079 stubs: {
6080 versions: ["1"],
6081 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006082 }`)
6083
Jiyong Park89e850a2020-04-07 16:37:39 +09006084 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6085 // because it depends on libbar which isn't available to platform
6086 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6087 if libfoo.NotAvailableForPlatform() != true {
6088 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6089 }
6090
6091 // libfoo2 however can be available to platform because it depends on libbaz which provides
6092 // stubs
6093 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6094 if libfoo2.NotAvailableForPlatform() == true {
6095 t.Errorf("%q should be available to platform", libfoo2.String())
6096 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006097}
Jiyong Parka90ca002019-10-07 15:47:24 +09006098
Paul Duffine52e66f2020-03-30 17:54:29 +01006099func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006100 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006101 apex {
6102 name: "myapex",
6103 key: "myapex.key",
6104 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006105 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006106 }
6107
6108 apex_key {
6109 name: "myapex.key",
6110 public_key: "testkey.avbpubkey",
6111 private_key: "testkey.pem",
6112 }
6113
6114 cc_library {
6115 name: "libfoo",
6116 stl: "none",
6117 system_shared_libs: [],
6118 apex_available: ["myapex"],
6119 static: {
6120 apex_available: ["//apex_available:platform"],
6121 },
6122 }`)
6123
Jiyong Park89e850a2020-04-07 16:37:39 +09006124 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6125 if libfooShared.NotAvailableForPlatform() != true {
6126 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6127 }
6128 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6129 if libfooStatic.NotAvailableForPlatform() != false {
6130 t.Errorf("%q should be available to platform", libfooStatic.String())
6131 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006132}
6133
Jiyong Park5d790c32019-11-15 18:40:32 +09006134func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006135 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006136 apex {
6137 name: "myapex",
6138 key: "myapex.key",
6139 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006140 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006141 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006142 bootclasspath_fragments: ["mybootclasspath_fragment"],
6143 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6144 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006145 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006146 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006147 }
6148
6149 override_apex {
6150 name: "override_myapex",
6151 base: "myapex",
6152 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08006153 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006154 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006155 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6156 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6157 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006158 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006159 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006160 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006161 key: "mynewapex.key",
6162 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006163 }
6164
6165 apex_key {
6166 name: "myapex.key",
6167 public_key: "testkey.avbpubkey",
6168 private_key: "testkey.pem",
6169 }
6170
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006171 apex_key {
6172 name: "mynewapex.key",
6173 public_key: "testkey2.avbpubkey",
6174 private_key: "testkey2.pem",
6175 }
6176
6177 android_app_certificate {
6178 name: "myapex.certificate",
6179 certificate: "testkey",
6180 }
6181
Jiyong Park5d790c32019-11-15 18:40:32 +09006182 android_app {
6183 name: "app",
6184 srcs: ["foo/bar/MyClass.java"],
6185 package_name: "foo",
6186 sdk_version: "none",
6187 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006188 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006189 }
6190
6191 override_android_app {
6192 name: "override_app",
6193 base: "app",
6194 package_name: "bar",
6195 }
markchien7c803b82021-08-26 22:10:06 +08006196
6197 bpf {
6198 name: "bpf",
6199 srcs: ["bpf.c"],
6200 }
6201
6202 bpf {
6203 name: "override_bpf",
6204 srcs: ["override_bpf.c"],
6205 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006206
6207 prebuilt_etc {
6208 name: "myetc",
6209 src: "myprebuilt",
6210 }
6211
6212 prebuilt_etc {
6213 name: "override_myetc",
6214 src: "override_myprebuilt",
6215 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006216
6217 java_library {
6218 name: "bcplib",
6219 srcs: ["a.java"],
6220 compile_dex: true,
6221 apex_available: ["myapex"],
6222 permitted_packages: ["bcp.lib"],
6223 }
6224
6225 bootclasspath_fragment {
6226 name: "mybootclasspath_fragment",
6227 contents: ["bcplib"],
6228 apex_available: ["myapex"],
6229 }
6230
6231 java_library {
6232 name: "override_bcplib",
6233 srcs: ["a.java"],
6234 compile_dex: true,
6235 apex_available: ["myapex"],
6236 permitted_packages: ["override.bcp.lib"],
6237 }
6238
6239 bootclasspath_fragment {
6240 name: "override_bootclasspath_fragment",
6241 contents: ["override_bcplib"],
6242 apex_available: ["myapex"],
6243 }
6244
6245 java_library {
6246 name: "systemserverlib",
6247 srcs: ["a.java"],
6248 apex_available: ["myapex"],
6249 }
6250
6251 systemserverclasspath_fragment {
6252 name: "mysystemserverclasspath_fragment",
6253 standalone_contents: ["systemserverlib"],
6254 apex_available: ["myapex"],
6255 }
6256
6257 java_library {
6258 name: "override_systemserverlib",
6259 srcs: ["a.java"],
6260 apex_available: ["myapex"],
6261 }
6262
6263 systemserverclasspath_fragment {
6264 name: "override_systemserverclasspath_fragment",
6265 standalone_contents: ["override_systemserverlib"],
6266 apex_available: ["myapex"],
6267 }
6268
6269 java_library {
6270 name: "myjava_library",
6271 srcs: ["a.java"],
6272 compile_dex: true,
6273 apex_available: ["myapex"],
6274 }
6275
6276 java_library {
6277 name: "override_java_library",
6278 srcs: ["a.java"],
6279 compile_dex: true,
6280 apex_available: ["myapex"],
6281 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006282 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006283
Jiyong Park317645e2019-12-05 13:20:58 +09006284 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6285 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6286 if originalVariant.GetOverriddenBy() != "" {
6287 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6288 }
6289 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6290 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6291 }
6292
Jiyong Park5d790c32019-11-15 18:40:32 +09006293 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6294 apexRule := module.Rule("apexRule")
6295 copyCmds := apexRule.Args["copy_commands"]
6296
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006297 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6298 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006299
markchien7c803b82021-08-26 22:10:06 +08006300 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6301 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6302
Daniel Norman5a3ce132021-08-26 15:44:43 -07006303 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6304 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6305
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006306 apexBundle := module.Module().(*apexBundle)
6307 name := apexBundle.Name()
6308 if name != "override_myapex" {
6309 t.Errorf("name should be \"override_myapex\", but was %q", name)
6310 }
6311
Baligh Uddin004d7172020-02-19 21:29:28 -08006312 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6313 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6314 }
6315
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006316 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6317 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6318 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6319 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6320 android.AssertArrayString(t, "Java_libs does not match",
6321 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6322
Jiyong Park20bacab2020-03-03 11:45:41 +09006323 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006324 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006325 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6326
6327 signApkRule := module.Rule("signapk")
6328 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006329
Colin Crossaa255532020-07-03 13:18:24 -07006330 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006331 var builder strings.Builder
6332 data.Custom(&builder, name, "TARGET_", "", data)
6333 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006334 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006335 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006336 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006337 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6338 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6339 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006340 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006341 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006342 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006343 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006344 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006345 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006346 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6347 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6348 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006349 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006350}
6351
Albert Martineefabcf2022-03-21 20:11:16 +00006352func TestMinSdkVersionOverride(t *testing.T) {
6353 // Override from 29 to 31
6354 minSdkOverride31 := "31"
6355 ctx := testApex(t, `
6356 apex {
6357 name: "myapex",
6358 key: "myapex.key",
6359 native_shared_libs: ["mylib"],
6360 updatable: true,
6361 min_sdk_version: "29"
6362 }
6363
6364 override_apex {
6365 name: "override_myapex",
6366 base: "myapex",
6367 logging_parent: "com.foo.bar",
6368 package_name: "test.overridden.package"
6369 }
6370
6371 apex_key {
6372 name: "myapex.key",
6373 public_key: "testkey.avbpubkey",
6374 private_key: "testkey.pem",
6375 }
6376
6377 cc_library {
6378 name: "mylib",
6379 srcs: ["mylib.cpp"],
6380 runtime_libs: ["libbar"],
6381 system_shared_libs: [],
6382 stl: "none",
6383 apex_available: [ "myapex" ],
6384 min_sdk_version: "apex_inherit"
6385 }
6386
6387 cc_library {
6388 name: "libbar",
6389 srcs: ["mylib.cpp"],
6390 system_shared_libs: [],
6391 stl: "none",
6392 apex_available: [ "myapex" ],
6393 min_sdk_version: "apex_inherit"
6394 }
6395
6396 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6397
6398 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6399 copyCmds := apexRule.Args["copy_commands"]
6400
6401 // Ensure that direct non-stubs dep is always included
6402 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6403
6404 // Ensure that runtime_libs dep in included
6405 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6406
6407 // Ensure libraries target overridden min_sdk_version value
6408 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6409}
6410
6411func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6412 // Attempt to override from 31 to 29, should be a NOOP
6413 minSdkOverride29 := "29"
6414 ctx := testApex(t, `
6415 apex {
6416 name: "myapex",
6417 key: "myapex.key",
6418 native_shared_libs: ["mylib"],
6419 updatable: true,
6420 min_sdk_version: "31"
6421 }
6422
6423 override_apex {
6424 name: "override_myapex",
6425 base: "myapex",
6426 logging_parent: "com.foo.bar",
6427 package_name: "test.overridden.package"
6428 }
6429
6430 apex_key {
6431 name: "myapex.key",
6432 public_key: "testkey.avbpubkey",
6433 private_key: "testkey.pem",
6434 }
6435
6436 cc_library {
6437 name: "mylib",
6438 srcs: ["mylib.cpp"],
6439 runtime_libs: ["libbar"],
6440 system_shared_libs: [],
6441 stl: "none",
6442 apex_available: [ "myapex" ],
6443 min_sdk_version: "apex_inherit"
6444 }
6445
6446 cc_library {
6447 name: "libbar",
6448 srcs: ["mylib.cpp"],
6449 system_shared_libs: [],
6450 stl: "none",
6451 apex_available: [ "myapex" ],
6452 min_sdk_version: "apex_inherit"
6453 }
6454
6455 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6456
6457 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6458 copyCmds := apexRule.Args["copy_commands"]
6459
6460 // Ensure that direct non-stubs dep is always included
6461 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6462
6463 // Ensure that runtime_libs dep in included
6464 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6465
6466 // Ensure libraries target the original min_sdk_version value rather than the overridden
6467 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6468}
6469
Jooyung Han214bf372019-11-12 13:03:50 +09006470func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006471 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006472 apex {
6473 name: "myapex",
6474 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006475 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006476 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006477 }
6478
6479 apex_key {
6480 name: "myapex.key",
6481 public_key: "testkey.avbpubkey",
6482 private_key: "testkey.pem",
6483 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006484
6485 cc_library {
6486 name: "mylib",
6487 srcs: ["mylib.cpp"],
6488 stl: "libc++",
6489 system_shared_libs: [],
6490 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006491 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006492 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006493 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006494
6495 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6496 args := module.Rule("apexRule").Args
6497 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006498 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006499
6500 // The copies of the libraries in the apex should have one more dependency than
6501 // the ones outside the apex, namely the unwinder. Ideally we should check
6502 // the dependency names directly here but for some reason the names are blank in
6503 // this test.
6504 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006505 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006506 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6507 if len(apexImplicits) != len(nonApexImplicits)+1 {
6508 t.Errorf("%q missing unwinder dep", lib)
6509 }
6510 }
Jooyung Han214bf372019-11-12 13:03:50 +09006511}
6512
Paul Duffine05480a2021-03-08 15:07:14 +00006513var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006514 "api/current.txt": nil,
6515 "api/removed.txt": nil,
6516 "api/system-current.txt": nil,
6517 "api/system-removed.txt": nil,
6518 "api/test-current.txt": nil,
6519 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006520
Anton Hanssondff2c782020-12-21 17:10:01 +00006521 "100/public/api/foo.txt": nil,
6522 "100/public/api/foo-removed.txt": nil,
6523 "100/system/api/foo.txt": nil,
6524 "100/system/api/foo-removed.txt": nil,
6525
Paul Duffineedc5d52020-06-12 17:46:39 +01006526 // For java_sdk_library_import
6527 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006528}
6529
Jooyung Han58f26ab2019-12-18 15:34:32 +09006530func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006531 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006532 apex {
6533 name: "myapex",
6534 key: "myapex.key",
6535 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006536 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006537 }
6538
6539 apex_key {
6540 name: "myapex.key",
6541 public_key: "testkey.avbpubkey",
6542 private_key: "testkey.pem",
6543 }
6544
6545 java_sdk_library {
6546 name: "foo",
6547 srcs: ["a.java"],
6548 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006549 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006550 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006551
6552 prebuilt_apis {
6553 name: "sdk",
6554 api_dirs: ["100"],
6555 }
Paul Duffin9b879592020-05-26 13:21:35 +01006556 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006557
6558 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006559 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006560 "javalib/foo.jar",
6561 "etc/permissions/foo.xml",
6562 })
6563 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006564 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006565 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 +09006566}
6567
Paul Duffin9b879592020-05-26 13:21:35 +01006568func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006569 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006570 apex {
6571 name: "myapex",
6572 key: "myapex.key",
6573 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006574 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006575 }
6576
6577 apex_key {
6578 name: "myapex.key",
6579 public_key: "testkey.avbpubkey",
6580 private_key: "testkey.pem",
6581 }
6582
6583 java_sdk_library {
6584 name: "foo",
6585 srcs: ["a.java"],
6586 api_packages: ["foo"],
6587 apex_available: ["myapex"],
6588 sdk_version: "none",
6589 system_modules: "none",
6590 }
6591
6592 java_library {
6593 name: "bar",
6594 srcs: ["a.java"],
6595 libs: ["foo"],
6596 apex_available: ["myapex"],
6597 sdk_version: "none",
6598 system_modules: "none",
6599 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006600
6601 prebuilt_apis {
6602 name: "sdk",
6603 api_dirs: ["100"],
6604 }
Paul Duffin9b879592020-05-26 13:21:35 +01006605 `, withFiles(filesForSdkLibrary))
6606
6607 // java_sdk_library installs both impl jar and permission XML
6608 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6609 "javalib/bar.jar",
6610 "javalib/foo.jar",
6611 "etc/permissions/foo.xml",
6612 })
6613
6614 // The bar library should depend on the implementation jar.
6615 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006616 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006617 t.Errorf("expected %q, found %#q", expected, actual)
6618 }
6619}
6620
6621func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006622 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006623 apex {
6624 name: "myapex",
6625 key: "myapex.key",
6626 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006627 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006628 }
6629
6630 apex_key {
6631 name: "myapex.key",
6632 public_key: "testkey.avbpubkey",
6633 private_key: "testkey.pem",
6634 }
6635
6636 java_sdk_library {
6637 name: "foo",
6638 srcs: ["a.java"],
6639 api_packages: ["foo"],
6640 apex_available: ["myapex"],
6641 sdk_version: "none",
6642 system_modules: "none",
6643 }
6644
6645 java_library {
6646 name: "bar",
6647 srcs: ["a.java"],
6648 libs: ["foo"],
6649 sdk_version: "none",
6650 system_modules: "none",
6651 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006652
6653 prebuilt_apis {
6654 name: "sdk",
6655 api_dirs: ["100"],
6656 }
Paul Duffin9b879592020-05-26 13:21:35 +01006657 `, withFiles(filesForSdkLibrary))
6658
6659 // java_sdk_library installs both impl jar and permission XML
6660 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6661 "javalib/foo.jar",
6662 "etc/permissions/foo.xml",
6663 })
6664
6665 // The bar library should depend on the stubs jar.
6666 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006667 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006668 t.Errorf("expected %q, found %#q", expected, actual)
6669 }
6670}
6671
Paul Duffineedc5d52020-06-12 17:46:39 +01006672func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006673 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006674 prebuilt_apis {
6675 name: "sdk",
6676 api_dirs: ["100"],
6677 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006678 withFiles(map[string][]byte{
6679 "apex/a.java": nil,
6680 "apex/apex_manifest.json": nil,
6681 "apex/Android.bp": []byte(`
6682 package {
6683 default_visibility: ["//visibility:private"],
6684 }
6685
6686 apex {
6687 name: "myapex",
6688 key: "myapex.key",
6689 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006690 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006691 }
6692
6693 apex_key {
6694 name: "myapex.key",
6695 public_key: "testkey.avbpubkey",
6696 private_key: "testkey.pem",
6697 }
6698
6699 java_library {
6700 name: "bar",
6701 srcs: ["a.java"],
6702 libs: ["foo"],
6703 apex_available: ["myapex"],
6704 sdk_version: "none",
6705 system_modules: "none",
6706 }
6707`),
6708 "source/a.java": nil,
6709 "source/api/current.txt": nil,
6710 "source/api/removed.txt": nil,
6711 "source/Android.bp": []byte(`
6712 package {
6713 default_visibility: ["//visibility:private"],
6714 }
6715
6716 java_sdk_library {
6717 name: "foo",
6718 visibility: ["//apex"],
6719 srcs: ["a.java"],
6720 api_packages: ["foo"],
6721 apex_available: ["myapex"],
6722 sdk_version: "none",
6723 system_modules: "none",
6724 public: {
6725 enabled: true,
6726 },
6727 }
6728`),
6729 "prebuilt/a.jar": nil,
6730 "prebuilt/Android.bp": []byte(`
6731 package {
6732 default_visibility: ["//visibility:private"],
6733 }
6734
6735 java_sdk_library_import {
6736 name: "foo",
6737 visibility: ["//apex", "//source"],
6738 apex_available: ["myapex"],
6739 prefer: true,
6740 public: {
6741 jars: ["a.jar"],
6742 },
6743 }
6744`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006745 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006746 )
6747
6748 // java_sdk_library installs both impl jar and permission XML
6749 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6750 "javalib/bar.jar",
6751 "javalib/foo.jar",
6752 "etc/permissions/foo.xml",
6753 })
6754
6755 // The bar library should depend on the implementation jar.
6756 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006757 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006758 t.Errorf("expected %q, found %#q", expected, actual)
6759 }
6760}
6761
6762func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6763 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6764 apex {
6765 name: "myapex",
6766 key: "myapex.key",
6767 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006768 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006769 }
6770
6771 apex_key {
6772 name: "myapex.key",
6773 public_key: "testkey.avbpubkey",
6774 private_key: "testkey.pem",
6775 }
6776
6777 java_sdk_library_import {
6778 name: "foo",
6779 apex_available: ["myapex"],
6780 prefer: true,
6781 public: {
6782 jars: ["a.jar"],
6783 },
6784 }
6785
6786 `, withFiles(filesForSdkLibrary))
6787}
6788
atrost6e126252020-01-27 17:01:16 +00006789func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006790 result := android.GroupFixturePreparers(
6791 prepareForApexTest,
6792 java.PrepareForTestWithPlatformCompatConfig,
6793 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006794 apex {
6795 name: "myapex",
6796 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006797 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006798 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006799 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006800 }
6801
6802 apex_key {
6803 name: "myapex.key",
6804 public_key: "testkey.avbpubkey",
6805 private_key: "testkey.pem",
6806 }
6807
6808 platform_compat_config {
6809 name: "myjar-platform-compat-config",
6810 src: ":myjar",
6811 }
6812
6813 java_library {
6814 name: "myjar",
6815 srcs: ["foo/bar/MyClass.java"],
6816 sdk_version: "none",
6817 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006818 apex_available: [ "myapex" ],
6819 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006820
6821 // Make sure that a preferred prebuilt does not affect the apex contents.
6822 prebuilt_platform_compat_config {
6823 name: "myjar-platform-compat-config",
6824 metadata: "compat-config/metadata.xml",
6825 prefer: true,
6826 }
atrost6e126252020-01-27 17:01:16 +00006827 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006828 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006829 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6830 "etc/compatconfig/myjar-platform-compat-config.xml",
6831 "javalib/myjar.jar",
6832 })
6833}
6834
Jiyong Park479321d2019-12-16 11:47:12 +09006835func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6836 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6837 apex {
6838 name: "myapex",
6839 key: "myapex.key",
6840 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006841 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006842 }
6843
6844 apex_key {
6845 name: "myapex.key",
6846 public_key: "testkey.avbpubkey",
6847 private_key: "testkey.pem",
6848 }
6849
6850 java_library {
6851 name: "myjar",
6852 srcs: ["foo/bar/MyClass.java"],
6853 sdk_version: "none",
6854 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006855 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006856 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006857 }
6858 `)
6859}
6860
Jiyong Park7afd1072019-12-30 16:56:33 +09006861func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006862 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006863 apex {
6864 name: "myapex",
6865 key: "myapex.key",
6866 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006867 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006868 }
6869
6870 apex_key {
6871 name: "myapex.key",
6872 public_key: "testkey.avbpubkey",
6873 private_key: "testkey.pem",
6874 }
6875
6876 cc_library {
6877 name: "mylib",
6878 srcs: ["mylib.cpp"],
6879 system_shared_libs: [],
6880 stl: "none",
6881 required: ["a", "b"],
6882 host_required: ["c", "d"],
6883 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006884 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006885 }
6886 `)
6887
6888 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006889 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006890 name := apexBundle.BaseModuleName()
6891 prefix := "TARGET_"
6892 var builder strings.Builder
6893 data.Custom(&builder, name, prefix, "", data)
6894 androidMk := builder.String()
6895 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6896 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6897 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6898}
6899
Jiyong Park7cd10e32020-01-14 09:22:18 +09006900func TestSymlinksFromApexToSystem(t *testing.T) {
6901 bp := `
6902 apex {
6903 name: "myapex",
6904 key: "myapex.key",
6905 native_shared_libs: ["mylib"],
6906 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006907 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006908 }
6909
Jiyong Park9d677202020-02-19 16:29:35 +09006910 apex {
6911 name: "myapex.updatable",
6912 key: "myapex.key",
6913 native_shared_libs: ["mylib"],
6914 java_libs: ["myjar"],
6915 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006916 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006917 }
6918
Jiyong Park7cd10e32020-01-14 09:22:18 +09006919 apex_key {
6920 name: "myapex.key",
6921 public_key: "testkey.avbpubkey",
6922 private_key: "testkey.pem",
6923 }
6924
6925 cc_library {
6926 name: "mylib",
6927 srcs: ["mylib.cpp"],
6928 shared_libs: ["myotherlib"],
6929 system_shared_libs: [],
6930 stl: "none",
6931 apex_available: [
6932 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006933 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006934 "//apex_available:platform",
6935 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006936 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006937 }
6938
6939 cc_library {
6940 name: "myotherlib",
6941 srcs: ["mylib.cpp"],
6942 system_shared_libs: [],
6943 stl: "none",
6944 apex_available: [
6945 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006946 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006947 "//apex_available:platform",
6948 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006949 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006950 }
6951
6952 java_library {
6953 name: "myjar",
6954 srcs: ["foo/bar/MyClass.java"],
6955 sdk_version: "none",
6956 system_modules: "none",
6957 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006958 apex_available: [
6959 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006960 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006961 "//apex_available:platform",
6962 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006963 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006964 }
6965
6966 java_library {
6967 name: "myotherjar",
6968 srcs: ["foo/bar/MyClass.java"],
6969 sdk_version: "none",
6970 system_modules: "none",
6971 apex_available: [
6972 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006973 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006974 "//apex_available:platform",
6975 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006976 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006977 }
6978 `
6979
6980 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6981 for _, f := range files {
6982 if f.path == file {
6983 if f.isLink {
6984 t.Errorf("%q is not a real file", file)
6985 }
6986 return
6987 }
6988 }
6989 t.Errorf("%q is not found", file)
6990 }
6991
6992 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6993 for _, f := range files {
6994 if f.path == file {
6995 if !f.isLink {
6996 t.Errorf("%q is not a symlink", file)
6997 }
6998 return
6999 }
7000 }
7001 t.Errorf("%q is not found", file)
7002 }
7003
Jiyong Park9d677202020-02-19 16:29:35 +09007004 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7005 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007006 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007007 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007008 ensureRealfileExists(t, files, "javalib/myjar.jar")
7009 ensureRealfileExists(t, files, "lib64/mylib.so")
7010 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7011
Jiyong Park9d677202020-02-19 16:29:35 +09007012 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7013 ensureRealfileExists(t, files, "javalib/myjar.jar")
7014 ensureRealfileExists(t, files, "lib64/mylib.so")
7015 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7016
7017 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007018 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007019 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007020 ensureRealfileExists(t, files, "javalib/myjar.jar")
7021 ensureRealfileExists(t, files, "lib64/mylib.so")
7022 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007023
7024 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7025 ensureRealfileExists(t, files, "javalib/myjar.jar")
7026 ensureRealfileExists(t, files, "lib64/mylib.so")
7027 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007028}
7029
Yo Chiange8128052020-07-23 20:09:18 +08007030func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007031 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007032 apex {
7033 name: "myapex",
7034 key: "myapex.key",
7035 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007036 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007037 }
7038
7039 apex_key {
7040 name: "myapex.key",
7041 public_key: "testkey.avbpubkey",
7042 private_key: "testkey.pem",
7043 }
7044
7045 cc_library_shared {
7046 name: "mylib",
7047 srcs: ["mylib.cpp"],
7048 shared_libs: ["myotherlib"],
7049 system_shared_libs: [],
7050 stl: "none",
7051 apex_available: [
7052 "myapex",
7053 "//apex_available:platform",
7054 ],
7055 }
7056
7057 cc_prebuilt_library_shared {
7058 name: "myotherlib",
7059 srcs: ["prebuilt.so"],
7060 system_shared_libs: [],
7061 stl: "none",
7062 apex_available: [
7063 "myapex",
7064 "//apex_available:platform",
7065 ],
7066 }
7067 `)
7068
7069 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007070 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007071 var builder strings.Builder
7072 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7073 androidMk := builder.String()
7074 // `myotherlib` is added to `myapex` as symlink
7075 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
7076 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7077 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7078 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09007079 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 +08007080}
7081
Jooyung Han643adc42020-02-27 13:50:06 +09007082func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007083 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007084 apex {
7085 name: "myapex",
7086 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007087 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007088 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007089 }
7090
7091 apex_key {
7092 name: "myapex.key",
7093 public_key: "testkey.avbpubkey",
7094 private_key: "testkey.pem",
7095 }
7096
7097 cc_library {
7098 name: "mylib",
7099 srcs: ["mylib.cpp"],
7100 shared_libs: ["mylib2"],
7101 system_shared_libs: [],
7102 stl: "none",
7103 apex_available: [ "myapex" ],
7104 }
7105
7106 cc_library {
7107 name: "mylib2",
7108 srcs: ["mylib.cpp"],
7109 system_shared_libs: [],
7110 stl: "none",
7111 apex_available: [ "myapex" ],
7112 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007113
7114 rust_ffi_shared {
7115 name: "libfoo.rust",
7116 crate_name: "foo",
7117 srcs: ["foo.rs"],
7118 shared_libs: ["libfoo.shared_from_rust"],
7119 prefer_rlib: true,
7120 apex_available: ["myapex"],
7121 }
7122
7123 cc_library_shared {
7124 name: "libfoo.shared_from_rust",
7125 srcs: ["mylib.cpp"],
7126 system_shared_libs: [],
7127 stl: "none",
7128 stubs: {
7129 versions: ["10", "11", "12"],
7130 },
7131 }
7132
Jooyung Han643adc42020-02-27 13:50:06 +09007133 `)
7134
7135 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7136 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007137 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007138 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7139 "lib64/mylib.so",
7140 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007141 "lib64/libfoo.rust.so",
7142 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7143 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007144 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007145
7146 // b/220397949
7147 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007148}
7149
Jooyung Han49f67012020-04-17 13:43:10 +09007150func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007151 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007152 apex {
7153 name: "myapex",
7154 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007155 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007156 }
7157 apex_key {
7158 name: "myapex.key",
7159 public_key: "testkey.avbpubkey",
7160 private_key: "testkey.pem",
7161 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007162 `,
7163 android.FixtureModifyConfig(func(config android.Config) {
7164 delete(config.Targets, android.Android)
7165 config.AndroidCommonTarget = android.Target{}
7166 }),
7167 )
Jooyung Han49f67012020-04-17 13:43:10 +09007168
7169 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7170 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7171 }
7172}
7173
Jiyong Parkbd159612020-02-28 15:22:21 +09007174func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007175 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007176 apex {
7177 name: "myapex",
7178 key: "myapex.key",
7179 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007180 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007181 }
7182
7183 apex_key {
7184 name: "myapex.key",
7185 public_key: "testkey.avbpubkey",
7186 private_key: "testkey.pem",
7187 }
7188
7189 android_app {
7190 name: "AppFoo",
7191 srcs: ["foo/bar/MyClass.java"],
7192 sdk_version: "none",
7193 system_modules: "none",
7194 apex_available: [ "myapex" ],
7195 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007196 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007197
Colin Crosscf371cc2020-11-13 11:48:42 -08007198 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007199 content := bundleConfigRule.Args["content"]
7200
7201 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007202 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 +09007203}
7204
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007205func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007206 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007207 apex {
7208 name: "myapex",
7209 key: "myapex.key",
7210 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007211 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007212 }
7213
7214 apex_key {
7215 name: "myapex.key",
7216 public_key: "testkey.avbpubkey",
7217 private_key: "testkey.pem",
7218 }
7219
7220 android_app_set {
7221 name: "AppSet",
7222 set: "AppSet.apks",
7223 }`)
7224 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007225 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007226 content := bundleConfigRule.Args["content"]
7227 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7228 s := mod.Rule("apexRule").Args["copy_commands"]
7229 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
7230 if len(copyCmds) != 3 {
7231 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
7232 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007233 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7234 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
7235 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007236}
7237
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007238func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007239 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007240 apex_set {
7241 name: "myapex",
7242 filename: "foo_v2.apex",
7243 sanitized: {
7244 none: { set: "myapex.apks", },
7245 hwaddress: { set: "myapex.hwasan.apks", },
7246 },
Paul Duffin24704672021-04-06 16:09:30 +01007247 }
7248 `
7249 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007250
Paul Duffin24704672021-04-06 16:09:30 +01007251 // Check that the extractor produces the correct output file from the correct input file.
7252 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007253
Paul Duffin24704672021-04-06 16:09:30 +01007254 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7255 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007256
Paul Duffin24704672021-04-06 16:09:30 +01007257 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7258
7259 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007260 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7261 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007262
7263 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007264}
7265
Paul Duffin89f570a2021-06-16 01:42:33 +01007266func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007267 t.Helper()
7268
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007269 bp := `
7270 java_library {
7271 name: "some-updatable-apex-lib",
7272 srcs: ["a.java"],
7273 sdk_version: "current",
7274 apex_available: [
7275 "some-updatable-apex",
7276 ],
satayevabcd5972021-08-06 17:49:46 +01007277 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007278 }
7279
7280 java_library {
7281 name: "some-non-updatable-apex-lib",
7282 srcs: ["a.java"],
7283 apex_available: [
7284 "some-non-updatable-apex",
7285 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007286 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007287 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007288 }
7289
7290 bootclasspath_fragment {
7291 name: "some-non-updatable-fragment",
7292 contents: ["some-non-updatable-apex-lib"],
7293 apex_available: [
7294 "some-non-updatable-apex",
7295 ],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007296 }
7297
7298 java_library {
7299 name: "some-platform-lib",
7300 srcs: ["a.java"],
7301 sdk_version: "current",
7302 installable: true,
7303 }
7304
7305 java_library {
7306 name: "some-art-lib",
7307 srcs: ["a.java"],
7308 sdk_version: "current",
7309 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007310 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007311 ],
7312 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007313 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007314 }
7315
7316 apex {
7317 name: "some-updatable-apex",
7318 key: "some-updatable-apex.key",
7319 java_libs: ["some-updatable-apex-lib"],
7320 updatable: true,
7321 min_sdk_version: "current",
7322 }
7323
7324 apex {
7325 name: "some-non-updatable-apex",
7326 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007327 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007328 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007329 }
7330
7331 apex_key {
7332 name: "some-updatable-apex.key",
7333 }
7334
7335 apex_key {
7336 name: "some-non-updatable-apex.key",
7337 }
7338
7339 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007340 name: "com.android.art.debug",
7341 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007342 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007343 updatable: true,
7344 min_sdk_version: "current",
7345 }
7346
Paul Duffinf23bc472021-04-27 12:42:20 +01007347 bootclasspath_fragment {
7348 name: "art-bootclasspath-fragment",
7349 image_name: "art",
7350 contents: ["some-art-lib"],
7351 apex_available: [
7352 "com.android.art.debug",
7353 ],
7354 }
7355
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007356 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007357 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007358 }
7359
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007360 filegroup {
7361 name: "some-updatable-apex-file_contexts",
7362 srcs: [
7363 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7364 ],
7365 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007366
7367 filegroup {
7368 name: "some-non-updatable-apex-file_contexts",
7369 srcs: [
7370 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7371 ],
7372 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007373 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007374
Paul Duffin89f570a2021-06-16 01:42:33 +01007375 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007376}
7377
Paul Duffin89f570a2021-06-16 01:42:33 +01007378func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007379 t.Helper()
7380
Paul Duffin55607122021-03-30 23:32:51 +01007381 fs := android.MockFS{
7382 "a.java": nil,
7383 "a.jar": nil,
7384 "apex_manifest.json": nil,
7385 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007386 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007387 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7388 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7389 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007390 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007391 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007392
Paul Duffin55607122021-03-30 23:32:51 +01007393 errorHandler := android.FixtureExpectsNoErrors
7394 if errmsg != "" {
7395 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007396 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007397
Paul Duffin55607122021-03-30 23:32:51 +01007398 result := android.GroupFixturePreparers(
7399 cc.PrepareForTestWithCcDefaultModules,
7400 java.PrepareForTestWithHiddenApiBuildComponents,
7401 java.PrepareForTestWithJavaDefaultModules,
7402 java.PrepareForTestWithJavaSdkLibraryFiles,
7403 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007404 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007405 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007406 android.FixtureModifyMockFS(func(fs android.MockFS) {
7407 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7408 insert := ""
7409 for _, fragment := range fragments {
7410 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7411 }
7412 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7413 platform_bootclasspath {
7414 name: "platform-bootclasspath",
7415 fragments: [
7416 %s
7417 ],
7418 }
7419 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007420 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007421 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007422 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007423 ).
7424 ExtendWithErrorHandler(errorHandler).
7425 RunTestWithBp(t, bp)
7426
7427 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007428}
7429
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007430func TestDuplicateDeapexeresFromPrebuiltApexes(t *testing.T) {
7431 preparers := android.GroupFixturePreparers(
7432 java.PrepareForTestWithJavaDefaultModules,
7433 PrepareForTestWithApexBuildComponents,
7434 ).
7435 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7436 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7437
7438 bpBase := `
7439 apex_set {
7440 name: "com.android.myapex",
7441 installable: true,
7442 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7443 set: "myapex.apks",
7444 }
7445
7446 apex_set {
7447 name: "com.mycompany.android.myapex",
7448 apex_name: "com.android.myapex",
7449 installable: true,
7450 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7451 set: "company-myapex.apks",
7452 }
7453
7454 prebuilt_bootclasspath_fragment {
7455 name: "my-bootclasspath-fragment",
7456 apex_available: ["com.android.myapex"],
7457 %s
7458 }
7459 `
7460
7461 t.Run("java_import", func(t *testing.T) {
7462 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7463 java_import {
7464 name: "libfoo",
7465 jars: ["libfoo.jar"],
7466 apex_available: ["com.android.myapex"],
7467 }
7468 `)
7469 })
7470
7471 t.Run("java_sdk_library_import", func(t *testing.T) {
7472 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7473 java_sdk_library_import {
7474 name: "libfoo",
7475 public: {
7476 jars: ["libbar.jar"],
7477 },
7478 apex_available: ["com.android.myapex"],
7479 }
7480 `)
7481 })
7482
7483 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7484 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7485 image_name: "art",
7486 contents: ["libfoo"],
7487 `)+`
7488 java_sdk_library_import {
7489 name: "libfoo",
7490 public: {
7491 jars: ["libbar.jar"],
7492 },
7493 apex_available: ["com.android.myapex"],
7494 }
7495 `)
7496 })
7497}
7498
Jooyung Han548640b2020-04-27 12:10:30 +09007499func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7500 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7501 apex {
7502 name: "myapex",
7503 key: "myapex.key",
7504 updatable: true,
7505 }
7506
7507 apex_key {
7508 name: "myapex.key",
7509 public_key: "testkey.avbpubkey",
7510 private_key: "testkey.pem",
7511 }
7512 `)
7513}
7514
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007515func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7516 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7517 apex {
7518 name: "myapex",
7519 key: "myapex.key",
7520 }
7521
7522 apex_key {
7523 name: "myapex.key",
7524 public_key: "testkey.avbpubkey",
7525 private_key: "testkey.pem",
7526 }
7527 `)
7528}
7529
Daniel Norman69109112021-12-02 12:52:42 -08007530func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7531 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7532 apex {
7533 name: "myapex",
7534 key: "myapex.key",
7535 updatable: true,
7536 soc_specific: true,
7537 }
7538
7539 apex_key {
7540 name: "myapex.key",
7541 public_key: "testkey.avbpubkey",
7542 private_key: "testkey.pem",
7543 }
7544 `)
7545}
7546
satayevb98371c2021-06-15 16:49:50 +01007547func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7548 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7549 apex {
7550 name: "myapex",
7551 key: "myapex.key",
7552 systemserverclasspath_fragments: [
7553 "mysystemserverclasspathfragment",
7554 ],
7555 min_sdk_version: "29",
7556 updatable: true,
7557 }
7558
7559 apex_key {
7560 name: "myapex.key",
7561 public_key: "testkey.avbpubkey",
7562 private_key: "testkey.pem",
7563 }
7564
7565 java_library {
7566 name: "foo",
7567 srcs: ["b.java"],
7568 min_sdk_version: "29",
7569 installable: true,
7570 apex_available: [
7571 "myapex",
7572 ],
7573 }
7574
7575 systemserverclasspath_fragment {
7576 name: "mysystemserverclasspathfragment",
7577 generate_classpaths_proto: false,
7578 contents: [
7579 "foo",
7580 ],
7581 apex_available: [
7582 "myapex",
7583 ],
7584 }
satayevabcd5972021-08-06 17:49:46 +01007585 `,
7586 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7587 )
satayevb98371c2021-06-15 16:49:50 +01007588}
7589
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007590func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007591 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7592 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7593 // modules to be included in the BootJars.
7594 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7595 return android.GroupFixturePreparers(
7596 dexpreopt.FixtureSetBootJars(bootJars...),
7597 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7598 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7599 }),
7600 )
7601 }
7602
7603 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7604 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7605 // specified in the ArtApexJars configuration.
7606 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7607 return android.GroupFixturePreparers(
7608 dexpreopt.FixtureSetArtBootJars(bootJars...),
7609 dexpreopt.FixtureSetBootJars(bootJars...),
7610 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7611 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7612 }),
7613 )
7614 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007615
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007616 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007617 preparer := android.GroupFixturePreparers(
7618 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7619 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7620 )
7621 fragments := []java.ApexVariantReference{
7622 {
7623 Apex: proptools.StringPtr("com.android.art.debug"),
7624 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7625 },
7626 {
7627 Apex: proptools.StringPtr("some-non-updatable-apex"),
7628 Module: proptools.StringPtr("some-non-updatable-fragment"),
7629 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007630 }
satayevabcd5972021-08-06 17:49:46 +01007631 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007632 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007633
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007634 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007635 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7636 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007637 preparer := android.GroupFixturePreparers(
7638 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7639 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7640 )
Paul Duffin60264a02021-04-12 20:02:36 +01007641 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007642 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007643
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007644 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 +01007645 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 +01007646 // Update the dexpreopt ArtApexJars directly.
7647 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7648 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007649 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007650
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007651 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 +01007652 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 +01007653 // Update the dexpreopt ArtApexJars directly.
7654 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7655 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007656 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007657
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007658 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 +01007659 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 +01007660 preparer := android.GroupFixturePreparers(
7661 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7662 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7663 )
Paul Duffin60264a02021-04-12 20:02:36 +01007664 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007665 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007666
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007667 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 +01007668 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007669 fragment := java.ApexVariantReference{
7670 Apex: proptools.StringPtr("some-non-updatable-apex"),
7671 Module: proptools.StringPtr("some-non-updatable-fragment"),
7672 }
7673 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007674 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007675
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007676 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007677 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007678 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7679 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007680 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007681
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007682 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007683 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007684 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7685 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007686 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007687
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007688 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007689 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007690 // Update the dexpreopt ArtApexJars directly.
7691 preparer := prepareSetArtJars("platform:some-platform-lib")
7692 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007693 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007694
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007695 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007696 preparer := android.GroupFixturePreparers(
7697 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7698 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7699 )
7700 fragments := []java.ApexVariantReference{
7701 {
7702 Apex: proptools.StringPtr("some-non-updatable-apex"),
7703 Module: proptools.StringPtr("some-non-updatable-fragment"),
7704 },
7705 }
7706 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007707 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007708}
7709
7710func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007711 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007712 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007713 fragment := java.ApexVariantReference{
7714 Apex: proptools.StringPtr("myapex"),
7715 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7716 }
7717
Paul Duffin064b70c2020-11-02 17:32:38 +00007718 testDexpreoptWithApexes(t, `
7719 prebuilt_apex {
7720 name: "myapex" ,
7721 arch: {
7722 arm64: {
7723 src: "myapex-arm64.apex",
7724 },
7725 arm: {
7726 src: "myapex-arm.apex",
7727 },
7728 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007729 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7730 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007731
Paul Duffin89f570a2021-06-16 01:42:33 +01007732 prebuilt_bootclasspath_fragment {
7733 name: "my-bootclasspath-fragment",
7734 contents: ["libfoo"],
7735 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007736 hidden_api: {
7737 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7738 metadata: "my-bootclasspath-fragment/metadata.csv",
7739 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007740 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7741 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7742 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007743 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007744 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007745
Paul Duffin89f570a2021-06-16 01:42:33 +01007746 java_import {
7747 name: "libfoo",
7748 jars: ["libfoo.jar"],
7749 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007750 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007751 }
7752 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007753 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007754}
7755
Spandan Dasf14e2542021-11-12 00:01:37 +00007756func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007757 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007758 bp += `
7759 apex_key {
7760 name: "myapex.key",
7761 public_key: "testkey.avbpubkey",
7762 private_key: "testkey.pem",
7763 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007764 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007765 "lib1/src/A.java": nil,
7766 "lib2/src/B.java": nil,
7767 "system/sepolicy/apex/myapex-file_contexts": nil,
7768 }
7769
Paul Duffin45338f02021-03-30 23:07:52 +01007770 errorHandler := android.FixtureExpectsNoErrors
7771 if errmsg != "" {
7772 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007773 }
Colin Crossae8600b2020-10-29 17:09:13 -07007774
Paul Duffin45338f02021-03-30 23:07:52 +01007775 android.GroupFixturePreparers(
7776 android.PrepareForTestWithAndroidBuildComponents,
7777 java.PrepareForTestWithJavaBuildComponents,
7778 PrepareForTestWithApexBuildComponents,
7779 android.PrepareForTestWithNeverallowRules(rules),
7780 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007781 apexBootJars := make([]string, 0, len(bootJars))
7782 for _, apexBootJar := range bootJars {
7783 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007784 }
satayevd604b212021-07-21 14:23:52 +01007785 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007786 }),
7787 fs.AddToFixture(),
7788 ).
7789 ExtendWithErrorHandler(errorHandler).
7790 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007791}
7792
7793func TestApexPermittedPackagesRules(t *testing.T) {
7794 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00007795 name string
7796 expectedError string
7797 bp string
7798 bootJars []string
7799 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01007800 }{
7801
7802 {
7803 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7804 expectedError: "",
7805 bp: `
7806 java_library {
7807 name: "bcp_lib1",
7808 srcs: ["lib1/src/*.java"],
7809 permitted_packages: ["foo.bar"],
7810 apex_available: ["myapex"],
7811 sdk_version: "none",
7812 system_modules: "none",
7813 }
7814 java_library {
7815 name: "nonbcp_lib2",
7816 srcs: ["lib2/src/*.java"],
7817 apex_available: ["myapex"],
7818 permitted_packages: ["a.b"],
7819 sdk_version: "none",
7820 system_modules: "none",
7821 }
7822 apex {
7823 name: "myapex",
7824 key: "myapex.key",
7825 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007826 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007827 }`,
7828 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007829 bcpPermittedPackages: map[string][]string{
7830 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007831 "foo.bar",
7832 },
7833 },
7834 },
7835 {
Anton Hanssone1b18362021-12-23 15:05:38 +00007836 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00007837 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 +01007838 bp: `
7839 java_library {
7840 name: "bcp_lib1",
7841 srcs: ["lib1/src/*.java"],
7842 apex_available: ["myapex"],
7843 permitted_packages: ["foo.bar"],
7844 sdk_version: "none",
7845 system_modules: "none",
7846 }
7847 java_library {
7848 name: "bcp_lib2",
7849 srcs: ["lib2/src/*.java"],
7850 apex_available: ["myapex"],
7851 permitted_packages: ["foo.bar", "bar.baz"],
7852 sdk_version: "none",
7853 system_modules: "none",
7854 }
7855 apex {
7856 name: "myapex",
7857 key: "myapex.key",
7858 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007859 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007860 }
7861 `,
7862 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007863 bcpPermittedPackages: map[string][]string{
7864 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007865 "foo.bar",
7866 },
Spandan Dasf14e2542021-11-12 00:01:37 +00007867 "bcp_lib2": []string{
7868 "foo.bar",
7869 },
7870 },
7871 },
7872 {
7873 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
7874 expectedError: "",
7875 bp: `
7876 java_library {
7877 name: "bcp_lib_restricted",
7878 srcs: ["lib1/src/*.java"],
7879 apex_available: ["myapex"],
7880 permitted_packages: ["foo.bar"],
7881 sdk_version: "none",
7882 min_sdk_version: "29",
7883 system_modules: "none",
7884 }
7885 java_library {
7886 name: "bcp_lib_unrestricted",
7887 srcs: ["lib2/src/*.java"],
7888 apex_available: ["myapex"],
7889 permitted_packages: ["foo.bar", "bar.baz"],
7890 sdk_version: "none",
7891 min_sdk_version: "29",
7892 system_modules: "none",
7893 }
7894 apex {
7895 name: "myapex",
7896 key: "myapex.key",
7897 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
7898 updatable: true,
7899 min_sdk_version: "29",
7900 }
7901 `,
7902 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7903 bcpPermittedPackages: map[string][]string{
7904 "bcp_lib1_non_updateable": []string{
7905 "foo.bar",
7906 },
7907 // 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 +01007908 },
7909 },
7910 }
7911 for _, tc := range testcases {
7912 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00007913 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
7914 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01007915 })
7916 }
7917}
7918
Jiyong Park62304bb2020-04-13 16:19:48 +09007919func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007920 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09007921 apex {
7922 name: "myapex",
7923 key: "myapex.key",
7924 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007925 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09007926 }
7927
7928 apex_key {
7929 name: "myapex.key",
7930 public_key: "testkey.avbpubkey",
7931 private_key: "testkey.pem",
7932 }
7933
7934 cc_library {
7935 name: "mylib",
7936 srcs: ["mylib.cpp"],
7937 system_shared_libs: [],
7938 stl: "none",
7939 stubs: {
7940 versions: ["1"],
7941 },
7942 apex_available: ["myapex"],
7943 }
7944
7945 cc_library {
7946 name: "myprivlib",
7947 srcs: ["mylib.cpp"],
7948 system_shared_libs: [],
7949 stl: "none",
7950 apex_available: ["myapex"],
7951 }
7952
7953
7954 cc_test {
7955 name: "mytest",
7956 gtest: false,
7957 srcs: ["mylib.cpp"],
7958 system_shared_libs: [],
7959 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09007960 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09007961 test_for: ["myapex"]
7962 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007963
7964 cc_library {
7965 name: "mytestlib",
7966 srcs: ["mylib.cpp"],
7967 system_shared_libs: [],
7968 shared_libs: ["mylib", "myprivlib"],
7969 stl: "none",
7970 test_for: ["myapex"],
7971 }
7972
7973 cc_benchmark {
7974 name: "mybench",
7975 srcs: ["mylib.cpp"],
7976 system_shared_libs: [],
7977 shared_libs: ["mylib", "myprivlib"],
7978 stl: "none",
7979 test_for: ["myapex"],
7980 }
Jiyong Park62304bb2020-04-13 16:19:48 +09007981 `)
7982
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007983 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007984 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007985 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7986 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7987 }
7988
7989 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09007990 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007991 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7992 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7993 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7994}
Jiyong Park46a512f2020-12-04 18:02:13 +09007995
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007996func TestIndirectTestFor(t *testing.T) {
7997 ctx := testApex(t, `
7998 apex {
7999 name: "myapex",
8000 key: "myapex.key",
8001 native_shared_libs: ["mylib", "myprivlib"],
8002 updatable: false,
8003 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008004
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008005 apex_key {
8006 name: "myapex.key",
8007 public_key: "testkey.avbpubkey",
8008 private_key: "testkey.pem",
8009 }
8010
8011 cc_library {
8012 name: "mylib",
8013 srcs: ["mylib.cpp"],
8014 system_shared_libs: [],
8015 stl: "none",
8016 stubs: {
8017 versions: ["1"],
8018 },
8019 apex_available: ["myapex"],
8020 }
8021
8022 cc_library {
8023 name: "myprivlib",
8024 srcs: ["mylib.cpp"],
8025 system_shared_libs: [],
8026 stl: "none",
8027 shared_libs: ["mylib"],
8028 apex_available: ["myapex"],
8029 }
8030
8031 cc_library {
8032 name: "mytestlib",
8033 srcs: ["mylib.cpp"],
8034 system_shared_libs: [],
8035 shared_libs: ["myprivlib"],
8036 stl: "none",
8037 test_for: ["myapex"],
8038 }
8039 `)
8040
8041 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008042 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008043 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8044 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8045 }
8046
8047 // The platform variant of mytestlib links to the platform variant of the
8048 // internal myprivlib.
8049 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8050
8051 // The platform variant of myprivlib links to the platform variant of mylib
8052 // and bypasses its stubs.
8053 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 +09008054}
8055
Martin Stjernholmec009002021-03-27 15:18:31 +00008056func TestTestForForLibInOtherApex(t *testing.T) {
8057 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8058 _ = testApex(t, `
8059 apex {
8060 name: "com.android.art",
8061 key: "myapex.key",
8062 native_shared_libs: ["mylib"],
8063 updatable: false,
8064 }
8065
8066 apex {
8067 name: "com.android.art.debug",
8068 key: "myapex.key",
8069 native_shared_libs: ["mylib", "mytestlib"],
8070 updatable: false,
8071 }
8072
8073 apex_key {
8074 name: "myapex.key",
8075 public_key: "testkey.avbpubkey",
8076 private_key: "testkey.pem",
8077 }
8078
8079 cc_library {
8080 name: "mylib",
8081 srcs: ["mylib.cpp"],
8082 system_shared_libs: [],
8083 stl: "none",
8084 stubs: {
8085 versions: ["1"],
8086 },
8087 apex_available: ["com.android.art", "com.android.art.debug"],
8088 }
8089
8090 cc_library {
8091 name: "mytestlib",
8092 srcs: ["mylib.cpp"],
8093 system_shared_libs: [],
8094 shared_libs: ["mylib"],
8095 stl: "none",
8096 apex_available: ["com.android.art.debug"],
8097 test_for: ["com.android.art"],
8098 }
8099 `,
8100 android.MockFS{
8101 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8102 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8103 }.AddToFixture())
8104}
8105
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008106// TODO(jungjw): Move this to proptools
8107func intPtr(i int) *int {
8108 return &i
8109}
8110
8111func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008112 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008113 apex_set {
8114 name: "myapex",
8115 set: "myapex.apks",
8116 filename: "foo_v2.apex",
8117 overrides: ["foo"],
8118 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008119 `,
8120 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8121 variables.Platform_sdk_version = intPtr(30)
8122 }),
8123 android.FixtureModifyConfig(func(config android.Config) {
8124 config.Targets[android.Android] = []android.Target{
8125 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8126 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8127 }
8128 }),
8129 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008130
Paul Duffin24704672021-04-06 16:09:30 +01008131 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008132
8133 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008134 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008135 actual := extractedApex.Args["abis"]
8136 expected := "ARMEABI_V7A,ARM64_V8A"
8137 if actual != expected {
8138 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8139 }
8140 actual = extractedApex.Args["sdk-version"]
8141 expected = "30"
8142 if actual != expected {
8143 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8144 }
8145
Paul Duffin6717d882021-06-15 19:09:41 +01008146 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008147 a := m.Module().(*ApexSet)
8148 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008149 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008150 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8151 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8152 }
8153}
8154
Jiyong Park7d95a512020-05-10 15:16:24 +09008155func TestNoStaticLinkingToStubsLib(t *testing.T) {
8156 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8157 apex {
8158 name: "myapex",
8159 key: "myapex.key",
8160 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008161 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008162 }
8163
8164 apex_key {
8165 name: "myapex.key",
8166 public_key: "testkey.avbpubkey",
8167 private_key: "testkey.pem",
8168 }
8169
8170 cc_library {
8171 name: "mylib",
8172 srcs: ["mylib.cpp"],
8173 static_libs: ["otherlib"],
8174 system_shared_libs: [],
8175 stl: "none",
8176 apex_available: [ "myapex" ],
8177 }
8178
8179 cc_library {
8180 name: "otherlib",
8181 srcs: ["mylib.cpp"],
8182 system_shared_libs: [],
8183 stl: "none",
8184 stubs: {
8185 versions: ["1", "2", "3"],
8186 },
8187 apex_available: [ "myapex" ],
8188 }
8189 `)
8190}
8191
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008192func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008193 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008194 apex {
8195 name: "myapex",
8196 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008197 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008198 custom_sign_tool: "sign_myapex",
8199 }
8200
8201 apex_key {
8202 name: "myapex.key",
8203 public_key: "testkey.avbpubkey",
8204 private_key: "testkey.pem",
8205 }
8206 `)
8207
8208 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8209 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8210 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"`)
8211}
8212
8213func TestApexKeysTxtOverrides(t *testing.T) {
8214 ctx := testApex(t, `
8215 apex {
8216 name: "myapex",
8217 key: "myapex.key",
8218 updatable: false,
8219 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008220 }
8221
8222 apex_key {
8223 name: "myapex.key",
8224 public_key: "testkey.avbpubkey",
8225 private_key: "testkey.pem",
8226 }
8227
8228 prebuilt_apex {
8229 name: "myapex",
8230 prefer: true,
8231 arch: {
8232 arm64: {
8233 src: "myapex-arm64.apex",
8234 },
8235 arm: {
8236 src: "myapex-arm.apex",
8237 },
8238 },
8239 }
8240
8241 apex_set {
8242 name: "myapex_set",
8243 set: "myapex.apks",
8244 filename: "myapex_set.apex",
8245 overrides: ["myapex"],
8246 }
8247 `)
8248
8249 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8250 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8251 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 +09008252 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 +09008253}
8254
Jooyung Han938b5932020-06-20 12:47:47 +09008255func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008256 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008257 apex {
8258 name: "myapex",
8259 key: "myapex.key",
8260 apps: ["app"],
8261 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008262 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008263 }
8264
8265 apex_key {
8266 name: "myapex.key",
8267 public_key: "testkey.avbpubkey",
8268 private_key: "testkey.pem",
8269 }
8270
8271 android_app {
8272 name: "app",
8273 srcs: ["foo/bar/MyClass.java"],
8274 package_name: "foo",
8275 sdk_version: "none",
8276 system_modules: "none",
8277 apex_available: [ "myapex" ],
8278 }
8279 `, withFiles(map[string][]byte{
8280 "sub/Android.bp": []byte(`
8281 override_apex {
8282 name: "override_myapex",
8283 base: "myapex",
8284 apps: ["override_app"],
8285 allowed_files: ":allowed",
8286 }
8287 // Overridable "path" property should be referenced indirectly
8288 filegroup {
8289 name: "allowed",
8290 srcs: ["allowed.txt"],
8291 }
8292 override_android_app {
8293 name: "override_app",
8294 base: "app",
8295 package_name: "bar",
8296 }
8297 `),
8298 }))
8299
8300 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8301 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8302 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8303 }
8304
8305 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8306 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8307 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8308 }
8309}
8310
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008311func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008312 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008313 apex {
8314 name: "myapex",
8315 key: "myapex.key",
8316 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008317 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008318 }
8319
8320 apex_key {
8321 name: "myapex.key",
8322 public_key: "testkey.avbpubkey",
8323 private_key: "testkey.pem",
8324 }
8325
8326 cc_library {
8327 name: "mylib",
8328 srcs: ["mylib.cpp"],
8329 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008330 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008331 },
8332 apex_available: ["myapex"],
8333 }
8334
8335 cc_prebuilt_library_shared {
8336 name: "mylib",
8337 prefer: false,
8338 srcs: ["prebuilt.so"],
8339 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008340 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008341 },
8342 apex_available: ["myapex"],
8343 }
8344 `)
8345}
8346
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008347func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008348 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008349 apex {
8350 name: "myapex",
8351 key: "myapex.key",
8352 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008353 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008354 }
8355 apex_key {
8356 name: "myapex.key",
8357 public_key: "testkey.avbpubkey",
8358 private_key: "testkey.pem",
8359 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008360 `,
8361 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8362 variables.CompressedApex = proptools.BoolPtr(true)
8363 }),
8364 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008365
8366 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8367 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8368
8369 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8370 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8371
8372 // Make sure output of bundle is .capex
8373 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8374 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8375
8376 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008377 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008378 var builder strings.Builder
8379 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8380 androidMk := builder.String()
8381 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8382}
8383
Martin Stjernholm2856c662020-12-02 15:03:42 +00008384func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008385 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008386 apex {
8387 name: "myapex",
8388 key: "myapex.key",
8389 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008390 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008391 }
8392
8393 apex_key {
8394 name: "myapex.key",
8395 public_key: "testkey.avbpubkey",
8396 private_key: "testkey.pem",
8397 }
8398
8399 cc_library {
8400 name: "mylib",
8401 srcs: ["mylib.cpp"],
8402 apex_available: ["myapex"],
8403 shared_libs: ["otherlib"],
8404 system_shared_libs: [],
8405 }
8406
8407 cc_library {
8408 name: "otherlib",
8409 srcs: ["mylib.cpp"],
8410 stubs: {
8411 versions: ["current"],
8412 },
8413 }
8414
8415 cc_prebuilt_library_shared {
8416 name: "otherlib",
8417 prefer: true,
8418 srcs: ["prebuilt.so"],
8419 stubs: {
8420 versions: ["current"],
8421 },
8422 }
8423 `)
8424
8425 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008426 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008427 var builder strings.Builder
8428 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8429 androidMk := builder.String()
8430
8431 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8432 // a thing there.
8433 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8434}
8435
Jiyong Parke3867542020-12-03 17:28:25 +09008436func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008437 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008438 apex {
8439 name: "myapex",
8440 key: "myapex.key",
8441 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008442 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008443 }
8444
8445 apex_key {
8446 name: "myapex.key",
8447 public_key: "testkey.avbpubkey",
8448 private_key: "testkey.pem",
8449 }
8450
8451 cc_library {
8452 name: "mylib",
8453 srcs: ["mylib.cpp"],
8454 system_shared_libs: [],
8455 stl: "none",
8456 apex_available: ["myapex"],
8457 shared_libs: ["mylib2"],
8458 target: {
8459 apex: {
8460 exclude_shared_libs: ["mylib2"],
8461 },
8462 },
8463 }
8464
8465 cc_library {
8466 name: "mylib2",
8467 srcs: ["mylib.cpp"],
8468 system_shared_libs: [],
8469 stl: "none",
8470 }
8471 `)
8472
8473 // Check if mylib is linked to mylib2 for the non-apex target
8474 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8475 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8476
8477 // Make sure that the link doesn't occur for the apex target
8478 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8479 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8480
8481 // It shouldn't appear in the copy cmd as well.
8482 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8483 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8484}
8485
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008486func TestPrebuiltStubLibDep(t *testing.T) {
8487 bpBase := `
8488 apex {
8489 name: "myapex",
8490 key: "myapex.key",
8491 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008492 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008493 }
8494 apex_key {
8495 name: "myapex.key",
8496 public_key: "testkey.avbpubkey",
8497 private_key: "testkey.pem",
8498 }
8499 cc_library {
8500 name: "mylib",
8501 srcs: ["mylib.cpp"],
8502 apex_available: ["myapex"],
8503 shared_libs: ["stublib"],
8504 system_shared_libs: [],
8505 }
8506 apex {
8507 name: "otherapex",
8508 enabled: %s,
8509 key: "myapex.key",
8510 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008511 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008512 }
8513 `
8514
8515 stublibSourceBp := `
8516 cc_library {
8517 name: "stublib",
8518 srcs: ["mylib.cpp"],
8519 apex_available: ["otherapex"],
8520 system_shared_libs: [],
8521 stl: "none",
8522 stubs: {
8523 versions: ["1"],
8524 },
8525 }
8526 `
8527
8528 stublibPrebuiltBp := `
8529 cc_prebuilt_library_shared {
8530 name: "stublib",
8531 srcs: ["prebuilt.so"],
8532 apex_available: ["otherapex"],
8533 stubs: {
8534 versions: ["1"],
8535 },
8536 %s
8537 }
8538 `
8539
8540 tests := []struct {
8541 name string
8542 stublibBp string
8543 usePrebuilt bool
8544 modNames []string // Modules to collect AndroidMkEntries for
8545 otherApexEnabled []string
8546 }{
8547 {
8548 name: "only_source",
8549 stublibBp: stublibSourceBp,
8550 usePrebuilt: false,
8551 modNames: []string{"stublib"},
8552 otherApexEnabled: []string{"true", "false"},
8553 },
8554 {
8555 name: "source_preferred",
8556 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8557 usePrebuilt: false,
8558 modNames: []string{"stublib", "prebuilt_stublib"},
8559 otherApexEnabled: []string{"true", "false"},
8560 },
8561 {
8562 name: "prebuilt_preferred",
8563 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8564 usePrebuilt: true,
8565 modNames: []string{"stublib", "prebuilt_stublib"},
8566 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8567 },
8568 {
8569 name: "only_prebuilt",
8570 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8571 usePrebuilt: true,
8572 modNames: []string{"stublib"},
8573 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8574 },
8575 }
8576
8577 for _, test := range tests {
8578 t.Run(test.name, func(t *testing.T) {
8579 for _, otherApexEnabled := range test.otherApexEnabled {
8580 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008581 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008582
8583 type modAndMkEntries struct {
8584 mod *cc.Module
8585 mkEntries android.AndroidMkEntries
8586 }
8587 entries := []*modAndMkEntries{}
8588
8589 // Gather shared lib modules that are installable
8590 for _, modName := range test.modNames {
8591 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8592 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8593 continue
8594 }
8595 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008596 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008597 continue
8598 }
Colin Crossaa255532020-07-03 13:18:24 -07008599 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008600 if ent.Disabled {
8601 continue
8602 }
8603 entries = append(entries, &modAndMkEntries{
8604 mod: mod,
8605 mkEntries: ent,
8606 })
8607 }
8608 }
8609 }
8610
8611 var entry *modAndMkEntries = nil
8612 for _, ent := range entries {
8613 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8614 if entry != nil {
8615 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8616 } else {
8617 entry = ent
8618 }
8619 }
8620 }
8621
8622 if entry == nil {
8623 t.Errorf("AndroidMk entry for \"stublib\" missing")
8624 } else {
8625 isPrebuilt := entry.mod.Prebuilt() != nil
8626 if isPrebuilt != test.usePrebuilt {
8627 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8628 }
8629 if !entry.mod.IsStubs() {
8630 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8631 }
8632 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8633 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8634 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008635 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008636 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008637 if !android.InList(expected, cflags) {
8638 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8639 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008640 }
8641 })
8642 }
8643 })
8644 }
8645}
8646
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008647func TestHostApexInHostOnlyBuild(t *testing.T) {
8648 testApex(t, `
8649 apex {
8650 name: "myapex",
8651 host_supported: true,
8652 key: "myapex.key",
8653 updatable: false,
8654 payload_type: "zip",
8655 }
8656 apex_key {
8657 name: "myapex.key",
8658 public_key: "testkey.avbpubkey",
8659 private_key: "testkey.pem",
8660 }
8661 `,
8662 android.FixtureModifyConfig(func(config android.Config) {
8663 // We may not have device targets in all builds, e.g. in
8664 // prebuilts/build-tools/build-prebuilts.sh
8665 config.Targets[android.Android] = []android.Target{}
8666 }))
8667}
8668
Colin Crossc33e5212021-05-25 18:16:02 -07008669func TestApexJavaCoverage(t *testing.T) {
8670 bp := `
8671 apex {
8672 name: "myapex",
8673 key: "myapex.key",
8674 java_libs: ["mylib"],
8675 bootclasspath_fragments: ["mybootclasspathfragment"],
8676 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8677 updatable: false,
8678 }
8679
8680 apex_key {
8681 name: "myapex.key",
8682 public_key: "testkey.avbpubkey",
8683 private_key: "testkey.pem",
8684 }
8685
8686 java_library {
8687 name: "mylib",
8688 srcs: ["mylib.java"],
8689 apex_available: ["myapex"],
8690 compile_dex: true,
8691 }
8692
8693 bootclasspath_fragment {
8694 name: "mybootclasspathfragment",
8695 contents: ["mybootclasspathlib"],
8696 apex_available: ["myapex"],
8697 }
8698
8699 java_library {
8700 name: "mybootclasspathlib",
8701 srcs: ["mybootclasspathlib.java"],
8702 apex_available: ["myapex"],
8703 compile_dex: true,
8704 }
8705
8706 systemserverclasspath_fragment {
8707 name: "mysystemserverclasspathfragment",
8708 contents: ["mysystemserverclasspathlib"],
8709 apex_available: ["myapex"],
8710 }
8711
8712 java_library {
8713 name: "mysystemserverclasspathlib",
8714 srcs: ["mysystemserverclasspathlib.java"],
8715 apex_available: ["myapex"],
8716 compile_dex: true,
8717 }
8718 `
8719
8720 result := android.GroupFixturePreparers(
8721 PrepareForTestWithApexBuildComponents,
8722 prepareForTestWithMyapex,
8723 java.PrepareForTestWithJavaDefaultModules,
8724 android.PrepareForTestWithAndroidBuildComponents,
8725 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008726 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8727 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008728 android.FixtureMergeEnv(map[string]string{
8729 "EMMA_INSTRUMENT": "true",
8730 }),
8731 ).RunTest(t)
8732
8733 // Make sure jacoco ran on both mylib and mybootclasspathlib
8734 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8735 t.Errorf("Failed to find jacoco rule for mylib")
8736 }
8737 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8738 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8739 }
8740 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8741 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8742 }
8743}
8744
Jiyong Park192600a2021-08-03 07:52:17 +00008745func TestProhibitStaticExecutable(t *testing.T) {
8746 testApexError(t, `executable mybin is static`, `
8747 apex {
8748 name: "myapex",
8749 key: "myapex.key",
8750 binaries: ["mybin"],
8751 min_sdk_version: "29",
8752 }
8753
8754 apex_key {
8755 name: "myapex.key",
8756 public_key: "testkey.avbpubkey",
8757 private_key: "testkey.pem",
8758 }
8759
8760 cc_binary {
8761 name: "mybin",
8762 srcs: ["mylib.cpp"],
8763 relative_install_path: "foo/bar",
8764 static_executable: true,
8765 system_shared_libs: [],
8766 stl: "none",
8767 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008768 min_sdk_version: "29",
8769 }
8770 `)
8771
8772 testApexError(t, `executable mybin.rust is static`, `
8773 apex {
8774 name: "myapex",
8775 key: "myapex.key",
8776 binaries: ["mybin.rust"],
8777 min_sdk_version: "29",
8778 }
8779
8780 apex_key {
8781 name: "myapex.key",
8782 public_key: "testkey.avbpubkey",
8783 private_key: "testkey.pem",
8784 }
8785
8786 rust_binary {
8787 name: "mybin.rust",
8788 srcs: ["foo.rs"],
8789 static_executable: true,
8790 apex_available: ["myapex"],
8791 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008792 }
8793 `)
8794}
8795
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008796func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8797 ctx := testApex(t, `
8798 apex {
8799 name: "myapex",
8800 key: "myapex.key",
8801 updatable: false,
8802 java_libs: ["foo"],
8803 }
8804
8805 apex_key {
8806 name: "myapex.key",
8807 public_key: "testkey.avbpubkey",
8808 private_key: "testkey.pem",
8809 }
8810
8811 java_library {
8812 name: "foo",
8813 srcs: ["foo.java"],
8814 apex_available: ["myapex"],
8815 installable: true,
8816 }
8817 `,
8818 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8819 )
8820
8821 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8822 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8823 var builder strings.Builder
8824 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8825 androidMk := builder.String()
8826 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")
8827}
8828
8829func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8830 ctx := testApex(t, `
8831 prebuilt_apex {
8832 name: "myapex",
8833 arch: {
8834 arm64: {
8835 src: "myapex-arm64.apex",
8836 },
8837 arm: {
8838 src: "myapex-arm.apex",
8839 },
8840 },
8841 exported_java_libs: ["foo"],
8842 }
8843
8844 java_import {
8845 name: "foo",
8846 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008847 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008848 }
8849 `,
8850 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8851 )
8852
8853 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8854 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8855 mainModuleEntries := entriesList[0]
8856 android.AssertArrayString(t,
8857 "LOCAL_REQUIRED_MODULES",
8858 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8859 []string{
8860 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8861 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8862 })
8863}
8864
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008865func TestAndroidMk_RequiredModules(t *testing.T) {
8866 ctx := testApex(t, `
8867 apex {
8868 name: "myapex",
8869 key: "myapex.key",
8870 updatable: false,
8871 java_libs: ["foo"],
8872 required: ["otherapex"],
8873 }
8874
8875 apex {
8876 name: "otherapex",
8877 key: "myapex.key",
8878 updatable: false,
8879 java_libs: ["foo"],
8880 required: ["otherapex"],
8881 }
8882
8883 apex_key {
8884 name: "myapex.key",
8885 public_key: "testkey.avbpubkey",
8886 private_key: "testkey.pem",
8887 }
8888
8889 java_library {
8890 name: "foo",
8891 srcs: ["foo.java"],
8892 apex_available: ["myapex", "otherapex"],
8893 installable: true,
8894 }
8895 `)
8896
8897 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8898 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8899 var builder strings.Builder
8900 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8901 androidMk := builder.String()
8902 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
8903}
8904
Jiakai Zhangd70dff72022-02-24 15:06:05 +00008905func TestAndroidMk_RequiredDeps(t *testing.T) {
8906 ctx := testApex(t, `
8907 apex {
8908 name: "myapex",
8909 key: "myapex.key",
8910 updatable: false,
8911 }
8912
8913 apex_key {
8914 name: "myapex.key",
8915 public_key: "testkey.avbpubkey",
8916 private_key: "testkey.pem",
8917 }
8918 `)
8919
8920 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8921 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
8922 data := android.AndroidMkDataForTest(t, ctx, bundle)
8923 var builder strings.Builder
8924 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
8925 androidMk := builder.String()
8926 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
8927
8928 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
8929 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
8930 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
8931 var flattenedBuilder strings.Builder
8932 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
8933 flattenedAndroidMk := flattenedBuilder.String()
8934 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
8935}
8936
Jooyung Hana6d36672022-02-24 13:58:07 +09008937func TestApexOutputFileProducer(t *testing.T) {
8938 for _, tc := range []struct {
8939 name string
8940 ref string
8941 expected_data []string
8942 }{
8943 {
8944 name: "test_using_output",
8945 ref: ":myapex",
8946 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
8947 },
8948 {
8949 name: "test_using_apex",
8950 ref: ":myapex{.apex}",
8951 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
8952 },
8953 } {
8954 t.Run(tc.name, func(t *testing.T) {
8955 ctx := testApex(t, `
8956 apex {
8957 name: "myapex",
8958 key: "myapex.key",
8959 compressible: true,
8960 updatable: false,
8961 }
8962
8963 apex_key {
8964 name: "myapex.key",
8965 public_key: "testkey.avbpubkey",
8966 private_key: "testkey.pem",
8967 }
8968
8969 java_test {
8970 name: "`+tc.name+`",
8971 srcs: ["a.java"],
8972 data: ["`+tc.ref+`"],
8973 }
8974 `,
8975 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8976 variables.CompressedApex = proptools.BoolPtr(true)
8977 }))
8978 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
8979 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
8980 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
8981 })
8982 }
8983}
8984
satayev758968a2021-12-06 11:42:40 +00008985func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
8986 preparer := android.GroupFixturePreparers(
8987 PrepareForTestWithApexBuildComponents,
8988 prepareForTestWithMyapex,
8989 java.PrepareForTestWithJavaSdkLibraryFiles,
8990 java.PrepareForTestWithJavaDefaultModules,
8991 android.PrepareForTestWithAndroidBuildComponents,
8992 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8993 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
8994 )
8995
8996 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
8997 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8998 preparer.RunTestWithBp(t, `
8999 apex {
9000 name: "myapex",
9001 key: "myapex.key",
9002 bootclasspath_fragments: ["mybootclasspathfragment"],
9003 min_sdk_version: "30",
9004 updatable: false,
9005 }
9006
9007 apex_key {
9008 name: "myapex.key",
9009 public_key: "testkey.avbpubkey",
9010 private_key: "testkey.pem",
9011 }
9012
9013 bootclasspath_fragment {
9014 name: "mybootclasspathfragment",
9015 contents: ["mybootclasspathlib"],
9016 apex_available: ["myapex"],
9017 }
9018
9019 java_sdk_library {
9020 name: "mybootclasspathlib",
9021 srcs: ["mybootclasspathlib.java"],
9022 apex_available: ["myapex"],
9023 compile_dex: true,
9024 unsafe_ignore_missing_latest_api: true,
9025 min_sdk_version: "31",
9026 static_libs: ["util"],
9027 }
9028
9029 java_library {
9030 name: "util",
9031 srcs: ["a.java"],
9032 apex_available: ["myapex"],
9033 min_sdk_version: "31",
9034 static_libs: ["another_util"],
9035 }
9036
9037 java_library {
9038 name: "another_util",
9039 srcs: ["a.java"],
9040 min_sdk_version: "31",
9041 apex_available: ["myapex"],
9042 }
9043 `)
9044 })
9045
9046 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9047 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9048 preparer.RunTestWithBp(t, `
9049 apex {
9050 name: "myapex",
9051 key: "myapex.key",
9052 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9053 min_sdk_version: "30",
9054 updatable: false,
9055 }
9056
9057 apex_key {
9058 name: "myapex.key",
9059 public_key: "testkey.avbpubkey",
9060 private_key: "testkey.pem",
9061 }
9062
9063 systemserverclasspath_fragment {
9064 name: "mysystemserverclasspathfragment",
9065 contents: ["mysystemserverclasspathlib"],
9066 apex_available: ["myapex"],
9067 }
9068
9069 java_sdk_library {
9070 name: "mysystemserverclasspathlib",
9071 srcs: ["mysystemserverclasspathlib.java"],
9072 apex_available: ["myapex"],
9073 compile_dex: true,
9074 min_sdk_version: "32",
9075 unsafe_ignore_missing_latest_api: true,
9076 static_libs: ["util"],
9077 }
9078
9079 java_library {
9080 name: "util",
9081 srcs: ["a.java"],
9082 apex_available: ["myapex"],
9083 min_sdk_version: "31",
9084 static_libs: ["another_util"],
9085 }
9086
9087 java_library {
9088 name: "another_util",
9089 srcs: ["a.java"],
9090 min_sdk_version: "31",
9091 apex_available: ["myapex"],
9092 }
9093 `)
9094 })
9095
9096 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9097 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9098 RunTestWithBp(t, `
9099 apex {
9100 name: "myapex",
9101 key: "myapex.key",
9102 bootclasspath_fragments: ["mybootclasspathfragment"],
9103 min_sdk_version: "30",
9104 updatable: false,
9105 }
9106
9107 apex_key {
9108 name: "myapex.key",
9109 public_key: "testkey.avbpubkey",
9110 private_key: "testkey.pem",
9111 }
9112
9113 bootclasspath_fragment {
9114 name: "mybootclasspathfragment",
9115 contents: ["mybootclasspathlib"],
9116 apex_available: ["myapex"],
9117 }
9118
9119 java_sdk_library {
9120 name: "mybootclasspathlib",
9121 srcs: ["mybootclasspathlib.java"],
9122 apex_available: ["myapex"],
9123 compile_dex: true,
9124 unsafe_ignore_missing_latest_api: true,
9125 }
9126 `)
9127 })
9128
9129 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9130 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9131 RunTestWithBp(t, `
9132 apex {
9133 name: "myapex",
9134 key: "myapex.key",
9135 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9136 min_sdk_version: "30",
9137 updatable: false,
9138 }
9139
9140 apex_key {
9141 name: "myapex.key",
9142 public_key: "testkey.avbpubkey",
9143 private_key: "testkey.pem",
9144 }
9145
9146 systemserverclasspath_fragment {
9147 name: "mysystemserverclasspathfragment",
9148 contents: ["mysystemserverclasspathlib"],
9149 apex_available: ["myapex"],
9150 }
9151
9152 java_sdk_library {
9153 name: "mysystemserverclasspathlib",
9154 srcs: ["mysystemserverclasspathlib.java"],
9155 apex_available: ["myapex"],
9156 compile_dex: true,
9157 unsafe_ignore_missing_latest_api: true,
9158 }
9159 `)
9160 })
9161}
9162
Jiakai Zhang6decef92022-01-12 17:56:19 +00009163// Verifies that the APEX depends on all the Make modules in the list.
9164func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9165 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9166 for _, dep := range deps {
9167 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9168 }
9169}
9170
9171// Verifies that the APEX does not depend on any of the Make modules in the list.
9172func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9173 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9174 for _, dep := range deps {
9175 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9176 }
9177}
9178
Spandan Das66773252022-01-15 00:23:18 +00009179func TestApexStrictUpdtabilityLint(t *testing.T) {
9180 bpTemplate := `
9181 apex {
9182 name: "myapex",
9183 key: "myapex.key",
9184 java_libs: ["myjavalib"],
9185 updatable: %v,
9186 min_sdk_version: "29",
9187 }
9188 apex_key {
9189 name: "myapex.key",
9190 }
9191 java_library {
9192 name: "myjavalib",
9193 srcs: ["MyClass.java"],
9194 apex_available: [ "myapex" ],
9195 lint: {
9196 strict_updatability_linting: %v,
9197 },
9198 sdk_version: "current",
9199 min_sdk_version: "29",
9200 }
9201 `
9202 fs := android.MockFS{
9203 "lint-baseline.xml": nil,
9204 }
9205
9206 testCases := []struct {
9207 testCaseName string
9208 apexUpdatable bool
9209 javaStrictUpdtabilityLint bool
9210 lintFileExists bool
9211 disallowedFlagExpected bool
9212 }{
9213 {
9214 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9215 apexUpdatable: true,
9216 javaStrictUpdtabilityLint: true,
9217 lintFileExists: false,
9218 disallowedFlagExpected: false,
9219 },
9220 {
9221 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9222 apexUpdatable: false,
9223 javaStrictUpdtabilityLint: false,
9224 lintFileExists: true,
9225 disallowedFlagExpected: false,
9226 },
9227 {
9228 testCaseName: "non-updatable apex respects strict updatability of javalib",
9229 apexUpdatable: false,
9230 javaStrictUpdtabilityLint: true,
9231 lintFileExists: true,
9232 disallowedFlagExpected: true,
9233 },
9234 {
9235 testCaseName: "updatable apex sets strict updatability of javalib to true",
9236 apexUpdatable: true,
9237 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9238 lintFileExists: true,
9239 disallowedFlagExpected: true,
9240 },
9241 }
9242
9243 for _, testCase := range testCases {
9244 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9245 fixtures := []android.FixturePreparer{}
9246 if testCase.lintFileExists {
9247 fixtures = append(fixtures, fs.AddToFixture())
9248 }
9249
9250 result := testApex(t, bp, fixtures...)
9251 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9252 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9253 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9254
9255 if disallowedFlagActual != testCase.disallowedFlagExpected {
9256 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9257 }
9258 }
9259}
9260
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009261func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9262 bp := `
9263 apex {
9264 name: "myapex",
9265 key: "myapex.key",
9266 java_libs: ["myjavalib"],
9267 updatable: true,
9268 min_sdk_version: "29",
9269 }
9270 apex_key {
9271 name: "myapex.key",
9272 }
9273 java_library {
9274 name: "myjavalib",
9275 srcs: ["MyClass.java"],
9276 apex_available: [ "myapex" ],
9277 sdk_version: "current",
9278 min_sdk_version: "29",
9279 }
9280 `
9281
9282 testCases := []struct {
9283 testCaseName string
9284 moduleDirectory string
9285 disallowedFlagExpected bool
9286 }{
9287 {
9288 testCaseName: "lintable module defined outside libcore",
9289 moduleDirectory: "",
9290 disallowedFlagExpected: true,
9291 },
9292 {
9293 testCaseName: "lintable module defined in libcore root directory",
9294 moduleDirectory: "libcore/",
9295 disallowedFlagExpected: false,
9296 },
9297 {
9298 testCaseName: "lintable module defined in libcore child directory",
9299 moduleDirectory: "libcore/childdir/",
9300 disallowedFlagExpected: true,
9301 },
9302 }
9303
9304 for _, testCase := range testCases {
9305 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9306 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9307 result := testApex(t, "", lintFileCreator, bpFileCreator)
9308 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9309 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9310 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9311 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9312
9313 if disallowedFlagActual != testCase.disallowedFlagExpected {
9314 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9315 }
9316 }
9317}
9318
Spandan Das66773252022-01-15 00:23:18 +00009319// checks transtive deps of an apex coming from bootclasspath_fragment
9320func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9321 bp := `
9322 apex {
9323 name: "myapex",
9324 key: "myapex.key",
9325 bootclasspath_fragments: ["mybootclasspathfragment"],
9326 updatable: true,
9327 min_sdk_version: "29",
9328 }
9329 apex_key {
9330 name: "myapex.key",
9331 }
9332 bootclasspath_fragment {
9333 name: "mybootclasspathfragment",
9334 contents: ["myjavalib"],
9335 apex_available: ["myapex"],
9336 }
9337 java_library {
9338 name: "myjavalib",
9339 srcs: ["MyClass.java"],
9340 apex_available: [ "myapex" ],
9341 sdk_version: "current",
9342 min_sdk_version: "29",
9343 compile_dex: true,
9344 }
9345 `
9346 fs := android.MockFS{
9347 "lint-baseline.xml": nil,
9348 }
9349
9350 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9351 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9352 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9353 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9354 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9355 }
9356}
9357
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009358func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009359 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009360}