blob: 4a52115dbd78a21d50667fa3a578ba85d9f88467 [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")
Paul Duffin37aad602021-03-08 09:47:16 +0000226 }),
227)
228
Paul Duffin52bfaa42021-03-23 23:40:12 +0000229var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
230 "system/sepolicy/apex/myapex-file_contexts": nil,
231})
232
Jooyung Han643adc42020-02-27 13:50:06 +0900233// ensure that 'result' equals 'expected'
234func ensureEquals(t *testing.T, result string, expected string) {
235 t.Helper()
236 if result != expected {
237 t.Errorf("%q != %q", expected, result)
238 }
239}
240
Jiyong Park25fc6a92018-11-18 18:02:45 +0900241// ensure that 'result' contains 'expected'
242func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900243 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900244 if !strings.Contains(result, expected) {
245 t.Errorf("%q is not found in %q", expected, result)
246 }
247}
248
Liz Kammer5bd365f2020-05-27 15:15:11 -0700249// ensure that 'result' contains 'expected' exactly one time
250func ensureContainsOnce(t *testing.T, result string, expected string) {
251 t.Helper()
252 count := strings.Count(result, expected)
253 if count != 1 {
254 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
255 }
256}
257
Jiyong Park25fc6a92018-11-18 18:02:45 +0900258// ensures that 'result' does not contain 'notExpected'
259func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900260 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900261 if strings.Contains(result, notExpected) {
262 t.Errorf("%q is found in %q", notExpected, result)
263 }
264}
265
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700266func ensureMatches(t *testing.T, result string, expectedRex string) {
267 ok, err := regexp.MatchString(expectedRex, result)
268 if err != nil {
269 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
270 return
271 }
272 if !ok {
273 t.Errorf("%s does not match regular expession %s", result, expectedRex)
274 }
275}
276
Jiyong Park25fc6a92018-11-18 18:02:45 +0900277func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900278 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900279 if !android.InList(expected, result) {
280 t.Errorf("%q is not found in %v", expected, result)
281 }
282}
283
284func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900285 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900286 if android.InList(notExpected, result) {
287 t.Errorf("%q is found in %v", notExpected, result)
288 }
289}
290
Jooyung Hane1633032019-08-01 17:41:43 +0900291func ensureListEmpty(t *testing.T, result []string) {
292 t.Helper()
293 if len(result) > 0 {
294 t.Errorf("%q is expected to be empty", result)
295 }
296}
297
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000298func ensureListNotEmpty(t *testing.T, result []string) {
299 t.Helper()
300 if len(result) == 0 {
301 t.Errorf("%q is expected to be not empty", result)
302 }
303}
304
Jiyong Park25fc6a92018-11-18 18:02:45 +0900305// Minimal test
306func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800307 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900308 apex_defaults {
309 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900310 manifest: ":myapex.manifest",
311 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900312 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900313 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900314 native_shared_libs: [
315 "mylib",
316 "libfoo.ffi",
317 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900318 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800319 multilib: {
320 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900321 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800322 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900323 },
Jiyong Park77acec62020-06-01 21:39:15 +0900324 java_libs: [
325 "myjar",
326 "myjar_dex",
327 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000328 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900329 }
330
Jiyong Park30ca9372019-02-07 16:27:23 +0900331 apex {
332 name: "myapex",
333 defaults: ["myapex-defaults"],
334 }
335
Jiyong Park25fc6a92018-11-18 18:02:45 +0900336 apex_key {
337 name: "myapex.key",
338 public_key: "testkey.avbpubkey",
339 private_key: "testkey.pem",
340 }
341
Jiyong Park809bb722019-02-13 21:33:49 +0900342 filegroup {
343 name: "myapex.manifest",
344 srcs: ["apex_manifest.json"],
345 }
346
347 filegroup {
348 name: "myapex.androidmanifest",
349 srcs: ["AndroidManifest.xml"],
350 }
351
Jiyong Park25fc6a92018-11-18 18:02:45 +0900352 cc_library {
353 name: "mylib",
354 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900355 shared_libs: [
356 "mylib2",
357 "libbar.ffi",
358 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900359 system_shared_libs: [],
360 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000361 // TODO: remove //apex_available:platform
362 apex_available: [
363 "//apex_available:platform",
364 "myapex",
365 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900366 }
367
Alex Light3d673592019-01-18 14:37:31 -0800368 cc_binary {
369 name: "foo",
370 srcs: ["mylib.cpp"],
371 compile_multilib: "both",
372 multilib: {
373 lib32: {
374 suffix: "32",
375 },
376 lib64: {
377 suffix: "64",
378 },
379 },
380 symlinks: ["foo_link_"],
381 symlink_preferred_arch: true,
382 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800383 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700384 apex_available: [ "myapex", "com.android.gki.*" ],
385 }
386
Jiyong Park99644e92020-11-17 22:21:02 +0900387 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000388 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900389 srcs: ["foo.rs"],
390 rlibs: ["libfoo.rlib.rust"],
391 dylibs: ["libfoo.dylib.rust"],
392 apex_available: ["myapex"],
393 }
394
395 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000396 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900397 srcs: ["foo.rs"],
398 crate_name: "foo",
399 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900400 shared_libs: ["libfoo.shared_from_rust"],
401 }
402
403 cc_library_shared {
404 name: "libfoo.shared_from_rust",
405 srcs: ["mylib.cpp"],
406 system_shared_libs: [],
407 stl: "none",
408 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900409 }
410
411 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000412 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900413 srcs: ["foo.rs"],
414 crate_name: "foo",
415 apex_available: ["myapex"],
416 }
417
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900418 rust_ffi_shared {
419 name: "libfoo.ffi",
420 srcs: ["foo.rs"],
421 crate_name: "foo",
422 apex_available: ["myapex"],
423 }
424
425 rust_ffi_shared {
426 name: "libbar.ffi",
427 srcs: ["foo.rs"],
428 crate_name: "bar",
429 apex_available: ["myapex"],
430 }
431
Yifan Hongd22a84a2020-07-28 17:37:46 -0700432 apex {
433 name: "com.android.gki.fake",
434 binaries: ["foo"],
435 key: "myapex.key",
436 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000437 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800438 }
439
Paul Duffindddd5462020-04-07 15:25:44 +0100440 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900441 name: "mylib2",
442 srcs: ["mylib.cpp"],
443 system_shared_libs: [],
444 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900445 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900446 static_libs: ["libstatic"],
447 // TODO: remove //apex_available:platform
448 apex_available: [
449 "//apex_available:platform",
450 "myapex",
451 ],
452 }
453
Paul Duffindddd5462020-04-07 15:25:44 +0100454 cc_prebuilt_library_shared {
455 name: "mylib2",
456 srcs: ["prebuilt.so"],
457 // TODO: remove //apex_available:platform
458 apex_available: [
459 "//apex_available:platform",
460 "myapex",
461 ],
462 }
463
Jiyong Park9918e1a2020-03-17 19:16:40 +0900464 cc_library_static {
465 name: "libstatic",
466 srcs: ["mylib.cpp"],
467 system_shared_libs: [],
468 stl: "none",
469 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000470 // TODO: remove //apex_available:platform
471 apex_available: [
472 "//apex_available:platform",
473 "myapex",
474 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900475 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476
477 java_library {
478 name: "myjar",
479 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900480 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900481 sdk_version: "none",
482 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900484 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000485 // TODO: remove //apex_available:platform
486 apex_available: [
487 "//apex_available:platform",
488 "myapex",
489 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 }
491
Jiyong Park77acec62020-06-01 21:39:15 +0900492 dex_import {
493 name: "myjar_dex",
494 jars: ["prebuilt.jar"],
495 apex_available: [
496 "//apex_available:platform",
497 "myapex",
498 ],
499 }
500
Jiyong Park7f7766d2019-07-25 22:02:35 +0900501 java_library {
502 name: "myotherjar",
503 srcs: ["foo/bar/MyClass.java"],
504 sdk_version: "none",
505 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900506 // TODO: remove //apex_available:platform
507 apex_available: [
508 "//apex_available:platform",
509 "myapex",
510 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900511 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900512
513 java_library {
514 name: "mysharedjar",
515 srcs: ["foo/bar/MyClass.java"],
516 sdk_version: "none",
517 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900518 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900519 `)
520
Paul Duffina71a67a2021-03-29 00:42:57 +0100521 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900523 // Make sure that Android.mk is created
524 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700525 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 var builder strings.Builder
527 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
528
529 androidMk := builder.String()
530 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
531 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
532
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533 optFlags := apexRule.Args["opt_flags"]
534 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700535 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100536 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900537
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538 copyCmds := apexRule.Args["copy_commands"]
539
540 // Ensure that main rule creates an output
541 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
542
543 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900549
550 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700551 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
552 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900557
558 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800559 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
565 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 // .. but not for java libs
568 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800570
Colin Cross7113d202019-11-20 16:39:12 -0800571 // Ensure that the platform variant ends with _shared or _common
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900574 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
575 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
577
578 // Ensure that dynamic dependency to java libs are not included
579 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800580
581 // Ensure that all symlinks are present.
582 found_foo_link_64 := false
583 found_foo := false
584 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900585 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800586 if strings.HasSuffix(cmd, "bin/foo") {
587 found_foo = true
588 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
589 found_foo_link_64 = true
590 }
591 }
592 }
593 good := found_foo && found_foo_link_64
594 if !good {
595 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
596 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900597
Artur Satayeva8bd1132020-04-27 18:07:06 +0100598 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
601 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
602 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100603
604 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100606 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
608 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800609}
610
Jooyung Hanf21c7972019-12-16 22:32:06 +0900611func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800612 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613 apex_defaults {
614 name: "myapex-defaults",
615 key: "myapex.key",
616 prebuilts: ["myetc"],
617 native_shared_libs: ["mylib"],
618 java_libs: ["myjar"],
619 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900620 rros: ["rro"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800621 bpfs: ["bpf", "netd_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000622 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900623 }
624
625 prebuilt_etc {
626 name: "myetc",
627 src: "myprebuilt",
628 }
629
630 apex {
631 name: "myapex",
632 defaults: ["myapex-defaults"],
633 }
634
635 apex_key {
636 name: "myapex.key",
637 public_key: "testkey.avbpubkey",
638 private_key: "testkey.pem",
639 }
640
641 cc_library {
642 name: "mylib",
643 system_shared_libs: [],
644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900646 }
647
648 java_library {
649 name: "myjar",
650 srcs: ["foo/bar/MyClass.java"],
651 sdk_version: "none",
652 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000653 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900654 }
655
656 android_app {
657 name: "AppFoo",
658 srcs: ["foo/bar/MyClass.java"],
659 sdk_version: "none",
660 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000661 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900662 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900663
664 runtime_resource_overlay {
665 name: "rro",
666 theme: "blue",
667 }
668
markchien2f59ec92020-09-02 16:23:38 +0800669 bpf {
670 name: "bpf",
671 srcs: ["bpf.c", "bpf2.c"],
672 }
673
Ken Chenfad7f9d2021-11-10 22:02:57 +0800674 bpf {
675 name: "netd_test",
676 srcs: ["netd_test.c"],
677 sub_dir: "netd",
678 }
679
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000681 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 "etc/myetc",
683 "javalib/myjar.jar",
684 "lib64/mylib.so",
Jingwen Chen6cb124b2022-04-19 13:58:58 +0000685 "app/AppFoo@__APEX_VERSION_PLACEHOLDER__/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900686 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800687 "etc/bpf/bpf.o",
688 "etc/bpf/bpf2.o",
Ken Chenfad7f9d2021-11-10 22:02:57 +0800689 "etc/bpf/netd/netd_test.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900690 })
691}
692
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800694 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 apex {
696 name: "myapex",
697 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000698 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 }
700
701 apex_key {
702 name: "myapex.key",
703 public_key: "testkey.avbpubkey",
704 private_key: "testkey.pem",
705 }
706 `)
707
708 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900709 args := module.Rule("apexRule").Args
710 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
711 t.Error("manifest should be apex_manifest.pb, but " + manifest)
712 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900713}
714
Liz Kammer4854a7d2021-05-27 14:28:27 -0400715func TestApexManifestMinSdkVersion(t *testing.T) {
716 ctx := testApex(t, `
717 apex_defaults {
718 name: "my_defaults",
719 key: "myapex.key",
720 product_specific: true,
721 file_contexts: ":my-file-contexts",
722 updatable: false,
723 }
724 apex {
725 name: "myapex_30",
726 min_sdk_version: "30",
727 defaults: ["my_defaults"],
728 }
729
730 apex {
731 name: "myapex_current",
732 min_sdk_version: "current",
733 defaults: ["my_defaults"],
734 }
735
736 apex {
737 name: "myapex_none",
738 defaults: ["my_defaults"],
739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746
747 filegroup {
748 name: "my-file-contexts",
749 srcs: ["product_specific_file_contexts"],
750 }
751 `, withFiles(map[string][]byte{
752 "product_specific_file_contexts": nil,
753 }), android.FixtureModifyProductVariables(
754 func(variables android.FixtureProductVariables) {
755 variables.Unbundled_build = proptools.BoolPtr(true)
756 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
757 }), android.FixtureMergeEnv(map[string]string{
758 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
759 }))
760
761 testCases := []struct {
762 module string
763 minSdkVersion string
764 }{
765 {
766 module: "myapex_30",
767 minSdkVersion: "30",
768 },
769 {
770 module: "myapex_current",
771 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
772 },
773 {
774 module: "myapex_none",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 }
778 for _, tc := range testCases {
779 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
780 args := module.Rule("apexRule").Args
781 optFlags := args["opt_flags"]
782 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
783 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
784 }
785 }
786}
787
Alex Light5098a612018-11-29 17:12:15 -0800788func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800789 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800790 apex {
791 name: "myapex",
792 key: "myapex.key",
793 payload_type: "zip",
794 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000795 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800796 }
797
798 apex_key {
799 name: "myapex.key",
800 public_key: "testkey.avbpubkey",
801 private_key: "testkey.pem",
802 }
803
804 cc_library {
805 name: "mylib",
806 srcs: ["mylib.cpp"],
807 shared_libs: ["mylib2"],
808 system_shared_libs: [],
809 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000810 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800811 }
812
813 cc_library {
814 name: "mylib2",
815 srcs: ["mylib.cpp"],
816 system_shared_libs: [],
817 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000818 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800819 }
820 `)
821
Sundong Ahnabb64432019-10-22 13:58:29 +0900822 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800823 copyCmds := zipApexRule.Args["copy_commands"]
824
825 // Ensure that main rule creates an output
826 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
827
828 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700829 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800830
831 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700832 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800833
834 // Ensure that both direct and indirect deps are copied into apex
835 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
836 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900837}
838
839func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800840 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900841 apex {
842 name: "myapex",
843 key: "myapex.key",
844 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900845 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000846 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900847 }
848
849 apex_key {
850 name: "myapex.key",
851 public_key: "testkey.avbpubkey",
852 private_key: "testkey.pem",
853 }
854
855 cc_library {
856 name: "mylib",
857 srcs: ["mylib.cpp"],
858 shared_libs: ["mylib2", "mylib3"],
859 system_shared_libs: [],
860 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000861 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900862 }
863
864 cc_library {
865 name: "mylib2",
866 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900867 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900868 system_shared_libs: [],
869 stl: "none",
870 stubs: {
871 versions: ["1", "2", "3"],
872 },
873 }
874
875 cc_library {
876 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900877 srcs: ["mylib.cpp"],
878 shared_libs: ["mylib4"],
879 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900880 stl: "none",
881 stubs: {
882 versions: ["10", "11", "12"],
883 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000884 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900885 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900886
887 cc_library {
888 name: "mylib4",
889 srcs: ["mylib.cpp"],
890 system_shared_libs: [],
891 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000892 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900893 }
Jiyong Park105dc322021-06-11 17:22:09 +0900894
895 rust_binary {
896 name: "foo.rust",
897 srcs: ["foo.rs"],
898 shared_libs: ["libfoo.shared_from_rust"],
899 prefer_rlib: true,
900 apex_available: ["myapex"],
901 }
902
903 cc_library_shared {
904 name: "libfoo.shared_from_rust",
905 srcs: ["mylib.cpp"],
906 system_shared_libs: [],
907 stl: "none",
908 stubs: {
909 versions: ["10", "11", "12"],
910 },
911 }
912
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913 `)
914
Sundong Ahnabb64432019-10-22 13:58:29 +0900915 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916 copyCmds := apexRule.Args["copy_commands"]
917
918 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800919 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900920
921 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800922 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923
924 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800925 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900926
Colin Crossaede88c2020-08-11 12:17:01 -0700927 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928
929 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900930 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900932 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900933
934 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700935 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700937 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900938
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700939 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
940 // is replaced by sharing of "cFlags" in cc/builder.go.
941 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
942 // module variable representing "cflags". So it was not detected by ensureNotContains.
943 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
944 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
945 // including the original cflags's "-include mylib.h".
946 //
Jiyong Park64379952018-12-13 18:37:29 +0900947 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700948 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
949 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900950
951 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700952 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900953
Jooyung Hana57af4a2020-01-23 05:36:59 +0000954 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900955 "lib64/mylib.so",
956 "lib64/mylib3.so",
957 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900958 "bin/foo.rust",
959 "lib64/libc++.so", // by the implicit dependency from foo.rust
960 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900961 })
Jiyong Park105dc322021-06-11 17:22:09 +0900962
963 // Ensure that stub dependency from a rust module is not included
964 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
965 // The rust module is linked to the stub cc library
966 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
967 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
968 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900969
970 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
971 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900972}
973
Jiyong Park1bc84122021-06-22 20:23:05 +0900974func TestApexCanUsePrivateApis(t *testing.T) {
975 ctx := testApex(t, `
976 apex {
977 name: "myapex",
978 key: "myapex.key",
979 native_shared_libs: ["mylib"],
980 binaries: ["foo.rust"],
981 updatable: false,
982 platform_apis: true,
983 }
984
985 apex_key {
986 name: "myapex.key",
987 public_key: "testkey.avbpubkey",
988 private_key: "testkey.pem",
989 }
990
991 cc_library {
992 name: "mylib",
993 srcs: ["mylib.cpp"],
994 shared_libs: ["mylib2"],
995 system_shared_libs: [],
996 stl: "none",
997 apex_available: [ "myapex" ],
998 }
999
1000 cc_library {
1001 name: "mylib2",
1002 srcs: ["mylib.cpp"],
1003 cflags: ["-include mylib.h"],
1004 system_shared_libs: [],
1005 stl: "none",
1006 stubs: {
1007 versions: ["1", "2", "3"],
1008 },
1009 }
1010
1011 rust_binary {
1012 name: "foo.rust",
1013 srcs: ["foo.rs"],
1014 shared_libs: ["libfoo.shared_from_rust"],
1015 prefer_rlib: true,
1016 apex_available: ["myapex"],
1017 }
1018
1019 cc_library_shared {
1020 name: "libfoo.shared_from_rust",
1021 srcs: ["mylib.cpp"],
1022 system_shared_libs: [],
1023 stl: "none",
1024 stubs: {
1025 versions: ["10", "11", "12"],
1026 },
1027 }
1028 `)
1029
1030 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1031 copyCmds := apexRule.Args["copy_commands"]
1032
1033 // Ensure that indirect stubs dep is not included
1034 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1035 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1036
1037 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1038 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001039 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001040 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1041 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001042 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001043 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1044 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1045}
1046
Colin Cross7812fd32020-09-25 12:35:10 -07001047func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1048 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001049 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001050 apex {
1051 name: "myapex",
1052 key: "myapex.key",
1053 native_shared_libs: ["mylib", "mylib3"],
1054 min_sdk_version: "29",
1055 }
1056
1057 apex_key {
1058 name: "myapex.key",
1059 public_key: "testkey.avbpubkey",
1060 private_key: "testkey.pem",
1061 }
1062
1063 cc_library {
1064 name: "mylib",
1065 srcs: ["mylib.cpp"],
1066 shared_libs: ["mylib2", "mylib3"],
1067 system_shared_libs: [],
1068 stl: "none",
1069 apex_available: [ "myapex" ],
1070 min_sdk_version: "28",
1071 }
1072
1073 cc_library {
1074 name: "mylib2",
1075 srcs: ["mylib.cpp"],
1076 cflags: ["-include mylib.h"],
1077 system_shared_libs: [],
1078 stl: "none",
1079 stubs: {
1080 versions: ["28", "29", "30", "current"],
1081 },
1082 min_sdk_version: "28",
1083 }
1084
1085 cc_library {
1086 name: "mylib3",
1087 srcs: ["mylib.cpp"],
1088 shared_libs: ["mylib4"],
1089 system_shared_libs: [],
1090 stl: "none",
1091 stubs: {
1092 versions: ["28", "29", "30", "current"],
1093 },
1094 apex_available: [ "myapex" ],
1095 min_sdk_version: "28",
1096 }
1097
1098 cc_library {
1099 name: "mylib4",
1100 srcs: ["mylib.cpp"],
1101 system_shared_libs: [],
1102 stl: "none",
1103 apex_available: [ "myapex" ],
1104 min_sdk_version: "28",
1105 }
1106 `)
1107
1108 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1109 copyCmds := apexRule.Args["copy_commands"]
1110
1111 // Ensure that direct non-stubs dep is always included
1112 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1113
1114 // Ensure that indirect stubs dep is not included
1115 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1116
1117 // Ensure that direct stubs dep is included
1118 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1119
1120 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1121
Jiyong Park55549df2021-02-26 23:57:23 +09001122 // Ensure that mylib is linking with the latest version of stub for mylib2
1123 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001124 // ... and not linking to the non-stub (impl) variant of mylib2
1125 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1126
1127 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1128 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1129 // .. and not linking to the stubs variant of mylib3
1130 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1131
1132 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001133 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001134 ensureNotContains(t, mylib2Cflags, "-include ")
1135
1136 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -07001137 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -07001138
1139 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1140 "lib64/mylib.so",
1141 "lib64/mylib3.so",
1142 "lib64/mylib4.so",
1143 })
1144}
1145
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001146func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1147 t.Parallel()
1148 // myapex (Z)
1149 // mylib -----------------.
1150 // |
1151 // otherapex (29) |
1152 // libstub's versions: 29 Z current
1153 // |
1154 // <platform> |
1155 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001156 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001157 apex {
1158 name: "myapex",
1159 key: "myapex.key",
1160 native_shared_libs: ["mylib"],
1161 min_sdk_version: "Z", // non-final
1162 }
1163
1164 cc_library {
1165 name: "mylib",
1166 srcs: ["mylib.cpp"],
1167 shared_libs: ["libstub"],
1168 apex_available: ["myapex"],
1169 min_sdk_version: "Z",
1170 }
1171
1172 apex_key {
1173 name: "myapex.key",
1174 public_key: "testkey.avbpubkey",
1175 private_key: "testkey.pem",
1176 }
1177
1178 apex {
1179 name: "otherapex",
1180 key: "myapex.key",
1181 native_shared_libs: ["libstub"],
1182 min_sdk_version: "29",
1183 }
1184
1185 cc_library {
1186 name: "libstub",
1187 srcs: ["mylib.cpp"],
1188 stubs: {
1189 versions: ["29", "Z", "current"],
1190 },
1191 apex_available: ["otherapex"],
1192 min_sdk_version: "29",
1193 }
1194
1195 // platform module depending on libstub from otherapex should use the latest stub("current")
1196 cc_library {
1197 name: "libplatform",
1198 srcs: ["mylib.cpp"],
1199 shared_libs: ["libstub"],
1200 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001201 `,
1202 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1203 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1204 variables.Platform_sdk_final = proptools.BoolPtr(false)
1205 variables.Platform_version_active_codenames = []string{"Z"}
1206 }),
1207 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001208
Jiyong Park55549df2021-02-26 23:57:23 +09001209 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001210 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001211 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001212 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001213 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001214
1215 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1216 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1217 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1218 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1219 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1220}
1221
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001222func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001223 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001224 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001225 name: "myapex2",
1226 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001227 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001228 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229 }
1230
1231 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001232 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001233 public_key: "testkey.avbpubkey",
1234 private_key: "testkey.pem",
1235 }
1236
1237 cc_library {
1238 name: "mylib",
1239 srcs: ["mylib.cpp"],
1240 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001241 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001242 system_shared_libs: [],
1243 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001244 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001245 }
1246
1247 cc_library {
1248 name: "libfoo",
1249 srcs: ["mylib.cpp"],
1250 shared_libs: ["libbar"],
1251 system_shared_libs: [],
1252 stl: "none",
1253 stubs: {
1254 versions: ["10", "20", "30"],
1255 },
1256 }
1257
1258 cc_library {
1259 name: "libbar",
1260 srcs: ["mylib.cpp"],
1261 system_shared_libs: [],
1262 stl: "none",
1263 }
1264
Jiyong Park678c8812020-02-07 17:25:49 +09001265 cc_library_static {
1266 name: "libbaz",
1267 srcs: ["mylib.cpp"],
1268 system_shared_libs: [],
1269 stl: "none",
1270 apex_available: [ "myapex2" ],
1271 }
1272
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001273 `)
1274
Jiyong Park83dc74b2020-01-14 18:38:44 +09001275 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001276 copyCmds := apexRule.Args["copy_commands"]
1277
1278 // Ensure that direct non-stubs dep is always included
1279 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1280
1281 // Ensure that indirect stubs dep is not included
1282 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1283
1284 // Ensure that dependency of stubs is not included
1285 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1286
Colin Crossaede88c2020-08-11 12:17:01 -07001287 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001288
1289 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001290 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001291 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001292 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001293
Jiyong Park3ff16992019-12-27 14:11:47 +09001294 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001295
1296 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1297 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001298
Artur Satayeva8bd1132020-04-27 18:07:06 +01001299 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001300 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001301
Artur Satayeva8bd1132020-04-27 18:07:06 +01001302 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001303 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001304}
1305
Jooyung Hand3639552019-08-09 12:57:43 +09001306func TestApexWithRuntimeLibsDependency(t *testing.T) {
1307 /*
1308 myapex
1309 |
1310 v (runtime_libs)
1311 mylib ------+------> libfoo [provides stub]
1312 |
1313 `------> libbar
1314 */
Colin Cross1c460562021-02-16 17:55:47 -08001315 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001316 apex {
1317 name: "myapex",
1318 key: "myapex.key",
1319 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001320 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001321 }
1322
1323 apex_key {
1324 name: "myapex.key",
1325 public_key: "testkey.avbpubkey",
1326 private_key: "testkey.pem",
1327 }
1328
1329 cc_library {
1330 name: "mylib",
1331 srcs: ["mylib.cpp"],
1332 runtime_libs: ["libfoo", "libbar"],
1333 system_shared_libs: [],
1334 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001335 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001336 }
1337
1338 cc_library {
1339 name: "libfoo",
1340 srcs: ["mylib.cpp"],
1341 system_shared_libs: [],
1342 stl: "none",
1343 stubs: {
1344 versions: ["10", "20", "30"],
1345 },
1346 }
1347
1348 cc_library {
1349 name: "libbar",
1350 srcs: ["mylib.cpp"],
1351 system_shared_libs: [],
1352 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001353 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001354 }
1355
1356 `)
1357
Sundong Ahnabb64432019-10-22 13:58:29 +09001358 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001359 copyCmds := apexRule.Args["copy_commands"]
1360
1361 // Ensure that direct non-stubs dep is always included
1362 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1363
1364 // Ensure that indirect stubs dep is not included
1365 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1366
1367 // Ensure that runtime_libs dep in included
1368 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1369
Sundong Ahnabb64432019-10-22 13:58:29 +09001370 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001371 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1372 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001373
1374}
1375
Paul Duffina02cae32021-03-09 01:44:06 +00001376var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1377 cc.PrepareForTestWithCcBuildComponents,
1378 PrepareForTestWithApexBuildComponents,
1379 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001380 apex {
1381 name: "com.android.runtime",
1382 key: "com.android.runtime.key",
1383 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001384 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001385 }
1386
1387 apex_key {
1388 name: "com.android.runtime.key",
1389 public_key: "testkey.avbpubkey",
1390 private_key: "testkey.pem",
1391 }
Paul Duffina02cae32021-03-09 01:44:06 +00001392 `),
1393 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1394)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001395
Paul Duffina02cae32021-03-09 01:44:06 +00001396func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001397 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001398 cc_library {
1399 name: "libc",
1400 no_libcrt: true,
1401 nocrt: true,
1402 stl: "none",
1403 system_shared_libs: [],
1404 stubs: { versions: ["1"] },
1405 apex_available: ["com.android.runtime"],
1406
1407 sanitize: {
1408 hwaddress: true,
1409 }
1410 }
1411
1412 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001413 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001414 no_libcrt: true,
1415 nocrt: true,
1416 stl: "none",
1417 system_shared_libs: [],
1418 srcs: [""],
1419 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001420 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001421
1422 sanitize: {
1423 never: true,
1424 },
Paul Duffina02cae32021-03-09 01:44:06 +00001425 } `)
1426 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001427
1428 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1429 "lib64/bionic/libc.so",
1430 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1431 })
1432
Colin Cross4c4c1be2022-02-10 11:41:18 -08001433 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001434
1435 installed := hwasan.Description("install libclang_rt.hwasan")
1436 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1437
1438 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1439 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1440 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1441}
1442
1443func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001444 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001445 prepareForTestOfRuntimeApexWithHwasan,
1446 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1447 variables.SanitizeDevice = []string{"hwaddress"}
1448 }),
1449 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001450 cc_library {
1451 name: "libc",
1452 no_libcrt: true,
1453 nocrt: true,
1454 stl: "none",
1455 system_shared_libs: [],
1456 stubs: { versions: ["1"] },
1457 apex_available: ["com.android.runtime"],
1458 }
1459
1460 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001461 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001462 no_libcrt: true,
1463 nocrt: true,
1464 stl: "none",
1465 system_shared_libs: [],
1466 srcs: [""],
1467 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001468 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001469
1470 sanitize: {
1471 never: true,
1472 },
1473 }
Paul Duffina02cae32021-03-09 01:44:06 +00001474 `)
1475 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001476
1477 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1478 "lib64/bionic/libc.so",
1479 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1480 })
1481
Colin Cross4c4c1be2022-02-10 11:41:18 -08001482 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001483
1484 installed := hwasan.Description("install libclang_rt.hwasan")
1485 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1486
1487 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1488 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1489 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1490}
1491
Jooyung Han61b66e92020-03-21 14:21:46 +00001492func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1493 testcases := []struct {
1494 name string
1495 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001496 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001497 shouldLink string
1498 shouldNotLink []string
1499 }{
1500 {
Jiyong Park55549df2021-02-26 23:57:23 +09001501 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001502 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001503 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001504 shouldLink: "current",
1505 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001506 },
1507 {
Jiyong Park55549df2021-02-26 23:57:23 +09001508 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001509 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001510 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001511 shouldLink: "current",
1512 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001513 },
1514 }
1515 for _, tc := range testcases {
1516 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001517 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001518 apex {
1519 name: "myapex",
1520 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001521 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001522 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001523 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001524 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001525
Jooyung Han61b66e92020-03-21 14:21:46 +00001526 apex_key {
1527 name: "myapex.key",
1528 public_key: "testkey.avbpubkey",
1529 private_key: "testkey.pem",
1530 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001531
Jooyung Han61b66e92020-03-21 14:21:46 +00001532 cc_library {
1533 name: "mylib",
1534 srcs: ["mylib.cpp"],
1535 vendor_available: true,
1536 shared_libs: ["libbar"],
1537 system_shared_libs: [],
1538 stl: "none",
1539 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001540 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001541 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001542
Jooyung Han61b66e92020-03-21 14:21:46 +00001543 cc_library {
1544 name: "libbar",
1545 srcs: ["mylib.cpp"],
1546 system_shared_libs: [],
1547 stl: "none",
1548 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001549 llndk: {
1550 symbol_file: "libbar.map.txt",
1551 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001552 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001553 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001554 withUnbundledBuild,
1555 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001556
Jooyung Han61b66e92020-03-21 14:21:46 +00001557 // Ensure that LLNDK dep is not included
1558 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1559 "lib64/mylib.so",
1560 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001561
Jooyung Han61b66e92020-03-21 14:21:46 +00001562 // Ensure that LLNDK dep is required
1563 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1564 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1565 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001566
Steven Moreland2c4000c2021-04-27 02:08:49 +00001567 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1568 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001569 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001570 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001571 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001572
Steven Moreland2c4000c2021-04-27 02:08:49 +00001573 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001574 ver := tc.shouldLink
1575 if tc.shouldLink == "current" {
1576 ver = strconv.Itoa(android.FutureApiLevelInt)
1577 }
1578 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001579 })
1580 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001581}
1582
Jiyong Park25fc6a92018-11-18 18:02:45 +09001583func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001584 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001585 apex {
1586 name: "myapex",
1587 key: "myapex.key",
1588 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001589 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001590 }
1591
1592 apex_key {
1593 name: "myapex.key",
1594 public_key: "testkey.avbpubkey",
1595 private_key: "testkey.pem",
1596 }
1597
1598 cc_library {
1599 name: "mylib",
1600 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001601 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001602 shared_libs: ["libdl#27"],
1603 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001604 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001605 }
1606
1607 cc_library_shared {
1608 name: "mylib_shared",
1609 srcs: ["mylib.cpp"],
1610 shared_libs: ["libdl#27"],
1611 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001612 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001613 }
1614
1615 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001616 name: "libBootstrap",
1617 srcs: ["mylib.cpp"],
1618 stl: "none",
1619 bootstrap: true,
1620 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001621 `)
1622
Sundong Ahnabb64432019-10-22 13:58:29 +09001623 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001624 copyCmds := apexRule.Args["copy_commands"]
1625
1626 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001627 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001628 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1629 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001630
1631 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001632 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001633
Colin Crossaede88c2020-08-11 12:17:01 -07001634 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1635 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1636 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001637
1638 // For dependency to libc
1639 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001640 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001641 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001642 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001643 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001644 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1645 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001646
1647 // For dependency to libm
1648 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001649 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001650 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001651 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001652 // ... and is not compiling with the stub
1653 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1654 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1655
1656 // For dependency to libdl
1657 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001658 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001659 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001660 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1661 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001662 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001663 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001664 // ... Cflags from stub is correctly exported to mylib
1665 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1666 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001667
1668 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001669 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1670 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1671 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1672 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001673}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001674
Jooyung Han749dc692020-04-15 11:03:39 +09001675func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001676 // there are three links between liba --> libz.
1677 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001678 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001679 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001680 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001681 apex {
1682 name: "myapex",
1683 key: "myapex.key",
1684 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001685 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001686 }
1687
1688 apex {
1689 name: "otherapex",
1690 key: "myapex.key",
1691 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001692 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001693 }
1694
1695 apex_key {
1696 name: "myapex.key",
1697 public_key: "testkey.avbpubkey",
1698 private_key: "testkey.pem",
1699 }
1700
1701 cc_library {
1702 name: "libx",
1703 shared_libs: ["liba"],
1704 system_shared_libs: [],
1705 stl: "none",
1706 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001707 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001708 }
1709
1710 cc_library {
1711 name: "liby",
1712 shared_libs: ["liba"],
1713 system_shared_libs: [],
1714 stl: "none",
1715 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001716 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001717 }
1718
1719 cc_library {
1720 name: "liba",
1721 shared_libs: ["libz"],
1722 system_shared_libs: [],
1723 stl: "none",
1724 apex_available: [
1725 "//apex_available:anyapex",
1726 "//apex_available:platform",
1727 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001728 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001729 }
1730
1731 cc_library {
1732 name: "libz",
1733 system_shared_libs: [],
1734 stl: "none",
1735 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001736 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001737 },
1738 }
Jooyung Han749dc692020-04-15 11:03:39 +09001739 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001740
1741 expectLink := func(from, from_variant, to, to_variant string) {
1742 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1743 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1744 }
1745 expectNoLink := func(from, from_variant, to, to_variant string) {
1746 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1747 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1748 }
1749 // platform liba is linked to non-stub version
1750 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001751 // liba in myapex is linked to current
1752 expectLink("liba", "shared_apex29", "libz", "shared_current")
1753 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001754 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001755 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001756 // liba in otherapex is linked to current
1757 expectLink("liba", "shared_apex30", "libz", "shared_current")
1758 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001759 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1760 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001761}
1762
Jooyung Hanaed150d2020-04-02 01:41:41 +09001763func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001764 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001765 apex {
1766 name: "myapex",
1767 key: "myapex.key",
1768 native_shared_libs: ["libx"],
1769 min_sdk_version: "R",
1770 }
1771
1772 apex_key {
1773 name: "myapex.key",
1774 public_key: "testkey.avbpubkey",
1775 private_key: "testkey.pem",
1776 }
1777
1778 cc_library {
1779 name: "libx",
1780 shared_libs: ["libz"],
1781 system_shared_libs: [],
1782 stl: "none",
1783 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001784 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001785 }
1786
1787 cc_library {
1788 name: "libz",
1789 system_shared_libs: [],
1790 stl: "none",
1791 stubs: {
1792 versions: ["29", "R"],
1793 },
1794 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001795 `,
1796 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1797 variables.Platform_version_active_codenames = []string{"R"}
1798 }),
1799 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001800
1801 expectLink := func(from, from_variant, to, to_variant string) {
1802 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1803 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1804 }
1805 expectNoLink := func(from, from_variant, to, to_variant string) {
1806 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1807 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1808 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001809 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1810 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001811 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1812 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001813}
1814
Jooyung Han4c4da062021-06-23 10:23:16 +09001815func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1816 testApex(t, `
1817 apex {
1818 name: "myapex",
1819 key: "myapex.key",
1820 java_libs: ["libx"],
1821 min_sdk_version: "S",
1822 }
1823
1824 apex_key {
1825 name: "myapex.key",
1826 public_key: "testkey.avbpubkey",
1827 private_key: "testkey.pem",
1828 }
1829
1830 java_library {
1831 name: "libx",
1832 srcs: ["a.java"],
1833 apex_available: [ "myapex" ],
1834 sdk_version: "current",
1835 min_sdk_version: "S", // should be okay
1836 }
1837 `,
1838 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1839 variables.Platform_version_active_codenames = []string{"S"}
1840 variables.Platform_sdk_codename = proptools.StringPtr("S")
1841 }),
1842 )
1843}
1844
Jooyung Han749dc692020-04-15 11:03:39 +09001845func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001846 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001847 apex {
1848 name: "myapex",
1849 key: "myapex.key",
1850 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001851 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001852 }
1853
1854 apex_key {
1855 name: "myapex.key",
1856 public_key: "testkey.avbpubkey",
1857 private_key: "testkey.pem",
1858 }
1859
1860 cc_library {
1861 name: "libx",
1862 shared_libs: ["libz"],
1863 system_shared_libs: [],
1864 stl: "none",
1865 apex_available: [ "myapex" ],
1866 }
1867
1868 cc_library {
1869 name: "libz",
1870 system_shared_libs: [],
1871 stl: "none",
1872 stubs: {
1873 versions: ["1", "2"],
1874 },
1875 }
1876 `)
1877
1878 expectLink := func(from, from_variant, to, to_variant string) {
1879 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1880 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1881 }
1882 expectNoLink := func(from, from_variant, to, to_variant string) {
1883 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1884 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1885 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001886 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001887 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001888 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001889 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001890}
1891
Jiyong Park5df7bd32021-08-25 16:18:46 +09001892func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1893 ctx := testApex(t, `
1894 apex {
1895 name: "myapex",
1896 key: "myapex.key",
1897 native_shared_libs: ["mylib"],
1898 updatable: false,
1899 vendor: true,
1900 min_sdk_version: "29",
1901 }
1902
1903 apex_key {
1904 name: "myapex.key",
1905 public_key: "testkey.avbpubkey",
1906 private_key: "testkey.pem",
1907 }
1908
1909 cc_library {
1910 name: "mylib",
1911 vendor_available: true,
1912 system_shared_libs: [],
1913 stl: "none",
1914 apex_available: [ "myapex" ],
1915 min_sdk_version: "29",
1916 }
1917 `)
1918
1919 vendorVariant := "android_vendor.29_arm64_armv8-a"
1920
1921 // First check that the correct variant of crtbegin_so is used.
1922 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1923 crtBegin := names(ldRule.Args["crtBegin"])
1924 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1925
1926 // Ensure that the crtbegin_so used by the APEX is targeting 29
1927 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1928 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1929}
1930
Jooyung Han03b51852020-02-26 22:45:42 +09001931func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001932 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001933 apex {
1934 name: "myapex",
1935 key: "myapex.key",
1936 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001937 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001938 }
1939
1940 apex_key {
1941 name: "myapex.key",
1942 public_key: "testkey.avbpubkey",
1943 private_key: "testkey.pem",
1944 }
1945
1946 cc_library {
1947 name: "libx",
1948 system_shared_libs: [],
1949 stl: "none",
1950 apex_available: [ "myapex" ],
1951 stubs: {
1952 versions: ["1", "2"],
1953 },
1954 }
1955
1956 cc_library {
1957 name: "libz",
1958 shared_libs: ["libx"],
1959 system_shared_libs: [],
1960 stl: "none",
1961 }
1962 `)
1963
1964 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001965 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001966 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1967 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1968 }
1969 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001970 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001971 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1972 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1973 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001974 expectLink("libz", "shared", "libx", "shared_current")
1975 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001976 expectNoLink("libz", "shared", "libz", "shared_1")
1977 expectNoLink("libz", "shared", "libz", "shared")
1978}
1979
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001980var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1981 func(variables android.FixtureProductVariables) {
1982 variables.SanitizeDevice = []string{"hwaddress"}
1983 },
1984)
1985
Jooyung Han75568392020-03-20 04:29:24 +09001986func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001987 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001988 apex {
1989 name: "myapex",
1990 key: "myapex.key",
1991 native_shared_libs: ["libx"],
1992 min_sdk_version: "29",
1993 }
1994
1995 apex_key {
1996 name: "myapex.key",
1997 public_key: "testkey.avbpubkey",
1998 private_key: "testkey.pem",
1999 }
2000
2001 cc_library {
2002 name: "libx",
2003 shared_libs: ["libbar"],
2004 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002005 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002006 }
2007
2008 cc_library {
2009 name: "libbar",
2010 stubs: {
2011 versions: ["29", "30"],
2012 },
2013 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002014 `,
2015 prepareForTestWithSantitizeHwaddress,
2016 )
Jooyung Han03b51852020-02-26 22:45:42 +09002017 expectLink := func(from, from_variant, to, to_variant string) {
2018 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2019 libFlags := ld.Args["libFlags"]
2020 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2021 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002022 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002023}
2024
Jooyung Han75568392020-03-20 04:29:24 +09002025func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002026 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002027 apex {
2028 name: "myapex",
2029 key: "myapex.key",
2030 native_shared_libs: ["libx"],
2031 min_sdk_version: "29",
2032 }
2033
2034 apex_key {
2035 name: "myapex.key",
2036 public_key: "testkey.avbpubkey",
2037 private_key: "testkey.pem",
2038 }
2039
2040 cc_library {
2041 name: "libx",
2042 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002043 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002044 }
Jooyung Han75568392020-03-20 04:29:24 +09002045 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002046
2047 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002048 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002049 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002050 // note that platform variant is not.
2051 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002052 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002053}
2054
Jooyung Han749dc692020-04-15 11:03:39 +09002055func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2056 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002057 apex {
2058 name: "myapex",
2059 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002060 native_shared_libs: ["mylib"],
2061 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002062 }
2063
2064 apex_key {
2065 name: "myapex.key",
2066 public_key: "testkey.avbpubkey",
2067 private_key: "testkey.pem",
2068 }
Jooyung Han749dc692020-04-15 11:03:39 +09002069
2070 cc_library {
2071 name: "mylib",
2072 srcs: ["mylib.cpp"],
2073 system_shared_libs: [],
2074 stl: "none",
2075 apex_available: [
2076 "myapex",
2077 ],
2078 min_sdk_version: "30",
2079 }
2080 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002081
2082 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2083 apex {
2084 name: "myapex",
2085 key: "myapex.key",
2086 native_shared_libs: ["libfoo.ffi"],
2087 min_sdk_version: "29",
2088 }
2089
2090 apex_key {
2091 name: "myapex.key",
2092 public_key: "testkey.avbpubkey",
2093 private_key: "testkey.pem",
2094 }
2095
2096 rust_ffi_shared {
2097 name: "libfoo.ffi",
2098 srcs: ["foo.rs"],
2099 crate_name: "foo",
2100 apex_available: [
2101 "myapex",
2102 ],
2103 min_sdk_version: "30",
2104 }
2105 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002106
2107 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2108 apex {
2109 name: "myapex",
2110 key: "myapex.key",
2111 java_libs: ["libfoo"],
2112 min_sdk_version: "29",
2113 }
2114
2115 apex_key {
2116 name: "myapex.key",
2117 public_key: "testkey.avbpubkey",
2118 private_key: "testkey.pem",
2119 }
2120
2121 java_import {
2122 name: "libfoo",
2123 jars: ["libfoo.jar"],
2124 apex_available: [
2125 "myapex",
2126 ],
2127 min_sdk_version: "30",
2128 }
2129 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002130}
2131
2132func TestApexMinSdkVersion_Okay(t *testing.T) {
2133 testApex(t, `
2134 apex {
2135 name: "myapex",
2136 key: "myapex.key",
2137 native_shared_libs: ["libfoo"],
2138 java_libs: ["libbar"],
2139 min_sdk_version: "29",
2140 }
2141
2142 apex_key {
2143 name: "myapex.key",
2144 public_key: "testkey.avbpubkey",
2145 private_key: "testkey.pem",
2146 }
2147
2148 cc_library {
2149 name: "libfoo",
2150 srcs: ["mylib.cpp"],
2151 shared_libs: ["libfoo_dep"],
2152 apex_available: ["myapex"],
2153 min_sdk_version: "29",
2154 }
2155
2156 cc_library {
2157 name: "libfoo_dep",
2158 srcs: ["mylib.cpp"],
2159 apex_available: ["myapex"],
2160 min_sdk_version: "29",
2161 }
2162
2163 java_library {
2164 name: "libbar",
2165 sdk_version: "current",
2166 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002167 static_libs: [
2168 "libbar_dep",
2169 "libbar_import_dep",
2170 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002171 apex_available: ["myapex"],
2172 min_sdk_version: "29",
2173 }
2174
2175 java_library {
2176 name: "libbar_dep",
2177 sdk_version: "current",
2178 srcs: ["a.java"],
2179 apex_available: ["myapex"],
2180 min_sdk_version: "29",
2181 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002182
2183 java_import {
2184 name: "libbar_import_dep",
2185 jars: ["libbar.jar"],
2186 apex_available: ["myapex"],
2187 min_sdk_version: "29",
2188 }
Jooyung Han03b51852020-02-26 22:45:42 +09002189 `)
2190}
2191
Artur Satayev8cf899a2020-04-15 17:29:42 +01002192func TestJavaStableSdkVersion(t *testing.T) {
2193 testCases := []struct {
2194 name string
2195 expectedError string
2196 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002197 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002198 }{
2199 {
2200 name: "Non-updatable apex with non-stable dep",
2201 bp: `
2202 apex {
2203 name: "myapex",
2204 java_libs: ["myjar"],
2205 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002206 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002207 }
2208 apex_key {
2209 name: "myapex.key",
2210 public_key: "testkey.avbpubkey",
2211 private_key: "testkey.pem",
2212 }
2213 java_library {
2214 name: "myjar",
2215 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002216 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002217 apex_available: ["myapex"],
2218 }
2219 `,
2220 },
2221 {
2222 name: "Updatable apex with stable dep",
2223 bp: `
2224 apex {
2225 name: "myapex",
2226 java_libs: ["myjar"],
2227 key: "myapex.key",
2228 updatable: true,
2229 min_sdk_version: "29",
2230 }
2231 apex_key {
2232 name: "myapex.key",
2233 public_key: "testkey.avbpubkey",
2234 private_key: "testkey.pem",
2235 }
2236 java_library {
2237 name: "myjar",
2238 srcs: ["foo/bar/MyClass.java"],
2239 sdk_version: "current",
2240 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002241 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002242 }
2243 `,
2244 },
2245 {
2246 name: "Updatable apex with non-stable dep",
2247 expectedError: "cannot depend on \"myjar\"",
2248 bp: `
2249 apex {
2250 name: "myapex",
2251 java_libs: ["myjar"],
2252 key: "myapex.key",
2253 updatable: true,
2254 }
2255 apex_key {
2256 name: "myapex.key",
2257 public_key: "testkey.avbpubkey",
2258 private_key: "testkey.pem",
2259 }
2260 java_library {
2261 name: "myjar",
2262 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002263 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002264 apex_available: ["myapex"],
2265 }
2266 `,
2267 },
2268 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002269 name: "Updatable apex with non-stable legacy core platform dep",
2270 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2271 bp: `
2272 apex {
2273 name: "myapex",
2274 java_libs: ["myjar-uses-legacy"],
2275 key: "myapex.key",
2276 updatable: true,
2277 }
2278 apex_key {
2279 name: "myapex.key",
2280 public_key: "testkey.avbpubkey",
2281 private_key: "testkey.pem",
2282 }
2283 java_library {
2284 name: "myjar-uses-legacy",
2285 srcs: ["foo/bar/MyClass.java"],
2286 sdk_version: "core_platform",
2287 apex_available: ["myapex"],
2288 }
2289 `,
2290 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2291 },
2292 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002293 name: "Updatable apex with non-stable transitive dep",
2294 // This is not actually detecting that the transitive dependency is unstable, rather it is
2295 // detecting that the transitive dependency is building against a wider API surface than the
2296 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002297 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002298 bp: `
2299 apex {
2300 name: "myapex",
2301 java_libs: ["myjar"],
2302 key: "myapex.key",
2303 updatable: true,
2304 }
2305 apex_key {
2306 name: "myapex.key",
2307 public_key: "testkey.avbpubkey",
2308 private_key: "testkey.pem",
2309 }
2310 java_library {
2311 name: "myjar",
2312 srcs: ["foo/bar/MyClass.java"],
2313 sdk_version: "current",
2314 apex_available: ["myapex"],
2315 static_libs: ["transitive-jar"],
2316 }
2317 java_library {
2318 name: "transitive-jar",
2319 srcs: ["foo/bar/MyClass.java"],
2320 sdk_version: "core_platform",
2321 apex_available: ["myapex"],
2322 }
2323 `,
2324 },
2325 }
2326
2327 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002328 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2329 continue
2330 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002331 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002332 errorHandler := android.FixtureExpectsNoErrors
2333 if test.expectedError != "" {
2334 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002335 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002336 android.GroupFixturePreparers(
2337 java.PrepareForTestWithJavaDefaultModules,
2338 PrepareForTestWithApexBuildComponents,
2339 prepareForTestWithMyapex,
2340 android.OptionalFixturePreparer(test.preparer),
2341 ).
2342 ExtendWithErrorHandler(errorHandler).
2343 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002344 })
2345 }
2346}
2347
Jooyung Han749dc692020-04-15 11:03:39 +09002348func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2349 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2350 apex {
2351 name: "myapex",
2352 key: "myapex.key",
2353 native_shared_libs: ["mylib"],
2354 min_sdk_version: "29",
2355 }
2356
2357 apex_key {
2358 name: "myapex.key",
2359 public_key: "testkey.avbpubkey",
2360 private_key: "testkey.pem",
2361 }
2362
2363 cc_library {
2364 name: "mylib",
2365 srcs: ["mylib.cpp"],
2366 shared_libs: ["mylib2"],
2367 system_shared_libs: [],
2368 stl: "none",
2369 apex_available: [
2370 "myapex",
2371 ],
2372 min_sdk_version: "29",
2373 }
2374
2375 // indirect part of the apex
2376 cc_library {
2377 name: "mylib2",
2378 srcs: ["mylib.cpp"],
2379 system_shared_libs: [],
2380 stl: "none",
2381 apex_available: [
2382 "myapex",
2383 ],
2384 min_sdk_version: "30",
2385 }
2386 `)
2387}
2388
2389func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2390 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2391 apex {
2392 name: "myapex",
2393 key: "myapex.key",
2394 apps: ["AppFoo"],
2395 min_sdk_version: "29",
2396 }
2397
2398 apex_key {
2399 name: "myapex.key",
2400 public_key: "testkey.avbpubkey",
2401 private_key: "testkey.pem",
2402 }
2403
2404 android_app {
2405 name: "AppFoo",
2406 srcs: ["foo/bar/MyClass.java"],
2407 sdk_version: "current",
2408 min_sdk_version: "29",
2409 system_modules: "none",
2410 stl: "none",
2411 static_libs: ["bar"],
2412 apex_available: [ "myapex" ],
2413 }
2414
2415 java_library {
2416 name: "bar",
2417 sdk_version: "current",
2418 srcs: ["a.java"],
2419 apex_available: [ "myapex" ],
2420 }
2421 `)
2422}
2423
2424func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002425 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002426 apex {
2427 name: "myapex",
2428 key: "myapex.key",
2429 native_shared_libs: ["mylib"],
2430 min_sdk_version: "29",
2431 }
2432
2433 apex_key {
2434 name: "myapex.key",
2435 public_key: "testkey.avbpubkey",
2436 private_key: "testkey.pem",
2437 }
2438
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002439 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002440 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2441 cc_library {
2442 name: "mylib",
2443 srcs: ["mylib.cpp"],
2444 shared_libs: ["mylib2"],
2445 system_shared_libs: [],
2446 stl: "none",
2447 apex_available: ["myapex", "otherapex"],
2448 min_sdk_version: "29",
2449 }
2450
2451 cc_library {
2452 name: "mylib2",
2453 srcs: ["mylib.cpp"],
2454 system_shared_libs: [],
2455 stl: "none",
2456 apex_available: ["otherapex"],
2457 stubs: { versions: ["29", "30"] },
2458 min_sdk_version: "30",
2459 }
2460
2461 apex {
2462 name: "otherapex",
2463 key: "myapex.key",
2464 native_shared_libs: ["mylib", "mylib2"],
2465 min_sdk_version: "30",
2466 }
2467 `)
2468 expectLink := func(from, from_variant, to, to_variant string) {
2469 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2470 libFlags := ld.Args["libFlags"]
2471 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2472 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002473 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002474 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002475}
2476
Jooyung Haned124c32021-01-26 11:43:46 +09002477func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002478 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2479 func(variables android.FixtureProductVariables) {
2480 variables.Platform_sdk_codename = proptools.StringPtr("S")
2481 variables.Platform_version_active_codenames = []string{"S"}
2482 },
2483 )
Jooyung Haned124c32021-01-26 11:43:46 +09002484 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2485 apex {
2486 name: "myapex",
2487 key: "myapex.key",
2488 native_shared_libs: ["libfoo"],
2489 min_sdk_version: "S",
2490 }
2491 apex_key {
2492 name: "myapex.key",
2493 public_key: "testkey.avbpubkey",
2494 private_key: "testkey.pem",
2495 }
2496 cc_library {
2497 name: "libfoo",
2498 shared_libs: ["libbar"],
2499 apex_available: ["myapex"],
2500 min_sdk_version: "29",
2501 }
2502 cc_library {
2503 name: "libbar",
2504 apex_available: ["myapex"],
2505 }
2506 `, withSAsActiveCodeNames)
2507}
2508
2509func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002510 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2511 variables.Platform_sdk_codename = proptools.StringPtr("S")
2512 variables.Platform_version_active_codenames = []string{"S", "T"}
2513 })
Colin Cross1c460562021-02-16 17:55:47 -08002514 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002515 apex {
2516 name: "myapex",
2517 key: "myapex.key",
2518 native_shared_libs: ["libfoo"],
2519 min_sdk_version: "S",
2520 }
2521 apex_key {
2522 name: "myapex.key",
2523 public_key: "testkey.avbpubkey",
2524 private_key: "testkey.pem",
2525 }
2526 cc_library {
2527 name: "libfoo",
2528 shared_libs: ["libbar"],
2529 apex_available: ["myapex"],
2530 min_sdk_version: "S",
2531 }
2532 cc_library {
2533 name: "libbar",
2534 stubs: {
2535 symbol_file: "libbar.map.txt",
2536 versions: ["30", "S", "T"],
2537 },
2538 }
2539 `, withSAsActiveCodeNames)
2540
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002541 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002542 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2543 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002544 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002545}
2546
Jiyong Park7c2ee712018-12-07 00:42:25 +09002547func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002548 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002549 apex {
2550 name: "myapex",
2551 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002552 native_shared_libs: ["mylib"],
2553 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002554 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002555 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002556 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002557 }
2558
2559 apex_key {
2560 name: "myapex.key",
2561 public_key: "testkey.avbpubkey",
2562 private_key: "testkey.pem",
2563 }
2564
2565 prebuilt_etc {
2566 name: "myetc",
2567 src: "myprebuilt",
2568 sub_dir: "foo/bar",
2569 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002570
2571 cc_library {
2572 name: "mylib",
2573 srcs: ["mylib.cpp"],
2574 relative_install_path: "foo/bar",
2575 system_shared_libs: [],
2576 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002577 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002578 }
2579
2580 cc_binary {
2581 name: "mybin",
2582 srcs: ["mylib.cpp"],
2583 relative_install_path: "foo/bar",
2584 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002585 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002586 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002587 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002588 `)
2589
Sundong Ahnabb64432019-10-22 13:58:29 +09002590 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002591 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002592
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002593 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002594 ensureContains(t, cmd, "/etc ")
2595 ensureContains(t, cmd, "/etc/foo ")
2596 ensureContains(t, cmd, "/etc/foo/bar ")
2597 ensureContains(t, cmd, "/lib64 ")
2598 ensureContains(t, cmd, "/lib64/foo ")
2599 ensureContains(t, cmd, "/lib64/foo/bar ")
2600 ensureContains(t, cmd, "/lib ")
2601 ensureContains(t, cmd, "/lib/foo ")
2602 ensureContains(t, cmd, "/lib/foo/bar ")
2603 ensureContains(t, cmd, "/bin ")
2604 ensureContains(t, cmd, "/bin/foo ")
2605 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002606}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002607
Jooyung Han35155c42020-02-06 17:33:20 +09002608func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002609 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002610 apex {
2611 name: "myapex",
2612 key: "myapex.key",
2613 multilib: {
2614 both: {
2615 native_shared_libs: ["mylib"],
2616 binaries: ["mybin"],
2617 },
2618 },
2619 compile_multilib: "both",
2620 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002621 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002622 }
2623
2624 apex_key {
2625 name: "myapex.key",
2626 public_key: "testkey.avbpubkey",
2627 private_key: "testkey.pem",
2628 }
2629
2630 cc_library {
2631 name: "mylib",
2632 relative_install_path: "foo/bar",
2633 system_shared_libs: [],
2634 stl: "none",
2635 apex_available: [ "myapex" ],
2636 native_bridge_supported: true,
2637 }
2638
2639 cc_binary {
2640 name: "mybin",
2641 relative_install_path: "foo/bar",
2642 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002643 stl: "none",
2644 apex_available: [ "myapex" ],
2645 native_bridge_supported: true,
2646 compile_multilib: "both", // default is "first" for binary
2647 multilib: {
2648 lib64: {
2649 suffix: "64",
2650 },
2651 },
2652 }
2653 `, withNativeBridgeEnabled)
2654 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2655 "bin/foo/bar/mybin",
2656 "bin/foo/bar/mybin64",
2657 "bin/arm/foo/bar/mybin",
2658 "bin/arm64/foo/bar/mybin64",
2659 "lib/foo/bar/mylib.so",
2660 "lib/arm/foo/bar/mylib.so",
2661 "lib64/foo/bar/mylib.so",
2662 "lib64/arm64/foo/bar/mylib.so",
2663 })
2664}
2665
Jooyung Han85d61762020-06-24 23:50:26 +09002666func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002667 result := android.GroupFixturePreparers(
2668 prepareForApexTest,
2669 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2670 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002671 apex {
2672 name: "myapex",
2673 key: "myapex.key",
2674 binaries: ["mybin"],
2675 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002676 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002677 }
2678 apex_key {
2679 name: "myapex.key",
2680 public_key: "testkey.avbpubkey",
2681 private_key: "testkey.pem",
2682 }
2683 cc_binary {
2684 name: "mybin",
2685 vendor: true,
2686 shared_libs: ["libfoo"],
2687 }
2688 cc_library {
2689 name: "libfoo",
2690 proprietary: true,
2691 }
2692 `)
2693
Colin Crossc68db4b2021-11-11 18:59:15 -08002694 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002695 "bin/mybin",
2696 "lib64/libfoo.so",
2697 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2698 "lib64/libc++.so",
2699 })
2700
Colin Crossc68db4b2021-11-11 18:59:15 -08002701 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2702 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002703 name := apexBundle.BaseModuleName()
2704 prefix := "TARGET_"
2705 var builder strings.Builder
2706 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002707 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002708 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002709 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002710
Colin Crossc68db4b2021-11-11 18:59:15 -08002711 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002712 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2713 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002714}
2715
Jooyung Hanc5a96762022-02-04 11:54:50 +09002716func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2717 testApexError(t, `Trying to include a VNDK library`, `
2718 apex {
2719 name: "myapex",
2720 key: "myapex.key",
2721 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2722 vendor: true,
2723 use_vndk_as_stable: true,
2724 updatable: false,
2725 }
2726 apex_key {
2727 name: "myapex.key",
2728 public_key: "testkey.avbpubkey",
2729 private_key: "testkey.pem",
2730 }`)
2731}
2732
Jooyung Handf78e212020-07-22 15:54:47 +09002733func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002734 // myapex myapex2
2735 // | |
2736 // mybin ------. mybin2
2737 // \ \ / |
2738 // (stable) .---\--------` |
2739 // \ / \ |
2740 // \ / \ /
2741 // libvndk libvendor
2742 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002743 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002744 apex {
2745 name: "myapex",
2746 key: "myapex.key",
2747 binaries: ["mybin"],
2748 vendor: true,
2749 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002750 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002751 }
2752 apex_key {
2753 name: "myapex.key",
2754 public_key: "testkey.avbpubkey",
2755 private_key: "testkey.pem",
2756 }
2757 cc_binary {
2758 name: "mybin",
2759 vendor: true,
2760 shared_libs: ["libvndk", "libvendor"],
2761 }
2762 cc_library {
2763 name: "libvndk",
2764 vndk: {
2765 enabled: true,
2766 },
2767 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002768 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002769 }
2770 cc_library {
2771 name: "libvendor",
2772 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002773 stl: "none",
2774 }
2775 apex {
2776 name: "myapex2",
2777 key: "myapex.key",
2778 binaries: ["mybin2"],
2779 vendor: true,
2780 use_vndk_as_stable: false,
2781 updatable: false,
2782 }
2783 cc_binary {
2784 name: "mybin2",
2785 vendor: true,
2786 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002787 }
2788 `)
2789
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002790 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002791
Jooyung Han91f92032022-02-04 12:36:33 +09002792 for _, tc := range []struct {
2793 name string
2794 apexName string
2795 moduleName string
2796 moduleVariant string
2797 libs []string
2798 contents []string
2799 requireVndkNamespace bool
2800 }{
2801 {
2802 name: "use_vndk_as_stable",
2803 apexName: "myapex",
2804 moduleName: "mybin",
2805 moduleVariant: vendorVariant + "_apex10000",
2806 libs: []string{
2807 // should link with vendor variants of VNDK libs(libvndk/libc++)
2808 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2809 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2810 // unstable Vendor libs as APEX variant
2811 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2812 },
2813 contents: []string{
2814 "bin/mybin",
2815 "lib64/libvendor.so",
2816 // VNDK libs (libvndk/libc++) are not included
2817 },
2818 requireVndkNamespace: true,
2819 },
2820 {
2821 name: "!use_vndk_as_stable",
2822 apexName: "myapex2",
2823 moduleName: "mybin2",
2824 moduleVariant: vendorVariant + "_myapex2",
2825 libs: []string{
2826 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2827 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2828 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2829 // unstable vendor libs have "merged" APEX variants
2830 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2831 },
2832 contents: []string{
2833 "bin/mybin2",
2834 "lib64/libvendor.so",
2835 // VNDK libs are included as well
2836 "lib64/libvndk.so",
2837 "lib64/libc++.so",
2838 },
2839 requireVndkNamespace: false,
2840 },
2841 } {
2842 t.Run(tc.name, func(t *testing.T) {
2843 // Check linked libs
2844 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2845 libs := names(ldRule.Args["libFlags"])
2846 for _, lib := range tc.libs {
2847 ensureListContains(t, libs, lib)
2848 }
2849 // Check apex contents
2850 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002851
Jooyung Han91f92032022-02-04 12:36:33 +09002852 // Check "requireNativeLibs"
2853 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2854 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2855 if tc.requireVndkNamespace {
2856 ensureListContains(t, requireNativeLibs, ":vndk")
2857 } else {
2858 ensureListNotContains(t, requireNativeLibs, ":vndk")
2859 }
2860 })
2861 }
Jooyung Handf78e212020-07-22 15:54:47 +09002862}
2863
Justin Yun13decfb2021-03-08 19:25:55 +09002864func TestProductVariant(t *testing.T) {
2865 ctx := testApex(t, `
2866 apex {
2867 name: "myapex",
2868 key: "myapex.key",
2869 updatable: false,
2870 product_specific: true,
2871 binaries: ["foo"],
2872 }
2873
2874 apex_key {
2875 name: "myapex.key",
2876 public_key: "testkey.avbpubkey",
2877 private_key: "testkey.pem",
2878 }
2879
2880 cc_binary {
2881 name: "foo",
2882 product_available: true,
2883 apex_available: ["myapex"],
2884 srcs: ["foo.cpp"],
2885 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002886 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2887 variables.ProductVndkVersion = proptools.StringPtr("current")
2888 }),
2889 )
Justin Yun13decfb2021-03-08 19:25:55 +09002890
2891 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002892 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002893 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2894 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2895 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2896 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2897}
2898
Jooyung Han8e5685d2020-09-21 11:02:57 +09002899func TestApex_withPrebuiltFirmware(t *testing.T) {
2900 testCases := []struct {
2901 name string
2902 additionalProp string
2903 }{
2904 {"system apex with prebuilt_firmware", ""},
2905 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2906 }
2907 for _, tc := range testCases {
2908 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002909 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002910 apex {
2911 name: "myapex",
2912 key: "myapex.key",
2913 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002914 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002915 `+tc.additionalProp+`
2916 }
2917 apex_key {
2918 name: "myapex.key",
2919 public_key: "testkey.avbpubkey",
2920 private_key: "testkey.pem",
2921 }
2922 prebuilt_firmware {
2923 name: "myfirmware",
2924 src: "myfirmware.bin",
2925 filename_from_src: true,
2926 `+tc.additionalProp+`
2927 }
2928 `)
2929 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2930 "etc/firmware/myfirmware.bin",
2931 })
2932 })
2933 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002934}
2935
Jooyung Hanefb184e2020-06-25 17:14:25 +09002936func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002937 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002938 apex {
2939 name: "myapex",
2940 key: "myapex.key",
2941 vendor: true,
2942 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002943 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002944 }
2945
2946 apex_key {
2947 name: "myapex.key",
2948 public_key: "testkey.avbpubkey",
2949 private_key: "testkey.pem",
2950 }
2951
2952 cc_library {
2953 name: "mylib",
2954 vendor_available: true,
2955 }
2956 `)
2957
2958 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002959 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002960 name := apexBundle.BaseModuleName()
2961 prefix := "TARGET_"
2962 var builder strings.Builder
2963 data.Custom(&builder, name, prefix, "", data)
2964 androidMk := builder.String()
2965 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2966}
2967
Jooyung Han2ed99d02020-06-24 23:26:26 +09002968func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002969 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002970 apex {
2971 name: "myapex",
2972 key: "myapex.key",
2973 vintf_fragments: ["fragment.xml"],
2974 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002975 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002976 }
2977 apex_key {
2978 name: "myapex.key",
2979 public_key: "testkey.avbpubkey",
2980 private_key: "testkey.pem",
2981 }
2982 cc_binary {
2983 name: "mybin",
2984 }
2985 `)
2986
2987 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002988 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002989 name := apexBundle.BaseModuleName()
2990 prefix := "TARGET_"
2991 var builder strings.Builder
2992 data.Custom(&builder, name, prefix, "", data)
2993 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002994 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002995 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002996}
2997
Jiyong Park16e91a02018-12-20 18:18:08 +09002998func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002999 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003000 apex {
3001 name: "myapex",
3002 key: "myapex.key",
3003 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003004 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003005 }
3006
3007 apex_key {
3008 name: "myapex.key",
3009 public_key: "testkey.avbpubkey",
3010 private_key: "testkey.pem",
3011 }
3012
3013 cc_library {
3014 name: "mylib",
3015 srcs: ["mylib.cpp"],
3016 system_shared_libs: [],
3017 stl: "none",
3018 stubs: {
3019 versions: ["1", "2", "3"],
3020 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003021 apex_available: [
3022 "//apex_available:platform",
3023 "myapex",
3024 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003025 }
3026
3027 cc_binary {
3028 name: "not_in_apex",
3029 srcs: ["mylib.cpp"],
3030 static_libs: ["mylib"],
3031 static_executable: true,
3032 system_shared_libs: [],
3033 stl: "none",
3034 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003035 `)
3036
Colin Cross7113d202019-11-20 16:39:12 -08003037 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003038
3039 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003040 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003041}
Jiyong Park9335a262018-12-24 11:31:58 +09003042
3043func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003044 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003045 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003046 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003047 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003048 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003049 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003050 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003051 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003052 }
3053
3054 cc_library {
3055 name: "mylib",
3056 srcs: ["mylib.cpp"],
3057 system_shared_libs: [],
3058 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003059 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003060 }
3061
3062 apex_key {
3063 name: "myapex.key",
3064 public_key: "testkey.avbpubkey",
3065 private_key: "testkey.pem",
3066 }
3067
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003068 android_app_certificate {
3069 name: "myapex.certificate",
3070 certificate: "testkey",
3071 }
3072
3073 android_app_certificate {
3074 name: "myapex.certificate.override",
3075 certificate: "testkey.override",
3076 }
3077
Jiyong Park9335a262018-12-24 11:31:58 +09003078 `)
3079
3080 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003081 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003082
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003083 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3084 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003085 "vendor/foo/devkeys/testkey.avbpubkey")
3086 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003087 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3088 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003089 "vendor/foo/devkeys/testkey.pem")
3090 }
3091
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003092 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003093 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003094 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003095 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003096 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003097 }
3098}
Jiyong Park58e364a2019-01-19 19:24:06 +09003099
Jooyung Hanf121a652019-12-17 14:30:11 +09003100func TestCertificate(t *testing.T) {
3101 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003102 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003103 apex {
3104 name: "myapex",
3105 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003106 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003107 }
3108 apex_key {
3109 name: "myapex.key",
3110 public_key: "testkey.avbpubkey",
3111 private_key: "testkey.pem",
3112 }`)
3113 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3114 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3115 if actual := rule.Args["certificates"]; actual != expected {
3116 t.Errorf("certificates should be %q, not %q", expected, actual)
3117 }
3118 })
3119 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003120 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003121 apex {
3122 name: "myapex_keytest",
3123 key: "myapex.key",
3124 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003125 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003126 }
3127 apex_key {
3128 name: "myapex.key",
3129 public_key: "testkey.avbpubkey",
3130 private_key: "testkey.pem",
3131 }
3132 android_app_certificate {
3133 name: "myapex.certificate.override",
3134 certificate: "testkey.override",
3135 }`)
3136 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3137 expected := "testkey.override.x509.pem testkey.override.pk8"
3138 if actual := rule.Args["certificates"]; actual != expected {
3139 t.Errorf("certificates should be %q, not %q", expected, actual)
3140 }
3141 })
3142 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003143 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003144 apex {
3145 name: "myapex",
3146 key: "myapex.key",
3147 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003148 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003149 }
3150 apex_key {
3151 name: "myapex.key",
3152 public_key: "testkey.avbpubkey",
3153 private_key: "testkey.pem",
3154 }
3155 android_app_certificate {
3156 name: "myapex.certificate",
3157 certificate: "testkey",
3158 }`)
3159 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3160 expected := "testkey.x509.pem testkey.pk8"
3161 if actual := rule.Args["certificates"]; actual != expected {
3162 t.Errorf("certificates should be %q, not %q", expected, actual)
3163 }
3164 })
3165 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003166 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003167 apex {
3168 name: "myapex_keytest",
3169 key: "myapex.key",
3170 file_contexts: ":myapex-file_contexts",
3171 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003172 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003173 }
3174 apex_key {
3175 name: "myapex.key",
3176 public_key: "testkey.avbpubkey",
3177 private_key: "testkey.pem",
3178 }
3179 android_app_certificate {
3180 name: "myapex.certificate.override",
3181 certificate: "testkey.override",
3182 }`)
3183 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3184 expected := "testkey.override.x509.pem testkey.override.pk8"
3185 if actual := rule.Args["certificates"]; actual != expected {
3186 t.Errorf("certificates should be %q, not %q", expected, actual)
3187 }
3188 })
3189 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003190 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003191 apex {
3192 name: "myapex",
3193 key: "myapex.key",
3194 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003195 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003196 }
3197 apex_key {
3198 name: "myapex.key",
3199 public_key: "testkey.avbpubkey",
3200 private_key: "testkey.pem",
3201 }`)
3202 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3203 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3204 if actual := rule.Args["certificates"]; actual != expected {
3205 t.Errorf("certificates should be %q, not %q", expected, actual)
3206 }
3207 })
3208 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003209 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003210 apex {
3211 name: "myapex_keytest",
3212 key: "myapex.key",
3213 file_contexts: ":myapex-file_contexts",
3214 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003215 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003216 }
3217 apex_key {
3218 name: "myapex.key",
3219 public_key: "testkey.avbpubkey",
3220 private_key: "testkey.pem",
3221 }
3222 android_app_certificate {
3223 name: "myapex.certificate.override",
3224 certificate: "testkey.override",
3225 }`)
3226 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3227 expected := "testkey.override.x509.pem testkey.override.pk8"
3228 if actual := rule.Args["certificates"]; actual != expected {
3229 t.Errorf("certificates should be %q, not %q", expected, actual)
3230 }
3231 })
3232}
3233
Jiyong Park58e364a2019-01-19 19:24:06 +09003234func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003235 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003236 apex {
3237 name: "myapex",
3238 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003239 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003240 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003241 }
3242
3243 apex {
3244 name: "otherapex",
3245 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003246 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003247 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003248 }
3249
3250 apex_key {
3251 name: "myapex.key",
3252 public_key: "testkey.avbpubkey",
3253 private_key: "testkey.pem",
3254 }
3255
3256 cc_library {
3257 name: "mylib",
3258 srcs: ["mylib.cpp"],
3259 system_shared_libs: [],
3260 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003261 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003262 "myapex",
3263 "otherapex",
3264 ],
Jooyung Han24282772020-03-21 23:20:55 +09003265 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003266 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003267 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003268 cc_library {
3269 name: "mylib2",
3270 srcs: ["mylib.cpp"],
3271 system_shared_libs: [],
3272 stl: "none",
3273 apex_available: [
3274 "myapex",
3275 "otherapex",
3276 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003277 static_libs: ["mylib3"],
3278 recovery_available: true,
3279 min_sdk_version: "29",
3280 }
3281 cc_library {
3282 name: "mylib3",
3283 srcs: ["mylib.cpp"],
3284 system_shared_libs: [],
3285 stl: "none",
3286 apex_available: [
3287 "myapex",
3288 "otherapex",
3289 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003290 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003291 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003292 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003293 `)
3294
Jooyung Hanc87a0592020-03-02 17:44:33 +09003295 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003296 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003297 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003298 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003299
Jooyung Hanccce2f22020-03-07 03:45:53 +09003300 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003301 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003302 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003303 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003304
Jooyung Hanccce2f22020-03-07 03:45:53 +09003305 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003306 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003307 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003308 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003309
Colin Crossaede88c2020-08-11 12:17:01 -07003310 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3311 // each variant defines additional macros to distinguish which apex variant it is built for
3312
3313 // non-APEX variant does not have __ANDROID_APEX__ defined
3314 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3315 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3316
Dan Albertb19953d2020-11-17 15:29:36 -08003317 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003318 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3319 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003320 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003321
Jooyung Hanc87a0592020-03-02 17:44:33 +09003322 // non-APEX variant does not have __ANDROID_APEX__ defined
3323 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3324 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3325
Dan Albertb19953d2020-11-17 15:29:36 -08003326 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003327 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003328 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003329 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003330}
Jiyong Park7e636d02019-01-28 16:16:54 +09003331
3332func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003333 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003334 apex {
3335 name: "myapex",
3336 key: "myapex.key",
3337 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003338 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003339 }
3340
3341 apex_key {
3342 name: "myapex.key",
3343 public_key: "testkey.avbpubkey",
3344 private_key: "testkey.pem",
3345 }
3346
3347 cc_library_headers {
3348 name: "mylib_headers",
3349 export_include_dirs: ["my_include"],
3350 system_shared_libs: [],
3351 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003352 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003353 }
3354
3355 cc_library {
3356 name: "mylib",
3357 srcs: ["mylib.cpp"],
3358 system_shared_libs: [],
3359 stl: "none",
3360 header_libs: ["mylib_headers"],
3361 export_header_lib_headers: ["mylib_headers"],
3362 stubs: {
3363 versions: ["1", "2", "3"],
3364 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003365 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003366 }
3367
3368 cc_library {
3369 name: "otherlib",
3370 srcs: ["mylib.cpp"],
3371 system_shared_libs: [],
3372 stl: "none",
3373 shared_libs: ["mylib"],
3374 }
3375 `)
3376
Colin Cross7113d202019-11-20 16:39:12 -08003377 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003378
3379 // Ensure that the include path of the header lib is exported to 'otherlib'
3380 ensureContains(t, cFlags, "-Imy_include")
3381}
Alex Light9670d332019-01-29 18:07:33 -08003382
Jiyong Park7cd10e32020-01-14 09:22:18 +09003383type fileInApex struct {
3384 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003385 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003386 isLink bool
3387}
3388
Jooyung Hana57af4a2020-01-23 05:36:59 +00003389func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003390 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003391 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003392 copyCmds := apexRule.Args["copy_commands"]
3393 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003394 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003395 for _, cmd := range strings.Split(copyCmds, "&&") {
3396 cmd = strings.TrimSpace(cmd)
3397 if cmd == "" {
3398 continue
3399 }
3400 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003401 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003402 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003403 switch terms[0] {
3404 case "mkdir":
3405 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003406 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003407 t.Fatal("copyCmds contains invalid cp command", cmd)
3408 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003409 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003410 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003411 isLink = false
3412 case "ln":
3413 if len(terms) != 3 && len(terms) != 4 {
3414 // ln LINK TARGET or ln -s LINK TARGET
3415 t.Fatal("copyCmds contains invalid ln command", cmd)
3416 }
3417 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003418 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003419 isLink = true
3420 default:
3421 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3422 }
3423 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003424 index := strings.Index(dst, imageApexDir)
3425 if index == -1 {
3426 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3427 }
3428 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003429 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003430 }
3431 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003432 return ret
3433}
3434
Jooyung Hana57af4a2020-01-23 05:36:59 +00003435func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3436 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003437 var failed bool
3438 var surplus []string
3439 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003440 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003441 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003442 for _, expected := range files {
3443 if matched, _ := path.Match(expected, file.path); matched {
3444 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003445 mactchFound = true
3446 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003447 }
3448 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003449 if !mactchFound {
3450 surplus = append(surplus, file.path)
3451 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003452 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003453
Jooyung Han31c470b2019-10-18 16:26:59 +09003454 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003455 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003456 t.Log("surplus files", surplus)
3457 failed = true
3458 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003459
3460 if len(files) > len(filesMatched) {
3461 var missing []string
3462 for _, expected := range files {
3463 if !filesMatched[expected] {
3464 missing = append(missing, expected)
3465 }
3466 }
3467 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003468 t.Log("missing files", missing)
3469 failed = true
3470 }
3471 if failed {
3472 t.Fail()
3473 }
3474}
3475
Jooyung Han344d5432019-08-23 11:17:39 +09003476func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003477 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003478 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003479 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003480 "etc/llndk.libraries.29.txt",
3481 "etc/vndkcore.libraries.29.txt",
3482 "etc/vndksp.libraries.29.txt",
3483 "etc/vndkprivate.libraries.29.txt",
3484 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003485 }
3486 testCases := []struct {
3487 vndkVersion string
3488 expectedFiles []string
3489 }{
3490 {
3491 vndkVersion: "current",
3492 expectedFiles: append(commonFiles,
3493 "lib/libvndk.so",
3494 "lib/libvndksp.so",
3495 "lib64/libvndk.so",
3496 "lib64/libvndksp.so"),
3497 },
3498 {
3499 vndkVersion: "",
3500 expectedFiles: append(commonFiles,
3501 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3502 "lib/libvndksp.so",
3503 "lib64/libvndksp.so"),
3504 },
3505 }
3506 for _, tc := range testCases {
3507 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3508 ctx := testApex(t, `
3509 apex_vndk {
3510 name: "com.android.vndk.current",
3511 key: "com.android.vndk.current.key",
3512 updatable: false,
3513 }
3514
3515 apex_key {
3516 name: "com.android.vndk.current.key",
3517 public_key: "testkey.avbpubkey",
3518 private_key: "testkey.pem",
3519 }
3520
3521 cc_library {
3522 name: "libvndk",
3523 srcs: ["mylib.cpp"],
3524 vendor_available: true,
3525 product_available: true,
3526 vndk: {
3527 enabled: true,
3528 },
3529 system_shared_libs: [],
3530 stl: "none",
3531 apex_available: [ "com.android.vndk.current" ],
3532 }
3533
3534 cc_library {
3535 name: "libvndksp",
3536 srcs: ["mylib.cpp"],
3537 vendor_available: true,
3538 product_available: true,
3539 vndk: {
3540 enabled: true,
3541 support_system_process: true,
3542 },
3543 system_shared_libs: [],
3544 stl: "none",
3545 apex_available: [ "com.android.vndk.current" ],
3546 }
3547
3548 // VNDK-Ext should not cause any problems
3549
3550 cc_library {
3551 name: "libvndk.ext",
3552 srcs: ["mylib2.cpp"],
3553 vendor: true,
3554 vndk: {
3555 enabled: true,
3556 extends: "libvndk",
3557 },
3558 system_shared_libs: [],
3559 stl: "none",
3560 }
3561
3562 cc_library {
3563 name: "libvndksp.ext",
3564 srcs: ["mylib2.cpp"],
3565 vendor: true,
3566 vndk: {
3567 enabled: true,
3568 support_system_process: true,
3569 extends: "libvndksp",
3570 },
3571 system_shared_libs: [],
3572 stl: "none",
3573 }
3574 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3575 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3576 }))
3577 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3578 })
3579 }
Jooyung Han344d5432019-08-23 11:17:39 +09003580}
3581
3582func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003583 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003584 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003585 name: "com.android.vndk.current",
3586 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003587 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003588 }
3589
3590 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003591 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003592 public_key: "testkey.avbpubkey",
3593 private_key: "testkey.pem",
3594 }
3595
3596 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003597 name: "libvndk",
3598 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003599 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003600 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003601 vndk: {
3602 enabled: true,
3603 },
3604 system_shared_libs: [],
3605 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003606 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003607 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003608
3609 cc_prebuilt_library_shared {
3610 name: "libvndk.arm",
3611 srcs: ["libvndk.arm.so"],
3612 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003613 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003614 vndk: {
3615 enabled: true,
3616 },
3617 enabled: false,
3618 arch: {
3619 arm: {
3620 enabled: true,
3621 },
3622 },
3623 system_shared_libs: [],
3624 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003625 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003626 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003627 `+vndkLibrariesTxtFiles("current"),
3628 withFiles(map[string][]byte{
3629 "libvndk.so": nil,
3630 "libvndk.arm.so": nil,
3631 }))
Colin Cross2807f002021-03-02 10:15:29 -08003632 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003633 "lib/libvndk.so",
3634 "lib/libvndk.arm.so",
3635 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003636 "lib/libc++.so",
3637 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003638 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003639 })
Jooyung Han344d5432019-08-23 11:17:39 +09003640}
3641
Jooyung Han39edb6c2019-11-06 16:53:07 +09003642func vndkLibrariesTxtFiles(vers ...string) (result string) {
3643 for _, v := range vers {
3644 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003645 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003646 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003647 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003648 name: "` + txt + `.libraries.txt",
3649 }
3650 `
3651 }
3652 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003653 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003654 result += `
3655 prebuilt_etc {
3656 name: "` + txt + `.libraries.` + v + `.txt",
3657 src: "dummy.txt",
3658 }
3659 `
3660 }
3661 }
3662 }
3663 return
3664}
3665
Jooyung Han344d5432019-08-23 11:17:39 +09003666func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003667 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003668 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003669 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003670 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003671 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003672 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003673 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003674 }
3675
3676 apex_key {
3677 name: "myapex.key",
3678 public_key: "testkey.avbpubkey",
3679 private_key: "testkey.pem",
3680 }
3681
Jooyung Han31c470b2019-10-18 16:26:59 +09003682 vndk_prebuilt_shared {
3683 name: "libvndk27",
3684 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003685 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003686 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003687 vndk: {
3688 enabled: true,
3689 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003690 target_arch: "arm64",
3691 arch: {
3692 arm: {
3693 srcs: ["libvndk27_arm.so"],
3694 },
3695 arm64: {
3696 srcs: ["libvndk27_arm64.so"],
3697 },
3698 },
Colin Cross2807f002021-03-02 10:15:29 -08003699 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003700 }
3701
3702 vndk_prebuilt_shared {
3703 name: "libvndk27",
3704 version: "27",
3705 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003706 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003707 vndk: {
3708 enabled: true,
3709 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003710 target_arch: "x86_64",
3711 arch: {
3712 x86: {
3713 srcs: ["libvndk27_x86.so"],
3714 },
3715 x86_64: {
3716 srcs: ["libvndk27_x86_64.so"],
3717 },
3718 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003719 }
3720 `+vndkLibrariesTxtFiles("27"),
3721 withFiles(map[string][]byte{
3722 "libvndk27_arm.so": nil,
3723 "libvndk27_arm64.so": nil,
3724 "libvndk27_x86.so": nil,
3725 "libvndk27_x86_64.so": nil,
3726 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003727
Colin Cross2807f002021-03-02 10:15:29 -08003728 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003729 "lib/libvndk27_arm.so",
3730 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003731 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003732 })
Jooyung Han344d5432019-08-23 11:17:39 +09003733}
3734
Jooyung Han90eee022019-10-01 20:02:42 +09003735func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003736 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003737 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003738 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003739 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003740 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003741 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003742 }
3743 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003744 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003745 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003746 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003747 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003748 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003749 }
3750 apex_key {
3751 name: "myapex.key",
3752 public_key: "testkey.avbpubkey",
3753 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003754 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003755
3756 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003757 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003758 actual := proptools.String(bundle.properties.Apex_name)
3759 if !reflect.DeepEqual(actual, expected) {
3760 t.Errorf("Got '%v', expected '%v'", actual, expected)
3761 }
3762 }
3763
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003764 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003765 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003766}
3767
Jooyung Han344d5432019-08-23 11:17:39 +09003768func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003769 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003770 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003771 name: "com.android.vndk.current",
3772 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003773 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003774 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003775 }
3776
3777 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003778 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003779 public_key: "testkey.avbpubkey",
3780 private_key: "testkey.pem",
3781 }
3782
3783 cc_library {
3784 name: "libvndk",
3785 srcs: ["mylib.cpp"],
3786 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003787 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003788 native_bridge_supported: true,
3789 host_supported: true,
3790 vndk: {
3791 enabled: true,
3792 },
3793 system_shared_libs: [],
3794 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003795 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003796 }
Colin Cross2807f002021-03-02 10:15:29 -08003797 `+vndkLibrariesTxtFiles("current"),
3798 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003799
Colin Cross2807f002021-03-02 10:15:29 -08003800 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003801 "lib/libvndk.so",
3802 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003803 "lib/libc++.so",
3804 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003805 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003806 })
Jooyung Han344d5432019-08-23 11:17:39 +09003807}
3808
3809func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003810 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003811 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003812 name: "com.android.vndk.current",
3813 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003814 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003815 native_bridge_supported: true,
3816 }
3817
3818 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003819 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003820 public_key: "testkey.avbpubkey",
3821 private_key: "testkey.pem",
3822 }
3823
3824 cc_library {
3825 name: "libvndk",
3826 srcs: ["mylib.cpp"],
3827 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003828 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003829 native_bridge_supported: true,
3830 host_supported: true,
3831 vndk: {
3832 enabled: true,
3833 },
3834 system_shared_libs: [],
3835 stl: "none",
3836 }
3837 `)
3838}
3839
Jooyung Han31c470b2019-10-18 16:26:59 +09003840func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003841 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003842 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003843 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003844 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003845 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003846 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003847 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003848 }
3849
3850 apex_key {
3851 name: "myapex.key",
3852 public_key: "testkey.avbpubkey",
3853 private_key: "testkey.pem",
3854 }
3855
3856 vndk_prebuilt_shared {
3857 name: "libvndk27",
3858 version: "27",
3859 target_arch: "arm",
3860 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003861 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003862 vndk: {
3863 enabled: true,
3864 },
3865 arch: {
3866 arm: {
3867 srcs: ["libvndk27.so"],
3868 }
3869 },
3870 }
3871
3872 vndk_prebuilt_shared {
3873 name: "libvndk27",
3874 version: "27",
3875 target_arch: "arm",
3876 binder32bit: true,
3877 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003878 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003879 vndk: {
3880 enabled: true,
3881 },
3882 arch: {
3883 arm: {
3884 srcs: ["libvndk27binder32.so"],
3885 }
3886 },
Colin Cross2807f002021-03-02 10:15:29 -08003887 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003888 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003889 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003890 withFiles(map[string][]byte{
3891 "libvndk27.so": nil,
3892 "libvndk27binder32.so": nil,
3893 }),
3894 withBinder32bit,
3895 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003896 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003897 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3898 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003899 },
3900 }),
3901 )
3902
Colin Cross2807f002021-03-02 10:15:29 -08003903 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003904 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003905 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003906 })
3907}
3908
Jooyung Han45a96772020-06-15 14:59:42 +09003909func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003910 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003911 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003912 name: "com.android.vndk.current",
3913 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003914 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003915 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003916 }
3917
3918 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003919 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003920 public_key: "testkey.avbpubkey",
3921 private_key: "testkey.pem",
3922 }
3923
3924 cc_library {
3925 name: "libz",
3926 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003927 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003928 vndk: {
3929 enabled: true,
3930 },
3931 stubs: {
3932 symbol_file: "libz.map.txt",
3933 versions: ["30"],
3934 }
3935 }
3936 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3937 "libz.map.txt": nil,
3938 }))
3939
Colin Cross2807f002021-03-02 10:15:29 -08003940 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003941 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3942 ensureListEmpty(t, provideNativeLibs)
3943}
3944
Jooyung Hane1633032019-08-01 17:41:43 +09003945func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003946 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003947 apex {
3948 name: "myapex_nodep",
3949 key: "myapex.key",
3950 native_shared_libs: ["lib_nodep"],
3951 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003952 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003953 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003954 }
3955
3956 apex {
3957 name: "myapex_dep",
3958 key: "myapex.key",
3959 native_shared_libs: ["lib_dep"],
3960 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003961 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003962 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003963 }
3964
3965 apex {
3966 name: "myapex_provider",
3967 key: "myapex.key",
3968 native_shared_libs: ["libfoo"],
3969 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003970 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003971 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003972 }
3973
3974 apex {
3975 name: "myapex_selfcontained",
3976 key: "myapex.key",
3977 native_shared_libs: ["lib_dep", "libfoo"],
3978 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003979 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003980 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003981 }
3982
3983 apex_key {
3984 name: "myapex.key",
3985 public_key: "testkey.avbpubkey",
3986 private_key: "testkey.pem",
3987 }
3988
3989 cc_library {
3990 name: "lib_nodep",
3991 srcs: ["mylib.cpp"],
3992 system_shared_libs: [],
3993 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003994 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003995 }
3996
3997 cc_library {
3998 name: "lib_dep",
3999 srcs: ["mylib.cpp"],
4000 shared_libs: ["libfoo"],
4001 system_shared_libs: [],
4002 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004003 apex_available: [
4004 "myapex_dep",
4005 "myapex_provider",
4006 "myapex_selfcontained",
4007 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004008 }
4009
4010 cc_library {
4011 name: "libfoo",
4012 srcs: ["mytest.cpp"],
4013 stubs: {
4014 versions: ["1"],
4015 },
4016 system_shared_libs: [],
4017 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004018 apex_available: [
4019 "myapex_provider",
4020 "myapex_selfcontained",
4021 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004022 }
4023 `)
4024
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004025 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004026 var provideNativeLibs, requireNativeLibs []string
4027
Sundong Ahnabb64432019-10-22 13:58:29 +09004028 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004029 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4030 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004031 ensureListEmpty(t, provideNativeLibs)
4032 ensureListEmpty(t, requireNativeLibs)
4033
Sundong Ahnabb64432019-10-22 13:58:29 +09004034 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004035 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4036 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004037 ensureListEmpty(t, provideNativeLibs)
4038 ensureListContains(t, requireNativeLibs, "libfoo.so")
4039
Sundong Ahnabb64432019-10-22 13:58:29 +09004040 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004041 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4042 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004043 ensureListContains(t, provideNativeLibs, "libfoo.so")
4044 ensureListEmpty(t, requireNativeLibs)
4045
Sundong Ahnabb64432019-10-22 13:58:29 +09004046 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004047 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4048 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004049 ensureListContains(t, provideNativeLibs, "libfoo.so")
4050 ensureListEmpty(t, requireNativeLibs)
4051}
4052
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004053func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004054 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004055 apex {
4056 name: "myapex",
4057 key: "myapex.key",
4058 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004059 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004060 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004061 }
4062
4063 apex_key {
4064 name: "myapex.key",
4065 public_key: "testkey.avbpubkey",
4066 private_key: "testkey.pem",
4067 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004068
4069 cc_library {
4070 name: "mylib",
4071 srcs: ["mylib.cpp"],
4072 system_shared_libs: [],
4073 stl: "none",
4074 apex_available: [
4075 "//apex_available:platform",
4076 "myapex",
4077 ],
4078 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004079 `)
4080
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004081 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004082 apexManifestRule := module.Rule("apexManifestRule")
4083 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4084 apexRule := module.Rule("apexRule")
4085 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004086
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004087 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004088 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004089 name := apexBundle.BaseModuleName()
4090 prefix := "TARGET_"
4091 var builder strings.Builder
4092 data.Custom(&builder, name, prefix, "", data)
4093 androidMk := builder.String()
4094 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4095 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004096}
4097
Alex Light0851b882019-02-07 13:20:53 -08004098func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004099 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004100 apex {
4101 name: "myapex",
4102 key: "myapex.key",
4103 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004104 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004105 }
4106
4107 apex_key {
4108 name: "myapex.key",
4109 public_key: "testkey.avbpubkey",
4110 private_key: "testkey.pem",
4111 }
4112
4113 cc_library {
4114 name: "mylib_common",
4115 srcs: ["mylib.cpp"],
4116 system_shared_libs: [],
4117 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004118 apex_available: [
4119 "//apex_available:platform",
4120 "myapex",
4121 ],
Alex Light0851b882019-02-07 13:20:53 -08004122 }
4123 `)
4124
Sundong Ahnabb64432019-10-22 13:58:29 +09004125 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004126 apexRule := module.Rule("apexRule")
4127 copyCmds := apexRule.Args["copy_commands"]
4128
4129 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4130 t.Log("Apex was a test apex!")
4131 t.Fail()
4132 }
4133 // Ensure that main rule creates an output
4134 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4135
4136 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004137 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004138
4139 // Ensure that both direct and indirect deps are copied into apex
4140 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4141
Colin Cross7113d202019-11-20 16:39:12 -08004142 // Ensure that the platform variant ends with _shared
4143 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004144
Colin Cross56a83212020-09-15 18:30:11 -07004145 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004146 t.Log("Found mylib_common not in any apex!")
4147 t.Fail()
4148 }
4149}
4150
4151func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004152 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004153 apex_test {
4154 name: "myapex",
4155 key: "myapex.key",
4156 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004157 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004158 }
4159
4160 apex_key {
4161 name: "myapex.key",
4162 public_key: "testkey.avbpubkey",
4163 private_key: "testkey.pem",
4164 }
4165
4166 cc_library {
4167 name: "mylib_common_test",
4168 srcs: ["mylib.cpp"],
4169 system_shared_libs: [],
4170 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004171 // TODO: remove //apex_available:platform
4172 apex_available: [
4173 "//apex_available:platform",
4174 "myapex",
4175 ],
Alex Light0851b882019-02-07 13:20:53 -08004176 }
4177 `)
4178
Sundong Ahnabb64432019-10-22 13:58:29 +09004179 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004180 apexRule := module.Rule("apexRule")
4181 copyCmds := apexRule.Args["copy_commands"]
4182
4183 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4184 t.Log("Apex was not a test apex!")
4185 t.Fail()
4186 }
4187 // Ensure that main rule creates an output
4188 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4189
4190 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004191 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004192
4193 // Ensure that both direct and indirect deps are copied into apex
4194 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4195
Colin Cross7113d202019-11-20 16:39:12 -08004196 // Ensure that the platform variant ends with _shared
4197 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004198}
4199
Alex Light9670d332019-01-29 18:07:33 -08004200func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004201 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004202 apex {
4203 name: "myapex",
4204 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004205 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004206 multilib: {
4207 first: {
4208 native_shared_libs: ["mylib_common"],
4209 }
4210 },
4211 target: {
4212 android: {
4213 multilib: {
4214 first: {
4215 native_shared_libs: ["mylib"],
4216 }
4217 }
4218 },
4219 host: {
4220 multilib: {
4221 first: {
4222 native_shared_libs: ["mylib2"],
4223 }
4224 }
4225 }
4226 }
4227 }
4228
4229 apex_key {
4230 name: "myapex.key",
4231 public_key: "testkey.avbpubkey",
4232 private_key: "testkey.pem",
4233 }
4234
4235 cc_library {
4236 name: "mylib",
4237 srcs: ["mylib.cpp"],
4238 system_shared_libs: [],
4239 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004240 // TODO: remove //apex_available:platform
4241 apex_available: [
4242 "//apex_available:platform",
4243 "myapex",
4244 ],
Alex Light9670d332019-01-29 18:07:33 -08004245 }
4246
4247 cc_library {
4248 name: "mylib_common",
4249 srcs: ["mylib.cpp"],
4250 system_shared_libs: [],
4251 stl: "none",
4252 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004253 // TODO: remove //apex_available:platform
4254 apex_available: [
4255 "//apex_available:platform",
4256 "myapex",
4257 ],
Alex Light9670d332019-01-29 18:07:33 -08004258 }
4259
4260 cc_library {
4261 name: "mylib2",
4262 srcs: ["mylib.cpp"],
4263 system_shared_libs: [],
4264 stl: "none",
4265 compile_multilib: "first",
4266 }
4267 `)
4268
Sundong Ahnabb64432019-10-22 13:58:29 +09004269 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004270 copyCmds := apexRule.Args["copy_commands"]
4271
4272 // Ensure that main rule creates an output
4273 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4274
4275 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004276 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4277 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4278 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004279
4280 // Ensure that both direct and indirect deps are copied into apex
4281 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4282 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4283 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4284
Colin Cross7113d202019-11-20 16:39:12 -08004285 // Ensure that the platform variant ends with _shared
4286 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4287 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4288 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004289}
Jiyong Park04480cf2019-02-06 00:16:29 +09004290
Jiyong Park59140302020-12-14 18:44:04 +09004291func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004292 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004293 apex {
4294 name: "myapex",
4295 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004296 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004297 arch: {
4298 arm64: {
4299 native_shared_libs: ["mylib.arm64"],
4300 },
4301 x86_64: {
4302 native_shared_libs: ["mylib.x64"],
4303 },
4304 }
4305 }
4306
4307 apex_key {
4308 name: "myapex.key",
4309 public_key: "testkey.avbpubkey",
4310 private_key: "testkey.pem",
4311 }
4312
4313 cc_library {
4314 name: "mylib.arm64",
4315 srcs: ["mylib.cpp"],
4316 system_shared_libs: [],
4317 stl: "none",
4318 // TODO: remove //apex_available:platform
4319 apex_available: [
4320 "//apex_available:platform",
4321 "myapex",
4322 ],
4323 }
4324
4325 cc_library {
4326 name: "mylib.x64",
4327 srcs: ["mylib.cpp"],
4328 system_shared_libs: [],
4329 stl: "none",
4330 // TODO: remove //apex_available:platform
4331 apex_available: [
4332 "//apex_available:platform",
4333 "myapex",
4334 ],
4335 }
4336 `)
4337
4338 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4339 copyCmds := apexRule.Args["copy_commands"]
4340
4341 // Ensure that apex variant is created for the direct dep
4342 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4343 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4344
4345 // Ensure that both direct and indirect deps are copied into apex
4346 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4347 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4348}
4349
Jiyong Park04480cf2019-02-06 00:16:29 +09004350func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004351 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004352 apex {
4353 name: "myapex",
4354 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004355 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004356 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004357 }
4358
4359 apex_key {
4360 name: "myapex.key",
4361 public_key: "testkey.avbpubkey",
4362 private_key: "testkey.pem",
4363 }
4364
4365 sh_binary {
4366 name: "myscript",
4367 src: "mylib.cpp",
4368 filename: "myscript.sh",
4369 sub_dir: "script",
4370 }
4371 `)
4372
Sundong Ahnabb64432019-10-22 13:58:29 +09004373 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004374 copyCmds := apexRule.Args["copy_commands"]
4375
4376 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4377}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004378
Jooyung Han91df2082019-11-20 01:49:42 +09004379func TestApexInVariousPartition(t *testing.T) {
4380 testcases := []struct {
4381 propName, parition, flattenedPartition string
4382 }{
4383 {"", "system", "system_ext"},
4384 {"product_specific: true", "product", "product"},
4385 {"soc_specific: true", "vendor", "vendor"},
4386 {"proprietary: true", "vendor", "vendor"},
4387 {"vendor: true", "vendor", "vendor"},
4388 {"system_ext_specific: true", "system_ext", "system_ext"},
4389 }
4390 for _, tc := range testcases {
4391 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004392 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004393 apex {
4394 name: "myapex",
4395 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004396 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004397 `+tc.propName+`
4398 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004399
Jooyung Han91df2082019-11-20 01:49:42 +09004400 apex_key {
4401 name: "myapex.key",
4402 public_key: "testkey.avbpubkey",
4403 private_key: "testkey.pem",
4404 }
4405 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004406
Jooyung Han91df2082019-11-20 01:49:42 +09004407 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004408 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4409 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004410 if actual != expected {
4411 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4412 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004413
Jooyung Han91df2082019-11-20 01:49:42 +09004414 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004415 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4416 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004417 if actual != expected {
4418 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4419 }
4420 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004421 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004422}
Jiyong Park67882562019-03-21 01:11:21 +09004423
Jooyung Han580eb4f2020-06-24 19:33:06 +09004424func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004425 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004426 apex {
4427 name: "myapex",
4428 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004429 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004430 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004431
Jooyung Han580eb4f2020-06-24 19:33:06 +09004432 apex_key {
4433 name: "myapex.key",
4434 public_key: "testkey.avbpubkey",
4435 private_key: "testkey.pem",
4436 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004437 `)
4438 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004439 rule := module.Output("file_contexts")
4440 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4441}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004442
Jooyung Han580eb4f2020-06-24 19:33:06 +09004443func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004444 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004445 apex {
4446 name: "myapex",
4447 key: "myapex.key",
4448 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004449 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004450 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004451
Jooyung Han580eb4f2020-06-24 19:33:06 +09004452 apex_key {
4453 name: "myapex.key",
4454 public_key: "testkey.avbpubkey",
4455 private_key: "testkey.pem",
4456 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004457 `, withFiles(map[string][]byte{
4458 "my_own_file_contexts": nil,
4459 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004460}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004461
Jooyung Han580eb4f2020-06-24 19:33:06 +09004462func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004463 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004464 apex {
4465 name: "myapex",
4466 key: "myapex.key",
4467 product_specific: true,
4468 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004469 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004470 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004471
Jooyung Han580eb4f2020-06-24 19:33:06 +09004472 apex_key {
4473 name: "myapex.key",
4474 public_key: "testkey.avbpubkey",
4475 private_key: "testkey.pem",
4476 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004477 `)
4478
Colin Cross1c460562021-02-16 17:55:47 -08004479 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004480 apex {
4481 name: "myapex",
4482 key: "myapex.key",
4483 product_specific: true,
4484 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004485 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004486 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004487
Jooyung Han580eb4f2020-06-24 19:33:06 +09004488 apex_key {
4489 name: "myapex.key",
4490 public_key: "testkey.avbpubkey",
4491 private_key: "testkey.pem",
4492 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004493 `, withFiles(map[string][]byte{
4494 "product_specific_file_contexts": nil,
4495 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004496 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4497 rule := module.Output("file_contexts")
4498 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4499}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004500
Jooyung Han580eb4f2020-06-24 19:33:06 +09004501func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004502 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004503 apex {
4504 name: "myapex",
4505 key: "myapex.key",
4506 product_specific: true,
4507 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004508 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004509 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004510
Jooyung Han580eb4f2020-06-24 19:33:06 +09004511 apex_key {
4512 name: "myapex.key",
4513 public_key: "testkey.avbpubkey",
4514 private_key: "testkey.pem",
4515 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004516
Jooyung Han580eb4f2020-06-24 19:33:06 +09004517 filegroup {
4518 name: "my-file-contexts",
4519 srcs: ["product_specific_file_contexts"],
4520 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004521 `, withFiles(map[string][]byte{
4522 "product_specific_file_contexts": nil,
4523 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004524 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4525 rule := module.Output("file_contexts")
4526 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004527}
4528
Jiyong Park67882562019-03-21 01:11:21 +09004529func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004530 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004531 apex_key {
4532 name: "myapex.key",
4533 public_key: ":my.avbpubkey",
4534 private_key: ":my.pem",
4535 product_specific: true,
4536 }
4537
4538 filegroup {
4539 name: "my.avbpubkey",
4540 srcs: ["testkey2.avbpubkey"],
4541 }
4542
4543 filegroup {
4544 name: "my.pem",
4545 srcs: ["testkey2.pem"],
4546 }
4547 `)
4548
4549 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4550 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004551 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004552 if actual_pubkey != expected_pubkey {
4553 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4554 }
4555 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004556 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004557 if actual_privkey != expected_privkey {
4558 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4559 }
4560}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004561
4562func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004563 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004564 prebuilt_apex {
4565 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004566 arch: {
4567 arm64: {
4568 src: "myapex-arm64.apex",
4569 },
4570 arm: {
4571 src: "myapex-arm.apex",
4572 },
4573 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004574 }
4575 `)
4576
Wei Li340ee8e2022-03-18 17:33:24 -07004577 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4578 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004579
Jiyong Parkc95714e2019-03-29 14:23:10 +09004580 expectedInput := "myapex-arm64.apex"
4581 if prebuilt.inputApex.String() != expectedInput {
4582 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4583 }
Wei Li340ee8e2022-03-18 17:33:24 -07004584 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4585 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4586 rule := testingModule.Rule("genProvenanceMetaData")
4587 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4588 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4589 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4590 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004591}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004592
Paul Duffinc0609c62021-03-01 17:27:16 +00004593func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004594 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004595 prebuilt_apex {
4596 name: "myapex",
4597 }
4598 `)
4599}
4600
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004601func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004602 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004603 prebuilt_apex {
4604 name: "myapex",
4605 src: "myapex-arm.apex",
4606 filename: "notmyapex.apex",
4607 }
4608 `)
4609
Wei Li340ee8e2022-03-18 17:33:24 -07004610 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4611 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004612
4613 expected := "notmyapex.apex"
4614 if p.installFilename != expected {
4615 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4616 }
Wei Li340ee8e2022-03-18 17:33:24 -07004617 rule := testingModule.Rule("genProvenanceMetaData")
4618 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4619 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4620 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4621 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004622}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004623
Samiul Islam7c02e262021-09-08 17:48:28 +01004624func TestApexSetFilenameOverride(t *testing.T) {
4625 testApex(t, `
4626 apex_set {
4627 name: "com.company.android.myapex",
4628 apex_name: "com.android.myapex",
4629 set: "company-myapex.apks",
4630 filename: "com.company.android.myapex.apex"
4631 }
4632 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4633
4634 testApex(t, `
4635 apex_set {
4636 name: "com.company.android.myapex",
4637 apex_name: "com.android.myapex",
4638 set: "company-myapex.apks",
4639 filename: "com.company.android.myapex.capex"
4640 }
4641 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4642
4643 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4644 apex_set {
4645 name: "com.company.android.myapex",
4646 apex_name: "com.android.myapex",
4647 set: "company-myapex.apks",
4648 filename: "some-random-suffix"
4649 }
4650 `)
4651}
4652
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004653func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004654 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004655 prebuilt_apex {
4656 name: "myapex.prebuilt",
4657 src: "myapex-arm.apex",
4658 overrides: [
4659 "myapex",
4660 ],
4661 }
4662 `)
4663
Wei Li340ee8e2022-03-18 17:33:24 -07004664 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4665 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004666
4667 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004668 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004669 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004670 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004671 }
Wei Li340ee8e2022-03-18 17:33:24 -07004672 rule := testingModule.Rule("genProvenanceMetaData")
4673 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4674 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4675 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4676 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004677}
4678
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004679func TestPrebuiltApexName(t *testing.T) {
4680 testApex(t, `
4681 prebuilt_apex {
4682 name: "com.company.android.myapex",
4683 apex_name: "com.android.myapex",
4684 src: "company-myapex-arm.apex",
4685 }
4686 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4687
4688 testApex(t, `
4689 apex_set {
4690 name: "com.company.android.myapex",
4691 apex_name: "com.android.myapex",
4692 set: "company-myapex.apks",
4693 }
4694 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4695}
4696
4697func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4698 _ = android.GroupFixturePreparers(
4699 java.PrepareForTestWithJavaDefaultModules,
4700 PrepareForTestWithApexBuildComponents,
4701 android.FixtureWithRootAndroidBp(`
4702 platform_bootclasspath {
4703 name: "platform-bootclasspath",
4704 fragments: [
4705 {
4706 apex: "com.android.art",
4707 module: "art-bootclasspath-fragment",
4708 },
4709 ],
4710 }
4711
4712 prebuilt_apex {
4713 name: "com.company.android.art",
4714 apex_name: "com.android.art",
4715 src: "com.company.android.art-arm.apex",
4716 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4717 }
4718
4719 prebuilt_bootclasspath_fragment {
4720 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004721 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004722 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004723 hidden_api: {
4724 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4725 metadata: "my-bootclasspath-fragment/metadata.csv",
4726 index: "my-bootclasspath-fragment/index.csv",
4727 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4728 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4729 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004730 }
4731
4732 java_import {
4733 name: "core-oj",
4734 jars: ["prebuilt.jar"],
4735 }
4736 `),
4737 ).RunTest(t)
4738}
4739
Paul Duffin092153d2021-01-26 11:42:39 +00004740// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4741// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004742func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004743 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004744
Paul Duffin89886cb2021-02-05 16:44:03 +00004745 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004746 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004747 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004748 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004749 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004750 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004751 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4752 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4753 android.NormalizePathForTesting(dexJarBuildPath))
4754 }
4755
4756 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004757 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004758 // Make sure the import has been given the correct path to the dex jar.
4759 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4760 dexJarBuildPath := p.DexJarInstallPath()
4761 stem := android.RemoveOptionalPrebuiltPrefix(name)
4762 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4763 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4764 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004765 }
4766
Paul Duffin39853512021-02-26 11:09:39 +00004767 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004768 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004769 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004770 android.AssertArrayString(t, "Check if there is no source variant",
4771 []string{"android_common"},
4772 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004773 }
4774
4775 t.Run("prebuilt only", func(t *testing.T) {
4776 bp := `
4777 prebuilt_apex {
4778 name: "myapex",
4779 arch: {
4780 arm64: {
4781 src: "myapex-arm64.apex",
4782 },
4783 arm: {
4784 src: "myapex-arm.apex",
4785 },
4786 },
Paul Duffin39853512021-02-26 11:09:39 +00004787 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004788 }
4789
4790 java_import {
4791 name: "libfoo",
4792 jars: ["libfoo.jar"],
4793 }
Paul Duffin39853512021-02-26 11:09:39 +00004794
4795 java_sdk_library_import {
4796 name: "libbar",
4797 public: {
4798 jars: ["libbar.jar"],
4799 },
4800 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004801 `
4802
4803 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4804 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4805
Martin Stjernholm44825602021-09-17 01:44:12 +01004806 deapexerName := deapexerModuleName("myapex")
4807 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4808
Paul Duffinf6932af2021-02-26 18:21:56 +00004809 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004810 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004811 rule := deapexer.Rule("deapexer")
4812 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4813 t.Errorf("expected: %q, found: %q", expected, actual)
4814 }
4815
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004816 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004817 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004818 rule = prebuiltApex.Rule("android/soong/android.Cp")
4819 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4820 t.Errorf("expected: %q, found: %q", expected, actual)
4821 }
4822
Paul Duffin89886cb2021-02-05 16:44:03 +00004823 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004824 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004825
4826 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004827 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004828 })
4829
4830 t.Run("prebuilt with source preferred", func(t *testing.T) {
4831
4832 bp := `
4833 prebuilt_apex {
4834 name: "myapex",
4835 arch: {
4836 arm64: {
4837 src: "myapex-arm64.apex",
4838 },
4839 arm: {
4840 src: "myapex-arm.apex",
4841 },
4842 },
Paul Duffin39853512021-02-26 11:09:39 +00004843 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004844 }
4845
4846 java_import {
4847 name: "libfoo",
4848 jars: ["libfoo.jar"],
4849 }
4850
4851 java_library {
4852 name: "libfoo",
4853 }
Paul Duffin39853512021-02-26 11:09:39 +00004854
4855 java_sdk_library_import {
4856 name: "libbar",
4857 public: {
4858 jars: ["libbar.jar"],
4859 },
4860 }
4861
4862 java_sdk_library {
4863 name: "libbar",
4864 srcs: ["foo/bar/MyClass.java"],
4865 unsafe_ignore_missing_latest_api: true,
4866 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004867 `
4868
4869 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4870 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4871
Paul Duffin89886cb2021-02-05 16:44:03 +00004872 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004873 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004874 ensureNoSourceVariant(t, ctx, "libfoo")
4875
4876 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004877 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004878 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004879 })
4880
4881 t.Run("prebuilt preferred with source", func(t *testing.T) {
4882 bp := `
4883 prebuilt_apex {
4884 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004885 arch: {
4886 arm64: {
4887 src: "myapex-arm64.apex",
4888 },
4889 arm: {
4890 src: "myapex-arm.apex",
4891 },
4892 },
Paul Duffin39853512021-02-26 11:09:39 +00004893 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004894 }
4895
4896 java_import {
4897 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004898 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004899 jars: ["libfoo.jar"],
4900 }
4901
4902 java_library {
4903 name: "libfoo",
4904 }
Paul Duffin39853512021-02-26 11:09:39 +00004905
4906 java_sdk_library_import {
4907 name: "libbar",
4908 prefer: true,
4909 public: {
4910 jars: ["libbar.jar"],
4911 },
4912 }
4913
4914 java_sdk_library {
4915 name: "libbar",
4916 srcs: ["foo/bar/MyClass.java"],
4917 unsafe_ignore_missing_latest_api: true,
4918 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004919 `
4920
4921 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4922 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4923
Paul Duffin89886cb2021-02-05 16:44:03 +00004924 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004925 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004926 ensureNoSourceVariant(t, ctx, "libfoo")
4927
4928 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004929 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004930 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004931 })
4932}
4933
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004934func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004935 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004936 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004937 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4938 // is disabled.
4939 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4940 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004941
Paul Duffin37856732021-02-26 14:24:15 +00004942 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4943 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004944 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004945 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004946 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004947 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004948 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004949 foundLibfooJar = true
4950 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004951 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004952 }
4953 }
4954 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004955 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 +00004956 }
4957 }
4958
Paul Duffin40a3f652021-07-19 13:11:24 +01004959 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004960 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004961 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004962 var rule android.TestingBuildParams
4963
4964 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4965 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004966 }
4967
Paul Duffin40a3f652021-07-19 13:11:24 +01004968 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4969 t.Helper()
4970 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4971 var rule android.TestingBuildParams
4972
4973 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4974 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4975 }
4976
Paul Duffin89f570a2021-06-16 01:42:33 +01004977 fragment := java.ApexVariantReference{
4978 Apex: proptools.StringPtr("myapex"),
4979 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4980 }
4981
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004982 t.Run("prebuilt only", func(t *testing.T) {
4983 bp := `
4984 prebuilt_apex {
4985 name: "myapex",
4986 arch: {
4987 arm64: {
4988 src: "myapex-arm64.apex",
4989 },
4990 arm: {
4991 src: "myapex-arm.apex",
4992 },
4993 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004994 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4995 }
4996
4997 prebuilt_bootclasspath_fragment {
4998 name: "my-bootclasspath-fragment",
4999 contents: ["libfoo", "libbar"],
5000 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005001 hidden_api: {
5002 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5003 metadata: "my-bootclasspath-fragment/metadata.csv",
5004 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005005 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5006 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5007 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005008 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005009 }
5010
5011 java_import {
5012 name: "libfoo",
5013 jars: ["libfoo.jar"],
5014 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005015 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005016 }
Paul Duffin37856732021-02-26 14:24:15 +00005017
5018 java_sdk_library_import {
5019 name: "libbar",
5020 public: {
5021 jars: ["libbar.jar"],
5022 },
5023 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005024 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005025 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005026 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005027 `
5028
Paul Duffin89f570a2021-06-16 01:42:33 +01005029 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005030 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5031 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005032
Paul Duffin537ea3d2021-05-14 10:38:00 +01005033 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005034 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005035 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005036 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005037 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5038 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005039 })
5040
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005041 t.Run("apex_set only", func(t *testing.T) {
5042 bp := `
5043 apex_set {
5044 name: "myapex",
5045 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005046 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5047 }
5048
5049 prebuilt_bootclasspath_fragment {
5050 name: "my-bootclasspath-fragment",
5051 contents: ["libfoo", "libbar"],
5052 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005053 hidden_api: {
5054 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5055 metadata: "my-bootclasspath-fragment/metadata.csv",
5056 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005057 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5058 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5059 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005060 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005061 }
5062
5063 java_import {
5064 name: "libfoo",
5065 jars: ["libfoo.jar"],
5066 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005067 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005068 }
5069
5070 java_sdk_library_import {
5071 name: "libbar",
5072 public: {
5073 jars: ["libbar.jar"],
5074 },
5075 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005076 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005077 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005078 }
5079 `
5080
Paul Duffin89f570a2021-06-16 01:42:33 +01005081 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005082 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5083 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5084
Paul Duffin537ea3d2021-05-14 10:38:00 +01005085 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005086 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005087 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005088 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005089 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5090 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005091 })
5092
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005093 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5094 bp := `
5095 prebuilt_apex {
5096 name: "myapex",
5097 arch: {
5098 arm64: {
5099 src: "myapex-arm64.apex",
5100 },
5101 arm: {
5102 src: "myapex-arm.apex",
5103 },
5104 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005105 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5106 }
5107
5108 prebuilt_bootclasspath_fragment {
5109 name: "my-bootclasspath-fragment",
5110 contents: ["libfoo", "libbar"],
5111 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005112 hidden_api: {
5113 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5114 metadata: "my-bootclasspath-fragment/metadata.csv",
5115 index: "my-bootclasspath-fragment/index.csv",
5116 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5117 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5118 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005119 }
5120
5121 java_import {
5122 name: "libfoo",
5123 jars: ["libfoo.jar"],
5124 apex_available: ["myapex"],
5125 }
5126
5127 java_library {
5128 name: "libfoo",
5129 srcs: ["foo/bar/MyClass.java"],
5130 apex_available: ["myapex"],
5131 }
Paul Duffin37856732021-02-26 14:24:15 +00005132
5133 java_sdk_library_import {
5134 name: "libbar",
5135 public: {
5136 jars: ["libbar.jar"],
5137 },
5138 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005139 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005140 }
5141
5142 java_sdk_library {
5143 name: "libbar",
5144 srcs: ["foo/bar/MyClass.java"],
5145 unsafe_ignore_missing_latest_api: true,
5146 apex_available: ["myapex"],
5147 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005148 `
5149
5150 // In this test the source (java_library) libfoo is active since the
5151 // prebuilt (java_import) defaults to prefer:false. However the
5152 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5153 // find the dex boot jar in it. We either need to disable the source libfoo
5154 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005155 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005156 // dexbootjar check is skipped if AllowMissingDependencies is true
5157 preparerAllowMissingDeps := android.GroupFixturePreparers(
5158 preparer,
5159 android.PrepareForTestWithAllowMissingDependencies,
5160 )
5161 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005162 })
5163
5164 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5165 bp := `
5166 prebuilt_apex {
5167 name: "myapex",
5168 arch: {
5169 arm64: {
5170 src: "myapex-arm64.apex",
5171 },
5172 arm: {
5173 src: "myapex-arm.apex",
5174 },
5175 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005176 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5177 }
5178
5179 prebuilt_bootclasspath_fragment {
5180 name: "my-bootclasspath-fragment",
5181 contents: ["libfoo", "libbar"],
5182 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005183 hidden_api: {
5184 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5185 metadata: "my-bootclasspath-fragment/metadata.csv",
5186 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005187 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5188 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5189 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005190 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005191 }
5192
5193 java_import {
5194 name: "libfoo",
5195 prefer: true,
5196 jars: ["libfoo.jar"],
5197 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005198 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005199 }
5200
5201 java_library {
5202 name: "libfoo",
5203 srcs: ["foo/bar/MyClass.java"],
5204 apex_available: ["myapex"],
5205 }
Paul Duffin37856732021-02-26 14:24:15 +00005206
5207 java_sdk_library_import {
5208 name: "libbar",
5209 prefer: true,
5210 public: {
5211 jars: ["libbar.jar"],
5212 },
5213 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005214 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005215 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005216 }
5217
5218 java_sdk_library {
5219 name: "libbar",
5220 srcs: ["foo/bar/MyClass.java"],
5221 unsafe_ignore_missing_latest_api: true,
5222 apex_available: ["myapex"],
5223 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005224 `
5225
Paul Duffin89f570a2021-06-16 01:42:33 +01005226 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005227 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5228 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005229
Paul Duffin537ea3d2021-05-14 10:38:00 +01005230 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005231 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005232 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005233 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005234 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5235 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005236 })
5237
5238 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5239 bp := `
5240 apex {
5241 name: "myapex",
5242 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005243 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005244 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005245 }
5246
5247 apex_key {
5248 name: "myapex.key",
5249 public_key: "testkey.avbpubkey",
5250 private_key: "testkey.pem",
5251 }
5252
5253 prebuilt_apex {
5254 name: "myapex",
5255 arch: {
5256 arm64: {
5257 src: "myapex-arm64.apex",
5258 },
5259 arm: {
5260 src: "myapex-arm.apex",
5261 },
5262 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005263 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5264 }
5265
5266 prebuilt_bootclasspath_fragment {
5267 name: "my-bootclasspath-fragment",
5268 contents: ["libfoo", "libbar"],
5269 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005270 hidden_api: {
5271 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5272 metadata: "my-bootclasspath-fragment/metadata.csv",
5273 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005274 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5275 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5276 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005277 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005278 }
5279
5280 java_import {
5281 name: "libfoo",
5282 jars: ["libfoo.jar"],
5283 apex_available: ["myapex"],
5284 }
5285
5286 java_library {
5287 name: "libfoo",
5288 srcs: ["foo/bar/MyClass.java"],
5289 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005290 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005291 }
Paul Duffin37856732021-02-26 14:24:15 +00005292
5293 java_sdk_library_import {
5294 name: "libbar",
5295 public: {
5296 jars: ["libbar.jar"],
5297 },
5298 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005299 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005300 }
5301
5302 java_sdk_library {
5303 name: "libbar",
5304 srcs: ["foo/bar/MyClass.java"],
5305 unsafe_ignore_missing_latest_api: true,
5306 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005307 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005308 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005309 `
5310
Paul Duffin89f570a2021-06-16 01:42:33 +01005311 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005312 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5313 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005314
Paul Duffin537ea3d2021-05-14 10:38:00 +01005315 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005316 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005317 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005318 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005319 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5320 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005321 })
5322
5323 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5324 bp := `
5325 apex {
5326 name: "myapex",
5327 enabled: false,
5328 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005329 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005330 }
5331
5332 apex_key {
5333 name: "myapex.key",
5334 public_key: "testkey.avbpubkey",
5335 private_key: "testkey.pem",
5336 }
5337
5338 prebuilt_apex {
5339 name: "myapex",
5340 arch: {
5341 arm64: {
5342 src: "myapex-arm64.apex",
5343 },
5344 arm: {
5345 src: "myapex-arm.apex",
5346 },
5347 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005348 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5349 }
5350
5351 prebuilt_bootclasspath_fragment {
5352 name: "my-bootclasspath-fragment",
5353 contents: ["libfoo", "libbar"],
5354 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005355 hidden_api: {
5356 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5357 metadata: "my-bootclasspath-fragment/metadata.csv",
5358 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005359 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5360 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5361 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005362 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005363 }
5364
5365 java_import {
5366 name: "libfoo",
5367 prefer: true,
5368 jars: ["libfoo.jar"],
5369 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005370 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005371 }
5372
5373 java_library {
5374 name: "libfoo",
5375 srcs: ["foo/bar/MyClass.java"],
5376 apex_available: ["myapex"],
5377 }
Paul Duffin37856732021-02-26 14:24:15 +00005378
5379 java_sdk_library_import {
5380 name: "libbar",
5381 prefer: true,
5382 public: {
5383 jars: ["libbar.jar"],
5384 },
5385 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005386 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005387 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005388 }
5389
5390 java_sdk_library {
5391 name: "libbar",
5392 srcs: ["foo/bar/MyClass.java"],
5393 unsafe_ignore_missing_latest_api: true,
5394 apex_available: ["myapex"],
5395 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005396 `
5397
Paul Duffin89f570a2021-06-16 01:42:33 +01005398 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005399 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5400 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005401
Paul Duffin537ea3d2021-05-14 10:38:00 +01005402 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005403 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005404 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005405 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005406 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5407 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005408 })
5409}
5410
Roland Levillain630846d2019-06-26 12:48:34 +01005411func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005412 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005413 apex_test {
5414 name: "myapex",
5415 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005416 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005417 tests: [
5418 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005419 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005420 ],
5421 }
5422
5423 apex_key {
5424 name: "myapex.key",
5425 public_key: "testkey.avbpubkey",
5426 private_key: "testkey.pem",
5427 }
5428
Liz Kammer1c14a212020-05-12 15:26:55 -07005429 filegroup {
5430 name: "fg",
5431 srcs: [
5432 "baz",
5433 "bar/baz"
5434 ],
5435 }
5436
Roland Levillain630846d2019-06-26 12:48:34 +01005437 cc_test {
5438 name: "mytest",
5439 gtest: false,
5440 srcs: ["mytest.cpp"],
5441 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005442 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005443 system_shared_libs: [],
5444 static_executable: true,
5445 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005446 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005447 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005448
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005449 cc_library {
5450 name: "mylib",
5451 srcs: ["mylib.cpp"],
5452 system_shared_libs: [],
5453 stl: "none",
5454 }
5455
Liz Kammer5bd365f2020-05-27 15:15:11 -07005456 filegroup {
5457 name: "fg2",
5458 srcs: [
5459 "testdata/baz"
5460 ],
5461 }
5462
Roland Levillain9b5fde92019-06-28 15:41:19 +01005463 cc_test {
5464 name: "mytests",
5465 gtest: false,
5466 srcs: [
5467 "mytest1.cpp",
5468 "mytest2.cpp",
5469 "mytest3.cpp",
5470 ],
5471 test_per_src: true,
5472 relative_install_path: "test",
5473 system_shared_libs: [],
5474 static_executable: true,
5475 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005476 data: [
5477 ":fg",
5478 ":fg2",
5479 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005480 }
Roland Levillain630846d2019-06-26 12:48:34 +01005481 `)
5482
Sundong Ahnabb64432019-10-22 13:58:29 +09005483 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005484 copyCmds := apexRule.Args["copy_commands"]
5485
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005486 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005487 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005488 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005489
Liz Kammer1c14a212020-05-12 15:26:55 -07005490 //Ensure that test data are copied into apex.
5491 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5492 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5493
Roland Levillain9b5fde92019-06-28 15:41:19 +01005494 // Ensure that test deps built with `test_per_src` are copied into apex.
5495 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5496 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5497 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005498
5499 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005500 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005501 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005502 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005503 prefix := "TARGET_"
5504 var builder strings.Builder
5505 data.Custom(&builder, name, prefix, "", data)
5506 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005507 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5508 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5509 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5510 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005511 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005512 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005513 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005514
5515 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005516 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005517 data.Custom(&builder, name, prefix, "", data)
5518 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005519 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5520 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005521}
5522
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005523func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005524 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005525 apex {
5526 name: "myapex",
5527 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005528 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005529 }
5530 apex_key {
5531 name: "myapex.key",
5532 public_key: "testkey.avbpubkey",
5533 private_key: "testkey.pem",
5534 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005535 `,
5536 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5537 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5538 }),
5539 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005540 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005541 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005542 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005543 var builder strings.Builder
5544 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5545 androidMk := builder.String()
5546 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5547}
5548
Jooyung Hand48f3c32019-08-23 11:18:57 +09005549func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5550 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5551 apex {
5552 name: "myapex",
5553 key: "myapex.key",
5554 native_shared_libs: ["libfoo"],
5555 }
5556
5557 apex_key {
5558 name: "myapex.key",
5559 public_key: "testkey.avbpubkey",
5560 private_key: "testkey.pem",
5561 }
5562
5563 cc_library {
5564 name: "libfoo",
5565 stl: "none",
5566 system_shared_libs: [],
5567 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005568 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005569 }
5570 `)
5571 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5572 apex {
5573 name: "myapex",
5574 key: "myapex.key",
5575 java_libs: ["myjar"],
5576 }
5577
5578 apex_key {
5579 name: "myapex.key",
5580 public_key: "testkey.avbpubkey",
5581 private_key: "testkey.pem",
5582 }
5583
5584 java_library {
5585 name: "myjar",
5586 srcs: ["foo/bar/MyClass.java"],
5587 sdk_version: "none",
5588 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005589 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005590 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005591 }
5592 `)
5593}
5594
Bill Peckhama41a6962021-01-11 10:58:54 -08005595func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005596 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005597 apex {
5598 name: "myapex",
5599 key: "myapex.key",
5600 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005601 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005602 }
5603
5604 apex_key {
5605 name: "myapex.key",
5606 public_key: "testkey.avbpubkey",
5607 private_key: "testkey.pem",
5608 }
5609
5610 java_import {
5611 name: "myjavaimport",
5612 apex_available: ["myapex"],
5613 jars: ["my.jar"],
5614 compile_dex: true,
5615 }
5616 `)
5617
5618 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5619 apexRule := module.Rule("apexRule")
5620 copyCmds := apexRule.Args["copy_commands"]
5621 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5622}
5623
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005624func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005625 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005626 apex {
5627 name: "myapex",
5628 key: "myapex.key",
5629 apps: [
5630 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005631 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005632 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005633 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005634 }
5635
5636 apex_key {
5637 name: "myapex.key",
5638 public_key: "testkey.avbpubkey",
5639 private_key: "testkey.pem",
5640 }
5641
5642 android_app {
5643 name: "AppFoo",
5644 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005645 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005646 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005647 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005648 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005649 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005650 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005651
5652 android_app {
5653 name: "AppFooPriv",
5654 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005655 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005656 system_modules: "none",
5657 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005658 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005659 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005660 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005661
5662 cc_library_shared {
5663 name: "libjni",
5664 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005665 shared_libs: ["libfoo"],
5666 stl: "none",
5667 system_shared_libs: [],
5668 apex_available: [ "myapex" ],
5669 sdk_version: "current",
5670 }
5671
5672 cc_library_shared {
5673 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005674 stl: "none",
5675 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005676 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005677 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005678 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005679 `)
5680
Sundong Ahnabb64432019-10-22 13:58:29 +09005681 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005682 apexRule := module.Rule("apexRule")
5683 copyCmds := apexRule.Args["copy_commands"]
5684
Jingwen Chen6cb124b2022-04-19 13:58:58 +00005685 ensureContains(t, copyCmds, "image.apex/app/AppFoo@__APEX_VERSION_PLACEHOLDER__/AppFoo.apk")
5686 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@__APEX_VERSION_PLACEHOLDER__/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005687
Colin Crossaede88c2020-08-11 12:17:01 -07005688 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005689 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005690 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005691 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005692 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005693 // JNI libraries including transitive deps are
5694 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005695 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005696 // ... embedded inside APK (jnilibs.zip)
5697 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5698 // ... and not directly inside the APEX
5699 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5700 }
Dario Frenicde2a032019-10-27 00:29:22 +01005701}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005702
Dario Frenicde2a032019-10-27 00:29:22 +01005703func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005704 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005705 apex {
5706 name: "myapex",
5707 key: "myapex.key",
5708 apps: [
5709 "AppFooPrebuilt",
5710 "AppFooPrivPrebuilt",
5711 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005712 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005713 }
5714
5715 apex_key {
5716 name: "myapex.key",
5717 public_key: "testkey.avbpubkey",
5718 private_key: "testkey.pem",
5719 }
5720
5721 android_app_import {
5722 name: "AppFooPrebuilt",
5723 apk: "PrebuiltAppFoo.apk",
5724 presigned: true,
5725 dex_preopt: {
5726 enabled: false,
5727 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005728 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005729 }
5730
5731 android_app_import {
5732 name: "AppFooPrivPrebuilt",
5733 apk: "PrebuiltAppFooPriv.apk",
5734 privileged: true,
5735 presigned: true,
5736 dex_preopt: {
5737 enabled: false,
5738 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005739 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005740 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005741 }
5742 `)
5743
Sundong Ahnabb64432019-10-22 13:58:29 +09005744 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005745 apexRule := module.Rule("apexRule")
5746 copyCmds := apexRule.Args["copy_commands"]
5747
Jingwen Chen6cb124b2022-04-19 13:58:58 +00005748 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@__APEX_VERSION_PLACEHOLDER__/AppFooPrebuilt.apk")
5749 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@__APEX_VERSION_PLACEHOLDER__/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005750}
5751
5752func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005753 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005754 apex {
5755 name: "myapex",
5756 key: "myapex.key",
5757 apps: [
5758 "AppFoo",
5759 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005760 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005761 }
5762
5763 apex_key {
5764 name: "myapex.key",
5765 public_key: "testkey.avbpubkey",
5766 private_key: "testkey.pem",
5767 }
5768
5769 android_app {
5770 name: "AppFoo",
5771 srcs: ["foo/bar/MyClass.java"],
5772 sdk_version: "none",
5773 system_modules: "none",
5774 apex_available: [ "myapex" ],
5775 }
5776
5777 android_app_import {
5778 name: "AppFoo",
5779 apk: "AppFooPrebuilt.apk",
5780 filename: "AppFooPrebuilt.apk",
5781 presigned: true,
5782 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005783 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005784 }
5785 `, withFiles(map[string][]byte{
5786 "AppFooPrebuilt.apk": nil,
5787 }))
5788
5789 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jingwen Chen6cb124b2022-04-19 13:58:58 +00005790 "app/AppFoo@__APEX_VERSION_PLACEHOLDER__/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005791 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005792}
5793
Dario Freni6f3937c2019-12-20 22:58:03 +00005794func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005795 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005796 apex {
5797 name: "myapex",
5798 key: "myapex.key",
5799 apps: [
5800 "TesterHelpAppFoo",
5801 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005802 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005803 }
5804
5805 apex_key {
5806 name: "myapex.key",
5807 public_key: "testkey.avbpubkey",
5808 private_key: "testkey.pem",
5809 }
5810
5811 android_test_helper_app {
5812 name: "TesterHelpAppFoo",
5813 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005814 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005815 }
5816
5817 `)
5818
5819 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5820 apexRule := module.Rule("apexRule")
5821 copyCmds := apexRule.Args["copy_commands"]
5822
Jingwen Chen6cb124b2022-04-19 13:58:58 +00005823 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@__APEX_VERSION_PLACEHOLDER__/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005824}
5825
Jooyung Han18020ea2019-11-13 10:50:48 +09005826func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5827 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005828 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005829 apex {
5830 name: "myapex",
5831 key: "myapex.key",
5832 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005833 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005834 }
5835
5836 apex_key {
5837 name: "myapex.key",
5838 public_key: "testkey.avbpubkey",
5839 private_key: "testkey.pem",
5840 }
5841
5842 apex {
5843 name: "otherapex",
5844 key: "myapex.key",
5845 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005846 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005847 }
5848
5849 cc_defaults {
5850 name: "libfoo-defaults",
5851 apex_available: ["otherapex"],
5852 }
5853
5854 cc_library {
5855 name: "libfoo",
5856 defaults: ["libfoo-defaults"],
5857 stl: "none",
5858 system_shared_libs: [],
5859 }`)
5860}
5861
Paul Duffine52e66f2020-03-30 17:54:29 +01005862func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005863 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005864 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005865 apex {
5866 name: "myapex",
5867 key: "myapex.key",
5868 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005869 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005870 }
5871
5872 apex_key {
5873 name: "myapex.key",
5874 public_key: "testkey.avbpubkey",
5875 private_key: "testkey.pem",
5876 }
5877
5878 apex {
5879 name: "otherapex",
5880 key: "otherapex.key",
5881 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005882 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005883 }
5884
5885 apex_key {
5886 name: "otherapex.key",
5887 public_key: "testkey.avbpubkey",
5888 private_key: "testkey.pem",
5889 }
5890
5891 cc_library {
5892 name: "libfoo",
5893 stl: "none",
5894 system_shared_libs: [],
5895 apex_available: ["otherapex"],
5896 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005897}
Jiyong Park127b40b2019-09-30 16:04:35 +09005898
Paul Duffine52e66f2020-03-30 17:54:29 +01005899func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005900 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005901 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005902.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005903.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005904.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005905.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005906.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005907.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005908 apex {
5909 name: "myapex",
5910 key: "myapex.key",
5911 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005912 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005913 }
5914
5915 apex_key {
5916 name: "myapex.key",
5917 public_key: "testkey.avbpubkey",
5918 private_key: "testkey.pem",
5919 }
5920
Jiyong Park127b40b2019-09-30 16:04:35 +09005921 cc_library {
5922 name: "libfoo",
5923 stl: "none",
5924 shared_libs: ["libbar"],
5925 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005926 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005927 }
5928
5929 cc_library {
5930 name: "libbar",
5931 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005932 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005933 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005934 apex_available: ["myapex"],
5935 }
5936
5937 cc_library {
5938 name: "libbaz",
5939 stl: "none",
5940 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005941 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005942}
Jiyong Park127b40b2019-09-30 16:04:35 +09005943
Paul Duffine52e66f2020-03-30 17:54:29 +01005944func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005945 testApexError(t, "\"otherapex\" is not a valid module name", `
5946 apex {
5947 name: "myapex",
5948 key: "myapex.key",
5949 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005950 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005951 }
5952
5953 apex_key {
5954 name: "myapex.key",
5955 public_key: "testkey.avbpubkey",
5956 private_key: "testkey.pem",
5957 }
5958
5959 cc_library {
5960 name: "libfoo",
5961 stl: "none",
5962 system_shared_libs: [],
5963 apex_available: ["otherapex"],
5964 }`)
5965
Paul Duffine52e66f2020-03-30 17:54:29 +01005966 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005967 apex {
5968 name: "myapex",
5969 key: "myapex.key",
5970 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005971 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005972 }
5973
5974 apex_key {
5975 name: "myapex.key",
5976 public_key: "testkey.avbpubkey",
5977 private_key: "testkey.pem",
5978 }
5979
5980 cc_library {
5981 name: "libfoo",
5982 stl: "none",
5983 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005984 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005985 apex_available: ["myapex"],
5986 }
5987
5988 cc_library {
5989 name: "libbar",
5990 stl: "none",
5991 system_shared_libs: [],
5992 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005993 }
5994
5995 cc_library {
5996 name: "libbaz",
5997 stl: "none",
5998 system_shared_libs: [],
5999 stubs: {
6000 versions: ["10", "20", "30"],
6001 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006002 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006003}
Jiyong Park127b40b2019-09-30 16:04:35 +09006004
Jiyong Park89e850a2020-04-07 16:37:39 +09006005func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006006 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006007 apex {
6008 name: "myapex",
6009 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006010 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006011 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006012 }
6013
6014 apex_key {
6015 name: "myapex.key",
6016 public_key: "testkey.avbpubkey",
6017 private_key: "testkey.pem",
6018 }
6019
6020 cc_library {
6021 name: "libfoo",
6022 stl: "none",
6023 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006024 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006025 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006026 }
6027
6028 cc_library {
6029 name: "libfoo2",
6030 stl: "none",
6031 system_shared_libs: [],
6032 shared_libs: ["libbaz"],
6033 apex_available: ["//apex_available:platform"],
6034 }
6035
6036 cc_library {
6037 name: "libbar",
6038 stl: "none",
6039 system_shared_libs: [],
6040 apex_available: ["myapex"],
6041 }
6042
6043 cc_library {
6044 name: "libbaz",
6045 stl: "none",
6046 system_shared_libs: [],
6047 apex_available: ["myapex"],
6048 stubs: {
6049 versions: ["1"],
6050 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006051 }`)
6052
Jiyong Park89e850a2020-04-07 16:37:39 +09006053 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6054 // because it depends on libbar which isn't available to platform
6055 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6056 if libfoo.NotAvailableForPlatform() != true {
6057 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6058 }
6059
6060 // libfoo2 however can be available to platform because it depends on libbaz which provides
6061 // stubs
6062 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6063 if libfoo2.NotAvailableForPlatform() == true {
6064 t.Errorf("%q should be available to platform", libfoo2.String())
6065 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006066}
Jiyong Parka90ca002019-10-07 15:47:24 +09006067
Paul Duffine52e66f2020-03-30 17:54:29 +01006068func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006069 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006070 apex {
6071 name: "myapex",
6072 key: "myapex.key",
6073 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006074 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006075 }
6076
6077 apex_key {
6078 name: "myapex.key",
6079 public_key: "testkey.avbpubkey",
6080 private_key: "testkey.pem",
6081 }
6082
6083 cc_library {
6084 name: "libfoo",
6085 stl: "none",
6086 system_shared_libs: [],
6087 apex_available: ["myapex"],
6088 static: {
6089 apex_available: ["//apex_available:platform"],
6090 },
6091 }`)
6092
Jiyong Park89e850a2020-04-07 16:37:39 +09006093 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6094 if libfooShared.NotAvailableForPlatform() != true {
6095 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6096 }
6097 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6098 if libfooStatic.NotAvailableForPlatform() != false {
6099 t.Errorf("%q should be available to platform", libfooStatic.String())
6100 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006101}
6102
Jiyong Park5d790c32019-11-15 18:40:32 +09006103func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006104 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006105 apex {
6106 name: "myapex",
6107 key: "myapex.key",
6108 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006109 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006110 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006111 bootclasspath_fragments: ["mybootclasspath_fragment"],
6112 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6113 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006114 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006115 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006116 }
6117
6118 override_apex {
6119 name: "override_myapex",
6120 base: "myapex",
6121 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08006122 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006123 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006124 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6125 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6126 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006127 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006128 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006129 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006130 key: "mynewapex.key",
6131 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006132 }
6133
6134 apex_key {
6135 name: "myapex.key",
6136 public_key: "testkey.avbpubkey",
6137 private_key: "testkey.pem",
6138 }
6139
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006140 apex_key {
6141 name: "mynewapex.key",
6142 public_key: "testkey2.avbpubkey",
6143 private_key: "testkey2.pem",
6144 }
6145
6146 android_app_certificate {
6147 name: "myapex.certificate",
6148 certificate: "testkey",
6149 }
6150
Jiyong Park5d790c32019-11-15 18:40:32 +09006151 android_app {
6152 name: "app",
6153 srcs: ["foo/bar/MyClass.java"],
6154 package_name: "foo",
6155 sdk_version: "none",
6156 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006157 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006158 }
6159
6160 override_android_app {
6161 name: "override_app",
6162 base: "app",
6163 package_name: "bar",
6164 }
markchien7c803b82021-08-26 22:10:06 +08006165
6166 bpf {
6167 name: "bpf",
6168 srcs: ["bpf.c"],
6169 }
6170
6171 bpf {
6172 name: "override_bpf",
6173 srcs: ["override_bpf.c"],
6174 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006175
6176 prebuilt_etc {
6177 name: "myetc",
6178 src: "myprebuilt",
6179 }
6180
6181 prebuilt_etc {
6182 name: "override_myetc",
6183 src: "override_myprebuilt",
6184 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006185
6186 java_library {
6187 name: "bcplib",
6188 srcs: ["a.java"],
6189 compile_dex: true,
6190 apex_available: ["myapex"],
6191 permitted_packages: ["bcp.lib"],
6192 }
6193
6194 bootclasspath_fragment {
6195 name: "mybootclasspath_fragment",
6196 contents: ["bcplib"],
6197 apex_available: ["myapex"],
6198 }
6199
6200 java_library {
6201 name: "override_bcplib",
6202 srcs: ["a.java"],
6203 compile_dex: true,
6204 apex_available: ["myapex"],
6205 permitted_packages: ["override.bcp.lib"],
6206 }
6207
6208 bootclasspath_fragment {
6209 name: "override_bootclasspath_fragment",
6210 contents: ["override_bcplib"],
6211 apex_available: ["myapex"],
6212 }
6213
6214 java_library {
6215 name: "systemserverlib",
6216 srcs: ["a.java"],
6217 apex_available: ["myapex"],
6218 }
6219
6220 systemserverclasspath_fragment {
6221 name: "mysystemserverclasspath_fragment",
6222 standalone_contents: ["systemserverlib"],
6223 apex_available: ["myapex"],
6224 }
6225
6226 java_library {
6227 name: "override_systemserverlib",
6228 srcs: ["a.java"],
6229 apex_available: ["myapex"],
6230 }
6231
6232 systemserverclasspath_fragment {
6233 name: "override_systemserverclasspath_fragment",
6234 standalone_contents: ["override_systemserverlib"],
6235 apex_available: ["myapex"],
6236 }
6237
6238 java_library {
6239 name: "myjava_library",
6240 srcs: ["a.java"],
6241 compile_dex: true,
6242 apex_available: ["myapex"],
6243 }
6244
6245 java_library {
6246 name: "override_java_library",
6247 srcs: ["a.java"],
6248 compile_dex: true,
6249 apex_available: ["myapex"],
6250 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006251 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006252
Jiyong Park317645e2019-12-05 13:20:58 +09006253 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6254 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6255 if originalVariant.GetOverriddenBy() != "" {
6256 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6257 }
6258 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6259 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6260 }
6261
Jiyong Park5d790c32019-11-15 18:40:32 +09006262 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6263 apexRule := module.Rule("apexRule")
6264 copyCmds := apexRule.Args["copy_commands"]
6265
Jingwen Chen6cb124b2022-04-19 13:58:58 +00006266 ensureNotContains(t, copyCmds, "image.apex/app/app@__APEX_VERSION_PLACEHOLDER__/app.apk")
6267 ensureContains(t, copyCmds, "image.apex/app/override_app@__APEX_VERSION_PLACEHOLDER__/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006268
markchien7c803b82021-08-26 22:10:06 +08006269 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6270 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6271
Daniel Norman5a3ce132021-08-26 15:44:43 -07006272 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6273 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6274
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006275 apexBundle := module.Module().(*apexBundle)
6276 name := apexBundle.Name()
6277 if name != "override_myapex" {
6278 t.Errorf("name should be \"override_myapex\", but was %q", name)
6279 }
6280
Baligh Uddin004d7172020-02-19 21:29:28 -08006281 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6282 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6283 }
6284
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006285 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6286 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6287 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6288 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6289 android.AssertArrayString(t, "Java_libs does not match",
6290 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6291
Jiyong Park20bacab2020-03-03 11:45:41 +09006292 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006293 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006294 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6295
6296 signApkRule := module.Rule("signapk")
6297 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006298
Colin Crossaa255532020-07-03 13:18:24 -07006299 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006300 var builder strings.Builder
6301 data.Custom(&builder, name, "TARGET_", "", data)
6302 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006303 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006304 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006305 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006306 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6307 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6308 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006309 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006310 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006311 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006312 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006313 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006314 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006315 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6316 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6317 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006318 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006319}
6320
Albert Martineefabcf2022-03-21 20:11:16 +00006321func TestMinSdkVersionOverride(t *testing.T) {
6322 // Override from 29 to 31
6323 minSdkOverride31 := "31"
6324 ctx := testApex(t, `
6325 apex {
6326 name: "myapex",
6327 key: "myapex.key",
6328 native_shared_libs: ["mylib"],
6329 updatable: true,
6330 min_sdk_version: "29"
6331 }
6332
6333 override_apex {
6334 name: "override_myapex",
6335 base: "myapex",
6336 logging_parent: "com.foo.bar",
6337 package_name: "test.overridden.package"
6338 }
6339
6340 apex_key {
6341 name: "myapex.key",
6342 public_key: "testkey.avbpubkey",
6343 private_key: "testkey.pem",
6344 }
6345
6346 cc_library {
6347 name: "mylib",
6348 srcs: ["mylib.cpp"],
6349 runtime_libs: ["libbar"],
6350 system_shared_libs: [],
6351 stl: "none",
6352 apex_available: [ "myapex" ],
6353 min_sdk_version: "apex_inherit"
6354 }
6355
6356 cc_library {
6357 name: "libbar",
6358 srcs: ["mylib.cpp"],
6359 system_shared_libs: [],
6360 stl: "none",
6361 apex_available: [ "myapex" ],
6362 min_sdk_version: "apex_inherit"
6363 }
6364
6365 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6366
6367 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6368 copyCmds := apexRule.Args["copy_commands"]
6369
6370 // Ensure that direct non-stubs dep is always included
6371 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6372
6373 // Ensure that runtime_libs dep in included
6374 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6375
6376 // Ensure libraries target overridden min_sdk_version value
6377 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6378}
6379
6380func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6381 // Attempt to override from 31 to 29, should be a NOOP
6382 minSdkOverride29 := "29"
6383 ctx := testApex(t, `
6384 apex {
6385 name: "myapex",
6386 key: "myapex.key",
6387 native_shared_libs: ["mylib"],
6388 updatable: true,
6389 min_sdk_version: "31"
6390 }
6391
6392 override_apex {
6393 name: "override_myapex",
6394 base: "myapex",
6395 logging_parent: "com.foo.bar",
6396 package_name: "test.overridden.package"
6397 }
6398
6399 apex_key {
6400 name: "myapex.key",
6401 public_key: "testkey.avbpubkey",
6402 private_key: "testkey.pem",
6403 }
6404
6405 cc_library {
6406 name: "mylib",
6407 srcs: ["mylib.cpp"],
6408 runtime_libs: ["libbar"],
6409 system_shared_libs: [],
6410 stl: "none",
6411 apex_available: [ "myapex" ],
6412 min_sdk_version: "apex_inherit"
6413 }
6414
6415 cc_library {
6416 name: "libbar",
6417 srcs: ["mylib.cpp"],
6418 system_shared_libs: [],
6419 stl: "none",
6420 apex_available: [ "myapex" ],
6421 min_sdk_version: "apex_inherit"
6422 }
6423
6424 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6425
6426 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6427 copyCmds := apexRule.Args["copy_commands"]
6428
6429 // Ensure that direct non-stubs dep is always included
6430 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6431
6432 // Ensure that runtime_libs dep in included
6433 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6434
6435 // Ensure libraries target the original min_sdk_version value rather than the overridden
6436 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6437}
6438
Jooyung Han214bf372019-11-12 13:03:50 +09006439func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006440 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006441 apex {
6442 name: "myapex",
6443 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006444 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006445 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006446 }
6447
6448 apex_key {
6449 name: "myapex.key",
6450 public_key: "testkey.avbpubkey",
6451 private_key: "testkey.pem",
6452 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006453
6454 cc_library {
6455 name: "mylib",
6456 srcs: ["mylib.cpp"],
6457 stl: "libc++",
6458 system_shared_libs: [],
6459 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006460 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006461 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006462 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006463
6464 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6465 args := module.Rule("apexRule").Args
6466 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006467 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006468
6469 // The copies of the libraries in the apex should have one more dependency than
6470 // the ones outside the apex, namely the unwinder. Ideally we should check
6471 // the dependency names directly here but for some reason the names are blank in
6472 // this test.
6473 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006474 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006475 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6476 if len(apexImplicits) != len(nonApexImplicits)+1 {
6477 t.Errorf("%q missing unwinder dep", lib)
6478 }
6479 }
Jooyung Han214bf372019-11-12 13:03:50 +09006480}
6481
Paul Duffine05480a2021-03-08 15:07:14 +00006482var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006483 "api/current.txt": nil,
6484 "api/removed.txt": nil,
6485 "api/system-current.txt": nil,
6486 "api/system-removed.txt": nil,
6487 "api/test-current.txt": nil,
6488 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006489
Anton Hanssondff2c782020-12-21 17:10:01 +00006490 "100/public/api/foo.txt": nil,
6491 "100/public/api/foo-removed.txt": nil,
6492 "100/system/api/foo.txt": nil,
6493 "100/system/api/foo-removed.txt": nil,
6494
Paul Duffineedc5d52020-06-12 17:46:39 +01006495 // For java_sdk_library_import
6496 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006497}
6498
Jooyung Han58f26ab2019-12-18 15:34:32 +09006499func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006500 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006501 apex {
6502 name: "myapex",
6503 key: "myapex.key",
6504 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006505 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006506 }
6507
6508 apex_key {
6509 name: "myapex.key",
6510 public_key: "testkey.avbpubkey",
6511 private_key: "testkey.pem",
6512 }
6513
6514 java_sdk_library {
6515 name: "foo",
6516 srcs: ["a.java"],
6517 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006518 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006519 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006520
6521 prebuilt_apis {
6522 name: "sdk",
6523 api_dirs: ["100"],
6524 }
Paul Duffin9b879592020-05-26 13:21:35 +01006525 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006526
6527 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006528 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006529 "javalib/foo.jar",
6530 "etc/permissions/foo.xml",
6531 })
6532 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006533 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006534 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 +09006535}
6536
Paul Duffin9b879592020-05-26 13:21:35 +01006537func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006538 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006539 apex {
6540 name: "myapex",
6541 key: "myapex.key",
6542 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006543 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006544 }
6545
6546 apex_key {
6547 name: "myapex.key",
6548 public_key: "testkey.avbpubkey",
6549 private_key: "testkey.pem",
6550 }
6551
6552 java_sdk_library {
6553 name: "foo",
6554 srcs: ["a.java"],
6555 api_packages: ["foo"],
6556 apex_available: ["myapex"],
6557 sdk_version: "none",
6558 system_modules: "none",
6559 }
6560
6561 java_library {
6562 name: "bar",
6563 srcs: ["a.java"],
6564 libs: ["foo"],
6565 apex_available: ["myapex"],
6566 sdk_version: "none",
6567 system_modules: "none",
6568 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006569
6570 prebuilt_apis {
6571 name: "sdk",
6572 api_dirs: ["100"],
6573 }
Paul Duffin9b879592020-05-26 13:21:35 +01006574 `, withFiles(filesForSdkLibrary))
6575
6576 // java_sdk_library installs both impl jar and permission XML
6577 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6578 "javalib/bar.jar",
6579 "javalib/foo.jar",
6580 "etc/permissions/foo.xml",
6581 })
6582
6583 // The bar library should depend on the implementation jar.
6584 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006585 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006586 t.Errorf("expected %q, found %#q", expected, actual)
6587 }
6588}
6589
6590func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006591 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006592 apex {
6593 name: "myapex",
6594 key: "myapex.key",
6595 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006596 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006597 }
6598
6599 apex_key {
6600 name: "myapex.key",
6601 public_key: "testkey.avbpubkey",
6602 private_key: "testkey.pem",
6603 }
6604
6605 java_sdk_library {
6606 name: "foo",
6607 srcs: ["a.java"],
6608 api_packages: ["foo"],
6609 apex_available: ["myapex"],
6610 sdk_version: "none",
6611 system_modules: "none",
6612 }
6613
6614 java_library {
6615 name: "bar",
6616 srcs: ["a.java"],
6617 libs: ["foo"],
6618 sdk_version: "none",
6619 system_modules: "none",
6620 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006621
6622 prebuilt_apis {
6623 name: "sdk",
6624 api_dirs: ["100"],
6625 }
Paul Duffin9b879592020-05-26 13:21:35 +01006626 `, withFiles(filesForSdkLibrary))
6627
6628 // java_sdk_library installs both impl jar and permission XML
6629 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6630 "javalib/foo.jar",
6631 "etc/permissions/foo.xml",
6632 })
6633
6634 // The bar library should depend on the stubs jar.
6635 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006636 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006637 t.Errorf("expected %q, found %#q", expected, actual)
6638 }
6639}
6640
Paul Duffineedc5d52020-06-12 17:46:39 +01006641func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006642 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006643 prebuilt_apis {
6644 name: "sdk",
6645 api_dirs: ["100"],
6646 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006647 withFiles(map[string][]byte{
6648 "apex/a.java": nil,
6649 "apex/apex_manifest.json": nil,
6650 "apex/Android.bp": []byte(`
6651 package {
6652 default_visibility: ["//visibility:private"],
6653 }
6654
6655 apex {
6656 name: "myapex",
6657 key: "myapex.key",
6658 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006659 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006660 }
6661
6662 apex_key {
6663 name: "myapex.key",
6664 public_key: "testkey.avbpubkey",
6665 private_key: "testkey.pem",
6666 }
6667
6668 java_library {
6669 name: "bar",
6670 srcs: ["a.java"],
6671 libs: ["foo"],
6672 apex_available: ["myapex"],
6673 sdk_version: "none",
6674 system_modules: "none",
6675 }
6676`),
6677 "source/a.java": nil,
6678 "source/api/current.txt": nil,
6679 "source/api/removed.txt": nil,
6680 "source/Android.bp": []byte(`
6681 package {
6682 default_visibility: ["//visibility:private"],
6683 }
6684
6685 java_sdk_library {
6686 name: "foo",
6687 visibility: ["//apex"],
6688 srcs: ["a.java"],
6689 api_packages: ["foo"],
6690 apex_available: ["myapex"],
6691 sdk_version: "none",
6692 system_modules: "none",
6693 public: {
6694 enabled: true,
6695 },
6696 }
6697`),
6698 "prebuilt/a.jar": nil,
6699 "prebuilt/Android.bp": []byte(`
6700 package {
6701 default_visibility: ["//visibility:private"],
6702 }
6703
6704 java_sdk_library_import {
6705 name: "foo",
6706 visibility: ["//apex", "//source"],
6707 apex_available: ["myapex"],
6708 prefer: true,
6709 public: {
6710 jars: ["a.jar"],
6711 },
6712 }
6713`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006714 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006715 )
6716
6717 // java_sdk_library installs both impl jar and permission XML
6718 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6719 "javalib/bar.jar",
6720 "javalib/foo.jar",
6721 "etc/permissions/foo.xml",
6722 })
6723
6724 // The bar library should depend on the implementation jar.
6725 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006726 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006727 t.Errorf("expected %q, found %#q", expected, actual)
6728 }
6729}
6730
6731func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6732 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6733 apex {
6734 name: "myapex",
6735 key: "myapex.key",
6736 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006737 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006738 }
6739
6740 apex_key {
6741 name: "myapex.key",
6742 public_key: "testkey.avbpubkey",
6743 private_key: "testkey.pem",
6744 }
6745
6746 java_sdk_library_import {
6747 name: "foo",
6748 apex_available: ["myapex"],
6749 prefer: true,
6750 public: {
6751 jars: ["a.jar"],
6752 },
6753 }
6754
6755 `, withFiles(filesForSdkLibrary))
6756}
6757
atrost6e126252020-01-27 17:01:16 +00006758func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006759 result := android.GroupFixturePreparers(
6760 prepareForApexTest,
6761 java.PrepareForTestWithPlatformCompatConfig,
6762 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006763 apex {
6764 name: "myapex",
6765 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006766 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006767 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006768 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006769 }
6770
6771 apex_key {
6772 name: "myapex.key",
6773 public_key: "testkey.avbpubkey",
6774 private_key: "testkey.pem",
6775 }
6776
6777 platform_compat_config {
6778 name: "myjar-platform-compat-config",
6779 src: ":myjar",
6780 }
6781
6782 java_library {
6783 name: "myjar",
6784 srcs: ["foo/bar/MyClass.java"],
6785 sdk_version: "none",
6786 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006787 apex_available: [ "myapex" ],
6788 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006789
6790 // Make sure that a preferred prebuilt does not affect the apex contents.
6791 prebuilt_platform_compat_config {
6792 name: "myjar-platform-compat-config",
6793 metadata: "compat-config/metadata.xml",
6794 prefer: true,
6795 }
atrost6e126252020-01-27 17:01:16 +00006796 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006797 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006798 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6799 "etc/compatconfig/myjar-platform-compat-config.xml",
6800 "javalib/myjar.jar",
6801 })
6802}
6803
Jiyong Park479321d2019-12-16 11:47:12 +09006804func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6805 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6806 apex {
6807 name: "myapex",
6808 key: "myapex.key",
6809 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006810 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006811 }
6812
6813 apex_key {
6814 name: "myapex.key",
6815 public_key: "testkey.avbpubkey",
6816 private_key: "testkey.pem",
6817 }
6818
6819 java_library {
6820 name: "myjar",
6821 srcs: ["foo/bar/MyClass.java"],
6822 sdk_version: "none",
6823 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006824 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006825 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006826 }
6827 `)
6828}
6829
Jiyong Park7afd1072019-12-30 16:56:33 +09006830func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006831 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006832 apex {
6833 name: "myapex",
6834 key: "myapex.key",
6835 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006836 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006837 }
6838
6839 apex_key {
6840 name: "myapex.key",
6841 public_key: "testkey.avbpubkey",
6842 private_key: "testkey.pem",
6843 }
6844
6845 cc_library {
6846 name: "mylib",
6847 srcs: ["mylib.cpp"],
6848 system_shared_libs: [],
6849 stl: "none",
6850 required: ["a", "b"],
6851 host_required: ["c", "d"],
6852 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006853 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006854 }
6855 `)
6856
6857 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006858 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006859 name := apexBundle.BaseModuleName()
6860 prefix := "TARGET_"
6861 var builder strings.Builder
6862 data.Custom(&builder, name, prefix, "", data)
6863 androidMk := builder.String()
6864 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6865 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6866 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6867}
6868
Jiyong Park7cd10e32020-01-14 09:22:18 +09006869func TestSymlinksFromApexToSystem(t *testing.T) {
6870 bp := `
6871 apex {
6872 name: "myapex",
6873 key: "myapex.key",
6874 native_shared_libs: ["mylib"],
6875 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006876 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006877 }
6878
Jiyong Park9d677202020-02-19 16:29:35 +09006879 apex {
6880 name: "myapex.updatable",
6881 key: "myapex.key",
6882 native_shared_libs: ["mylib"],
6883 java_libs: ["myjar"],
6884 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006885 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006886 }
6887
Jiyong Park7cd10e32020-01-14 09:22:18 +09006888 apex_key {
6889 name: "myapex.key",
6890 public_key: "testkey.avbpubkey",
6891 private_key: "testkey.pem",
6892 }
6893
6894 cc_library {
6895 name: "mylib",
6896 srcs: ["mylib.cpp"],
6897 shared_libs: ["myotherlib"],
6898 system_shared_libs: [],
6899 stl: "none",
6900 apex_available: [
6901 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006902 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006903 "//apex_available:platform",
6904 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006905 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006906 }
6907
6908 cc_library {
6909 name: "myotherlib",
6910 srcs: ["mylib.cpp"],
6911 system_shared_libs: [],
6912 stl: "none",
6913 apex_available: [
6914 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006915 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006916 "//apex_available:platform",
6917 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006918 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006919 }
6920
6921 java_library {
6922 name: "myjar",
6923 srcs: ["foo/bar/MyClass.java"],
6924 sdk_version: "none",
6925 system_modules: "none",
6926 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006927 apex_available: [
6928 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006929 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006930 "//apex_available:platform",
6931 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006932 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006933 }
6934
6935 java_library {
6936 name: "myotherjar",
6937 srcs: ["foo/bar/MyClass.java"],
6938 sdk_version: "none",
6939 system_modules: "none",
6940 apex_available: [
6941 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006942 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006943 "//apex_available:platform",
6944 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006945 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006946 }
6947 `
6948
6949 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6950 for _, f := range files {
6951 if f.path == file {
6952 if f.isLink {
6953 t.Errorf("%q is not a real file", file)
6954 }
6955 return
6956 }
6957 }
6958 t.Errorf("%q is not found", file)
6959 }
6960
6961 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6962 for _, f := range files {
6963 if f.path == file {
6964 if !f.isLink {
6965 t.Errorf("%q is not a symlink", file)
6966 }
6967 return
6968 }
6969 }
6970 t.Errorf("%q is not found", file)
6971 }
6972
Jiyong Park9d677202020-02-19 16:29:35 +09006973 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6974 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006975 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006976 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006977 ensureRealfileExists(t, files, "javalib/myjar.jar")
6978 ensureRealfileExists(t, files, "lib64/mylib.so")
6979 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6980
Jiyong Park9d677202020-02-19 16:29:35 +09006981 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6982 ensureRealfileExists(t, files, "javalib/myjar.jar")
6983 ensureRealfileExists(t, files, "lib64/mylib.so")
6984 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6985
6986 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006987 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006988 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006989 ensureRealfileExists(t, files, "javalib/myjar.jar")
6990 ensureRealfileExists(t, files, "lib64/mylib.so")
6991 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006992
6993 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6994 ensureRealfileExists(t, files, "javalib/myjar.jar")
6995 ensureRealfileExists(t, files, "lib64/mylib.so")
6996 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006997}
6998
Yo Chiange8128052020-07-23 20:09:18 +08006999func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007000 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007001 apex {
7002 name: "myapex",
7003 key: "myapex.key",
7004 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007005 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007006 }
7007
7008 apex_key {
7009 name: "myapex.key",
7010 public_key: "testkey.avbpubkey",
7011 private_key: "testkey.pem",
7012 }
7013
7014 cc_library_shared {
7015 name: "mylib",
7016 srcs: ["mylib.cpp"],
7017 shared_libs: ["myotherlib"],
7018 system_shared_libs: [],
7019 stl: "none",
7020 apex_available: [
7021 "myapex",
7022 "//apex_available:platform",
7023 ],
7024 }
7025
7026 cc_prebuilt_library_shared {
7027 name: "myotherlib",
7028 srcs: ["prebuilt.so"],
7029 system_shared_libs: [],
7030 stl: "none",
7031 apex_available: [
7032 "myapex",
7033 "//apex_available:platform",
7034 ],
7035 }
7036 `)
7037
7038 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007039 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007040 var builder strings.Builder
7041 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7042 androidMk := builder.String()
7043 // `myotherlib` is added to `myapex` as symlink
7044 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
7045 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7046 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7047 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09007048 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 +08007049}
7050
Jooyung Han643adc42020-02-27 13:50:06 +09007051func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007052 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007053 apex {
7054 name: "myapex",
7055 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007056 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007057 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007058 }
7059
7060 apex_key {
7061 name: "myapex.key",
7062 public_key: "testkey.avbpubkey",
7063 private_key: "testkey.pem",
7064 }
7065
7066 cc_library {
7067 name: "mylib",
7068 srcs: ["mylib.cpp"],
7069 shared_libs: ["mylib2"],
7070 system_shared_libs: [],
7071 stl: "none",
7072 apex_available: [ "myapex" ],
7073 }
7074
7075 cc_library {
7076 name: "mylib2",
7077 srcs: ["mylib.cpp"],
7078 system_shared_libs: [],
7079 stl: "none",
7080 apex_available: [ "myapex" ],
7081 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007082
7083 rust_ffi_shared {
7084 name: "libfoo.rust",
7085 crate_name: "foo",
7086 srcs: ["foo.rs"],
7087 shared_libs: ["libfoo.shared_from_rust"],
7088 prefer_rlib: true,
7089 apex_available: ["myapex"],
7090 }
7091
7092 cc_library_shared {
7093 name: "libfoo.shared_from_rust",
7094 srcs: ["mylib.cpp"],
7095 system_shared_libs: [],
7096 stl: "none",
7097 stubs: {
7098 versions: ["10", "11", "12"],
7099 },
7100 }
7101
Jooyung Han643adc42020-02-27 13:50:06 +09007102 `)
7103
7104 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7105 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007106 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007107 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7108 "lib64/mylib.so",
7109 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007110 "lib64/libfoo.rust.so",
7111 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7112 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007113 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007114
7115 // b/220397949
7116 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007117}
7118
Jooyung Han49f67012020-04-17 13:43:10 +09007119func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007120 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007121 apex {
7122 name: "myapex",
7123 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007124 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007125 }
7126 apex_key {
7127 name: "myapex.key",
7128 public_key: "testkey.avbpubkey",
7129 private_key: "testkey.pem",
7130 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007131 `,
7132 android.FixtureModifyConfig(func(config android.Config) {
7133 delete(config.Targets, android.Android)
7134 config.AndroidCommonTarget = android.Target{}
7135 }),
7136 )
Jooyung Han49f67012020-04-17 13:43:10 +09007137
7138 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7139 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7140 }
7141}
7142
Jiyong Parkbd159612020-02-28 15:22:21 +09007143func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007144 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007145 apex {
7146 name: "myapex",
7147 key: "myapex.key",
7148 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007149 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007150 }
7151
7152 apex_key {
7153 name: "myapex.key",
7154 public_key: "testkey.avbpubkey",
7155 private_key: "testkey.pem",
7156 }
7157
7158 android_app {
7159 name: "AppFoo",
7160 srcs: ["foo/bar/MyClass.java"],
7161 sdk_version: "none",
7162 system_modules: "none",
7163 apex_available: [ "myapex" ],
7164 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007165 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007166
Colin Crosscf371cc2020-11-13 11:48:42 -08007167 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007168 content := bundleConfigRule.Args["content"]
7169
7170 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jingwen Chen6cb124b2022-04-19 13:58:58 +00007171 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@__APEX_VERSION_PLACEHOLDER__/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09007172}
7173
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007174func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007175 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007176 apex {
7177 name: "myapex",
7178 key: "myapex.key",
7179 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007180 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007181 }
7182
7183 apex_key {
7184 name: "myapex.key",
7185 public_key: "testkey.avbpubkey",
7186 private_key: "testkey.pem",
7187 }
7188
7189 android_app_set {
7190 name: "AppSet",
7191 set: "AppSet.apks",
7192 }`)
7193 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007194 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007195 content := bundleConfigRule.Args["content"]
7196 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7197 s := mod.Rule("apexRule").Args["copy_commands"]
7198 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
7199 if len(copyCmds) != 3 {
7200 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
7201 }
Jingwen Chen6cb124b2022-04-19 13:58:58 +00007202 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@__APEX_VERSION_PLACEHOLDER__$")
7203 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@__APEX_VERSION_PLACEHOLDER__$")
7204 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet@__APEX_VERSION_PLACEHOLDER__ .*/AppSet.zip$")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007205}
7206
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007207func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007208 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007209 apex_set {
7210 name: "myapex",
7211 filename: "foo_v2.apex",
7212 sanitized: {
7213 none: { set: "myapex.apks", },
7214 hwaddress: { set: "myapex.hwasan.apks", },
7215 },
Paul Duffin24704672021-04-06 16:09:30 +01007216 }
7217 `
7218 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007219
Paul Duffin24704672021-04-06 16:09:30 +01007220 // Check that the extractor produces the correct output file from the correct input file.
7221 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007222
Paul Duffin24704672021-04-06 16:09:30 +01007223 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7224 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007225
Paul Duffin24704672021-04-06 16:09:30 +01007226 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7227
7228 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007229 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7230 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007231
7232 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007233}
7234
Paul Duffin89f570a2021-06-16 01:42:33 +01007235func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007236 t.Helper()
7237
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007238 bp := `
7239 java_library {
7240 name: "some-updatable-apex-lib",
7241 srcs: ["a.java"],
7242 sdk_version: "current",
7243 apex_available: [
7244 "some-updatable-apex",
7245 ],
satayevabcd5972021-08-06 17:49:46 +01007246 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007247 }
7248
7249 java_library {
7250 name: "some-non-updatable-apex-lib",
7251 srcs: ["a.java"],
7252 apex_available: [
7253 "some-non-updatable-apex",
7254 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007255 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007256 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007257 }
7258
7259 bootclasspath_fragment {
7260 name: "some-non-updatable-fragment",
7261 contents: ["some-non-updatable-apex-lib"],
7262 apex_available: [
7263 "some-non-updatable-apex",
7264 ],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007265 }
7266
7267 java_library {
7268 name: "some-platform-lib",
7269 srcs: ["a.java"],
7270 sdk_version: "current",
7271 installable: true,
7272 }
7273
7274 java_library {
7275 name: "some-art-lib",
7276 srcs: ["a.java"],
7277 sdk_version: "current",
7278 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007279 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007280 ],
7281 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007282 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007283 }
7284
7285 apex {
7286 name: "some-updatable-apex",
7287 key: "some-updatable-apex.key",
7288 java_libs: ["some-updatable-apex-lib"],
7289 updatable: true,
7290 min_sdk_version: "current",
7291 }
7292
7293 apex {
7294 name: "some-non-updatable-apex",
7295 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007296 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007297 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007298 }
7299
7300 apex_key {
7301 name: "some-updatable-apex.key",
7302 }
7303
7304 apex_key {
7305 name: "some-non-updatable-apex.key",
7306 }
7307
7308 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007309 name: "com.android.art.debug",
7310 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007311 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007312 updatable: true,
7313 min_sdk_version: "current",
7314 }
7315
Paul Duffinf23bc472021-04-27 12:42:20 +01007316 bootclasspath_fragment {
7317 name: "art-bootclasspath-fragment",
7318 image_name: "art",
7319 contents: ["some-art-lib"],
7320 apex_available: [
7321 "com.android.art.debug",
7322 ],
7323 }
7324
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007325 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007326 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007327 }
7328
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007329 filegroup {
7330 name: "some-updatable-apex-file_contexts",
7331 srcs: [
7332 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7333 ],
7334 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007335
7336 filegroup {
7337 name: "some-non-updatable-apex-file_contexts",
7338 srcs: [
7339 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7340 ],
7341 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007342 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007343
Paul Duffin89f570a2021-06-16 01:42:33 +01007344 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007345}
7346
Paul Duffin89f570a2021-06-16 01:42:33 +01007347func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007348 t.Helper()
7349
Paul Duffin55607122021-03-30 23:32:51 +01007350 fs := android.MockFS{
7351 "a.java": nil,
7352 "a.jar": nil,
7353 "apex_manifest.json": nil,
7354 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007355 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007356 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7357 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7358 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007359 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007360 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007361
Paul Duffin55607122021-03-30 23:32:51 +01007362 errorHandler := android.FixtureExpectsNoErrors
7363 if errmsg != "" {
7364 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007365 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007366
Paul Duffin55607122021-03-30 23:32:51 +01007367 result := android.GroupFixturePreparers(
7368 cc.PrepareForTestWithCcDefaultModules,
7369 java.PrepareForTestWithHiddenApiBuildComponents,
7370 java.PrepareForTestWithJavaDefaultModules,
7371 java.PrepareForTestWithJavaSdkLibraryFiles,
7372 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007373 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007374 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007375 android.FixtureModifyMockFS(func(fs android.MockFS) {
7376 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7377 insert := ""
7378 for _, fragment := range fragments {
7379 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7380 }
7381 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7382 platform_bootclasspath {
7383 name: "platform-bootclasspath",
7384 fragments: [
7385 %s
7386 ],
7387 }
7388 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007389 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007390 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007391 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007392 ).
7393 ExtendWithErrorHandler(errorHandler).
7394 RunTestWithBp(t, bp)
7395
7396 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007397}
7398
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007399func TestDuplicateDeapexeresFromPrebuiltApexes(t *testing.T) {
7400 preparers := android.GroupFixturePreparers(
7401 java.PrepareForTestWithJavaDefaultModules,
7402 PrepareForTestWithApexBuildComponents,
7403 ).
7404 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7405 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7406
7407 bpBase := `
7408 apex_set {
7409 name: "com.android.myapex",
7410 installable: true,
7411 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7412 set: "myapex.apks",
7413 }
7414
7415 apex_set {
7416 name: "com.mycompany.android.myapex",
7417 apex_name: "com.android.myapex",
7418 installable: true,
7419 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7420 set: "company-myapex.apks",
7421 }
7422
7423 prebuilt_bootclasspath_fragment {
7424 name: "my-bootclasspath-fragment",
7425 apex_available: ["com.android.myapex"],
7426 %s
7427 }
7428 `
7429
7430 t.Run("java_import", func(t *testing.T) {
7431 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7432 java_import {
7433 name: "libfoo",
7434 jars: ["libfoo.jar"],
7435 apex_available: ["com.android.myapex"],
7436 }
7437 `)
7438 })
7439
7440 t.Run("java_sdk_library_import", func(t *testing.T) {
7441 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7442 java_sdk_library_import {
7443 name: "libfoo",
7444 public: {
7445 jars: ["libbar.jar"],
7446 },
7447 apex_available: ["com.android.myapex"],
7448 }
7449 `)
7450 })
7451
7452 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7453 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7454 image_name: "art",
7455 contents: ["libfoo"],
7456 `)+`
7457 java_sdk_library_import {
7458 name: "libfoo",
7459 public: {
7460 jars: ["libbar.jar"],
7461 },
7462 apex_available: ["com.android.myapex"],
7463 }
7464 `)
7465 })
7466}
7467
Jooyung Han548640b2020-04-27 12:10:30 +09007468func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7469 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7470 apex {
7471 name: "myapex",
7472 key: "myapex.key",
7473 updatable: true,
7474 }
7475
7476 apex_key {
7477 name: "myapex.key",
7478 public_key: "testkey.avbpubkey",
7479 private_key: "testkey.pem",
7480 }
7481 `)
7482}
7483
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007484func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7485 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7486 apex {
7487 name: "myapex",
7488 key: "myapex.key",
7489 }
7490
7491 apex_key {
7492 name: "myapex.key",
7493 public_key: "testkey.avbpubkey",
7494 private_key: "testkey.pem",
7495 }
7496 `)
7497}
7498
Daniel Norman69109112021-12-02 12:52:42 -08007499func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7500 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7501 apex {
7502 name: "myapex",
7503 key: "myapex.key",
7504 updatable: true,
7505 soc_specific: true,
7506 }
7507
7508 apex_key {
7509 name: "myapex.key",
7510 public_key: "testkey.avbpubkey",
7511 private_key: "testkey.pem",
7512 }
7513 `)
7514}
7515
satayevb98371c2021-06-15 16:49:50 +01007516func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7517 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7518 apex {
7519 name: "myapex",
7520 key: "myapex.key",
7521 systemserverclasspath_fragments: [
7522 "mysystemserverclasspathfragment",
7523 ],
7524 min_sdk_version: "29",
7525 updatable: true,
7526 }
7527
7528 apex_key {
7529 name: "myapex.key",
7530 public_key: "testkey.avbpubkey",
7531 private_key: "testkey.pem",
7532 }
7533
7534 java_library {
7535 name: "foo",
7536 srcs: ["b.java"],
7537 min_sdk_version: "29",
7538 installable: true,
7539 apex_available: [
7540 "myapex",
7541 ],
7542 }
7543
7544 systemserverclasspath_fragment {
7545 name: "mysystemserverclasspathfragment",
7546 generate_classpaths_proto: false,
7547 contents: [
7548 "foo",
7549 ],
7550 apex_available: [
7551 "myapex",
7552 ],
7553 }
satayevabcd5972021-08-06 17:49:46 +01007554 `,
7555 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7556 )
satayevb98371c2021-06-15 16:49:50 +01007557}
7558
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007559func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007560 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7561 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7562 // modules to be included in the BootJars.
7563 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7564 return android.GroupFixturePreparers(
7565 dexpreopt.FixtureSetBootJars(bootJars...),
7566 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7567 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7568 }),
7569 )
7570 }
7571
7572 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7573 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7574 // specified in the ArtApexJars configuration.
7575 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7576 return android.GroupFixturePreparers(
7577 dexpreopt.FixtureSetArtBootJars(bootJars...),
7578 dexpreopt.FixtureSetBootJars(bootJars...),
7579 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7580 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7581 }),
7582 )
7583 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007584
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007585 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007586 preparer := android.GroupFixturePreparers(
7587 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7588 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7589 )
7590 fragments := []java.ApexVariantReference{
7591 {
7592 Apex: proptools.StringPtr("com.android.art.debug"),
7593 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7594 },
7595 {
7596 Apex: proptools.StringPtr("some-non-updatable-apex"),
7597 Module: proptools.StringPtr("some-non-updatable-fragment"),
7598 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007599 }
satayevabcd5972021-08-06 17:49:46 +01007600 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007601 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007602
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007603 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007604 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7605 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007606 preparer := android.GroupFixturePreparers(
7607 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7608 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7609 )
Paul Duffin60264a02021-04-12 20:02:36 +01007610 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007611 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007612
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007613 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 +01007614 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 +01007615 // Update the dexpreopt ArtApexJars directly.
7616 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7617 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007618 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007619
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007620 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 +01007621 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 +01007622 // Update the dexpreopt ArtApexJars directly.
7623 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7624 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007625 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007626
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007627 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 +01007628 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 +01007629 preparer := android.GroupFixturePreparers(
7630 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7631 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7632 )
Paul Duffin60264a02021-04-12 20:02:36 +01007633 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007634 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007635
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007636 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 +01007637 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007638 fragment := java.ApexVariantReference{
7639 Apex: proptools.StringPtr("some-non-updatable-apex"),
7640 Module: proptools.StringPtr("some-non-updatable-fragment"),
7641 }
7642 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007643 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007644
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007645 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007646 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007647 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
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("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007652 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007653 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7654 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007655 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007656
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007657 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007658 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007659 // Update the dexpreopt ArtApexJars directly.
7660 preparer := prepareSetArtJars("platform:some-platform-lib")
7661 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007662 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007663
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007664 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007665 preparer := android.GroupFixturePreparers(
7666 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7667 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7668 )
7669 fragments := []java.ApexVariantReference{
7670 {
7671 Apex: proptools.StringPtr("some-non-updatable-apex"),
7672 Module: proptools.StringPtr("some-non-updatable-fragment"),
7673 },
7674 }
7675 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007676 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007677}
7678
7679func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007680 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007681 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007682 fragment := java.ApexVariantReference{
7683 Apex: proptools.StringPtr("myapex"),
7684 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7685 }
7686
Paul Duffin064b70c2020-11-02 17:32:38 +00007687 testDexpreoptWithApexes(t, `
7688 prebuilt_apex {
7689 name: "myapex" ,
7690 arch: {
7691 arm64: {
7692 src: "myapex-arm64.apex",
7693 },
7694 arm: {
7695 src: "myapex-arm.apex",
7696 },
7697 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007698 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7699 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007700
Paul Duffin89f570a2021-06-16 01:42:33 +01007701 prebuilt_bootclasspath_fragment {
7702 name: "my-bootclasspath-fragment",
7703 contents: ["libfoo"],
7704 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007705 hidden_api: {
7706 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7707 metadata: "my-bootclasspath-fragment/metadata.csv",
7708 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007709 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7710 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7711 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007712 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007713 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007714
Paul Duffin89f570a2021-06-16 01:42:33 +01007715 java_import {
7716 name: "libfoo",
7717 jars: ["libfoo.jar"],
7718 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007719 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007720 }
7721 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007722 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007723}
7724
Spandan Dasf14e2542021-11-12 00:01:37 +00007725func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007726 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007727 bp += `
7728 apex_key {
7729 name: "myapex.key",
7730 public_key: "testkey.avbpubkey",
7731 private_key: "testkey.pem",
7732 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007733 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007734 "lib1/src/A.java": nil,
7735 "lib2/src/B.java": nil,
7736 "system/sepolicy/apex/myapex-file_contexts": nil,
7737 }
7738
Paul Duffin45338f02021-03-30 23:07:52 +01007739 errorHandler := android.FixtureExpectsNoErrors
7740 if errmsg != "" {
7741 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007742 }
Colin Crossae8600b2020-10-29 17:09:13 -07007743
Paul Duffin45338f02021-03-30 23:07:52 +01007744 android.GroupFixturePreparers(
7745 android.PrepareForTestWithAndroidBuildComponents,
7746 java.PrepareForTestWithJavaBuildComponents,
7747 PrepareForTestWithApexBuildComponents,
7748 android.PrepareForTestWithNeverallowRules(rules),
7749 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007750 apexBootJars := make([]string, 0, len(bootJars))
7751 for _, apexBootJar := range bootJars {
7752 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007753 }
satayevd604b212021-07-21 14:23:52 +01007754 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007755 }),
7756 fs.AddToFixture(),
7757 ).
7758 ExtendWithErrorHandler(errorHandler).
7759 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007760}
7761
7762func TestApexPermittedPackagesRules(t *testing.T) {
7763 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00007764 name string
7765 expectedError string
7766 bp string
7767 bootJars []string
7768 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01007769 }{
7770
7771 {
7772 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7773 expectedError: "",
7774 bp: `
7775 java_library {
7776 name: "bcp_lib1",
7777 srcs: ["lib1/src/*.java"],
7778 permitted_packages: ["foo.bar"],
7779 apex_available: ["myapex"],
7780 sdk_version: "none",
7781 system_modules: "none",
7782 }
7783 java_library {
7784 name: "nonbcp_lib2",
7785 srcs: ["lib2/src/*.java"],
7786 apex_available: ["myapex"],
7787 permitted_packages: ["a.b"],
7788 sdk_version: "none",
7789 system_modules: "none",
7790 }
7791 apex {
7792 name: "myapex",
7793 key: "myapex.key",
7794 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007795 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007796 }`,
7797 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007798 bcpPermittedPackages: map[string][]string{
7799 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007800 "foo.bar",
7801 },
7802 },
7803 },
7804 {
Anton Hanssone1b18362021-12-23 15:05:38 +00007805 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00007806 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 +01007807 bp: `
7808 java_library {
7809 name: "bcp_lib1",
7810 srcs: ["lib1/src/*.java"],
7811 apex_available: ["myapex"],
7812 permitted_packages: ["foo.bar"],
7813 sdk_version: "none",
7814 system_modules: "none",
7815 }
7816 java_library {
7817 name: "bcp_lib2",
7818 srcs: ["lib2/src/*.java"],
7819 apex_available: ["myapex"],
7820 permitted_packages: ["foo.bar", "bar.baz"],
7821 sdk_version: "none",
7822 system_modules: "none",
7823 }
7824 apex {
7825 name: "myapex",
7826 key: "myapex.key",
7827 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007828 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007829 }
7830 `,
7831 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007832 bcpPermittedPackages: map[string][]string{
7833 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007834 "foo.bar",
7835 },
Spandan Dasf14e2542021-11-12 00:01:37 +00007836 "bcp_lib2": []string{
7837 "foo.bar",
7838 },
7839 },
7840 },
7841 {
7842 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
7843 expectedError: "",
7844 bp: `
7845 java_library {
7846 name: "bcp_lib_restricted",
7847 srcs: ["lib1/src/*.java"],
7848 apex_available: ["myapex"],
7849 permitted_packages: ["foo.bar"],
7850 sdk_version: "none",
7851 min_sdk_version: "29",
7852 system_modules: "none",
7853 }
7854 java_library {
7855 name: "bcp_lib_unrestricted",
7856 srcs: ["lib2/src/*.java"],
7857 apex_available: ["myapex"],
7858 permitted_packages: ["foo.bar", "bar.baz"],
7859 sdk_version: "none",
7860 min_sdk_version: "29",
7861 system_modules: "none",
7862 }
7863 apex {
7864 name: "myapex",
7865 key: "myapex.key",
7866 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
7867 updatable: true,
7868 min_sdk_version: "29",
7869 }
7870 `,
7871 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7872 bcpPermittedPackages: map[string][]string{
7873 "bcp_lib1_non_updateable": []string{
7874 "foo.bar",
7875 },
7876 // 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 +01007877 },
7878 },
7879 }
7880 for _, tc := range testcases {
7881 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00007882 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
7883 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01007884 })
7885 }
7886}
7887
Jiyong Park62304bb2020-04-13 16:19:48 +09007888func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007889 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09007890 apex {
7891 name: "myapex",
7892 key: "myapex.key",
7893 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007894 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09007895 }
7896
7897 apex_key {
7898 name: "myapex.key",
7899 public_key: "testkey.avbpubkey",
7900 private_key: "testkey.pem",
7901 }
7902
7903 cc_library {
7904 name: "mylib",
7905 srcs: ["mylib.cpp"],
7906 system_shared_libs: [],
7907 stl: "none",
7908 stubs: {
7909 versions: ["1"],
7910 },
7911 apex_available: ["myapex"],
7912 }
7913
7914 cc_library {
7915 name: "myprivlib",
7916 srcs: ["mylib.cpp"],
7917 system_shared_libs: [],
7918 stl: "none",
7919 apex_available: ["myapex"],
7920 }
7921
7922
7923 cc_test {
7924 name: "mytest",
7925 gtest: false,
7926 srcs: ["mylib.cpp"],
7927 system_shared_libs: [],
7928 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09007929 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09007930 test_for: ["myapex"]
7931 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007932
7933 cc_library {
7934 name: "mytestlib",
7935 srcs: ["mylib.cpp"],
7936 system_shared_libs: [],
7937 shared_libs: ["mylib", "myprivlib"],
7938 stl: "none",
7939 test_for: ["myapex"],
7940 }
7941
7942 cc_benchmark {
7943 name: "mybench",
7944 srcs: ["mylib.cpp"],
7945 system_shared_libs: [],
7946 shared_libs: ["mylib", "myprivlib"],
7947 stl: "none",
7948 test_for: ["myapex"],
7949 }
Jiyong Park62304bb2020-04-13 16:19:48 +09007950 `)
7951
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007952 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007953 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007954 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7955 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7956 }
7957
7958 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09007959 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007960 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7961 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7962 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7963}
Jiyong Park46a512f2020-12-04 18:02:13 +09007964
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007965func TestIndirectTestFor(t *testing.T) {
7966 ctx := testApex(t, `
7967 apex {
7968 name: "myapex",
7969 key: "myapex.key",
7970 native_shared_libs: ["mylib", "myprivlib"],
7971 updatable: false,
7972 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007973
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007974 apex_key {
7975 name: "myapex.key",
7976 public_key: "testkey.avbpubkey",
7977 private_key: "testkey.pem",
7978 }
7979
7980 cc_library {
7981 name: "mylib",
7982 srcs: ["mylib.cpp"],
7983 system_shared_libs: [],
7984 stl: "none",
7985 stubs: {
7986 versions: ["1"],
7987 },
7988 apex_available: ["myapex"],
7989 }
7990
7991 cc_library {
7992 name: "myprivlib",
7993 srcs: ["mylib.cpp"],
7994 system_shared_libs: [],
7995 stl: "none",
7996 shared_libs: ["mylib"],
7997 apex_available: ["myapex"],
7998 }
7999
8000 cc_library {
8001 name: "mytestlib",
8002 srcs: ["mylib.cpp"],
8003 system_shared_libs: [],
8004 shared_libs: ["myprivlib"],
8005 stl: "none",
8006 test_for: ["myapex"],
8007 }
8008 `)
8009
8010 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008011 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008012 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8013 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8014 }
8015
8016 // The platform variant of mytestlib links to the platform variant of the
8017 // internal myprivlib.
8018 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8019
8020 // The platform variant of myprivlib links to the platform variant of mylib
8021 // and bypasses its stubs.
8022 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 +09008023}
8024
Martin Stjernholmec009002021-03-27 15:18:31 +00008025func TestTestForForLibInOtherApex(t *testing.T) {
8026 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8027 _ = testApex(t, `
8028 apex {
8029 name: "com.android.art",
8030 key: "myapex.key",
8031 native_shared_libs: ["mylib"],
8032 updatable: false,
8033 }
8034
8035 apex {
8036 name: "com.android.art.debug",
8037 key: "myapex.key",
8038 native_shared_libs: ["mylib", "mytestlib"],
8039 updatable: false,
8040 }
8041
8042 apex_key {
8043 name: "myapex.key",
8044 public_key: "testkey.avbpubkey",
8045 private_key: "testkey.pem",
8046 }
8047
8048 cc_library {
8049 name: "mylib",
8050 srcs: ["mylib.cpp"],
8051 system_shared_libs: [],
8052 stl: "none",
8053 stubs: {
8054 versions: ["1"],
8055 },
8056 apex_available: ["com.android.art", "com.android.art.debug"],
8057 }
8058
8059 cc_library {
8060 name: "mytestlib",
8061 srcs: ["mylib.cpp"],
8062 system_shared_libs: [],
8063 shared_libs: ["mylib"],
8064 stl: "none",
8065 apex_available: ["com.android.art.debug"],
8066 test_for: ["com.android.art"],
8067 }
8068 `,
8069 android.MockFS{
8070 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8071 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8072 }.AddToFixture())
8073}
8074
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008075// TODO(jungjw): Move this to proptools
8076func intPtr(i int) *int {
8077 return &i
8078}
8079
8080func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008081 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008082 apex_set {
8083 name: "myapex",
8084 set: "myapex.apks",
8085 filename: "foo_v2.apex",
8086 overrides: ["foo"],
8087 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008088 `,
8089 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8090 variables.Platform_sdk_version = intPtr(30)
8091 }),
8092 android.FixtureModifyConfig(func(config android.Config) {
8093 config.Targets[android.Android] = []android.Target{
8094 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8095 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8096 }
8097 }),
8098 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008099
Paul Duffin24704672021-04-06 16:09:30 +01008100 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008101
8102 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008103 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008104 actual := extractedApex.Args["abis"]
8105 expected := "ARMEABI_V7A,ARM64_V8A"
8106 if actual != expected {
8107 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8108 }
8109 actual = extractedApex.Args["sdk-version"]
8110 expected = "30"
8111 if actual != expected {
8112 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8113 }
8114
Paul Duffin6717d882021-06-15 19:09:41 +01008115 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008116 a := m.Module().(*ApexSet)
8117 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008118 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008119 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8120 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8121 }
8122}
8123
Jiyong Park7d95a512020-05-10 15:16:24 +09008124func TestNoStaticLinkingToStubsLib(t *testing.T) {
8125 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8126 apex {
8127 name: "myapex",
8128 key: "myapex.key",
8129 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008130 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008131 }
8132
8133 apex_key {
8134 name: "myapex.key",
8135 public_key: "testkey.avbpubkey",
8136 private_key: "testkey.pem",
8137 }
8138
8139 cc_library {
8140 name: "mylib",
8141 srcs: ["mylib.cpp"],
8142 static_libs: ["otherlib"],
8143 system_shared_libs: [],
8144 stl: "none",
8145 apex_available: [ "myapex" ],
8146 }
8147
8148 cc_library {
8149 name: "otherlib",
8150 srcs: ["mylib.cpp"],
8151 system_shared_libs: [],
8152 stl: "none",
8153 stubs: {
8154 versions: ["1", "2", "3"],
8155 },
8156 apex_available: [ "myapex" ],
8157 }
8158 `)
8159}
8160
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008161func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008162 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008163 apex {
8164 name: "myapex",
8165 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008166 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008167 custom_sign_tool: "sign_myapex",
8168 }
8169
8170 apex_key {
8171 name: "myapex.key",
8172 public_key: "testkey.avbpubkey",
8173 private_key: "testkey.pem",
8174 }
8175 `)
8176
8177 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8178 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8179 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"`)
8180}
8181
8182func TestApexKeysTxtOverrides(t *testing.T) {
8183 ctx := testApex(t, `
8184 apex {
8185 name: "myapex",
8186 key: "myapex.key",
8187 updatable: false,
8188 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008189 }
8190
8191 apex_key {
8192 name: "myapex.key",
8193 public_key: "testkey.avbpubkey",
8194 private_key: "testkey.pem",
8195 }
8196
8197 prebuilt_apex {
8198 name: "myapex",
8199 prefer: true,
8200 arch: {
8201 arm64: {
8202 src: "myapex-arm64.apex",
8203 },
8204 arm: {
8205 src: "myapex-arm.apex",
8206 },
8207 },
8208 }
8209
8210 apex_set {
8211 name: "myapex_set",
8212 set: "myapex.apks",
8213 filename: "myapex_set.apex",
8214 overrides: ["myapex"],
8215 }
8216 `)
8217
8218 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8219 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8220 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 +09008221 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 +09008222}
8223
Jooyung Han938b5932020-06-20 12:47:47 +09008224func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008225 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008226 apex {
8227 name: "myapex",
8228 key: "myapex.key",
8229 apps: ["app"],
8230 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008231 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008232 }
8233
8234 apex_key {
8235 name: "myapex.key",
8236 public_key: "testkey.avbpubkey",
8237 private_key: "testkey.pem",
8238 }
8239
8240 android_app {
8241 name: "app",
8242 srcs: ["foo/bar/MyClass.java"],
8243 package_name: "foo",
8244 sdk_version: "none",
8245 system_modules: "none",
8246 apex_available: [ "myapex" ],
8247 }
8248 `, withFiles(map[string][]byte{
8249 "sub/Android.bp": []byte(`
8250 override_apex {
8251 name: "override_myapex",
8252 base: "myapex",
8253 apps: ["override_app"],
8254 allowed_files: ":allowed",
8255 }
8256 // Overridable "path" property should be referenced indirectly
8257 filegroup {
8258 name: "allowed",
8259 srcs: ["allowed.txt"],
8260 }
8261 override_android_app {
8262 name: "override_app",
8263 base: "app",
8264 package_name: "bar",
8265 }
8266 `),
8267 }))
8268
8269 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8270 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8271 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8272 }
8273
8274 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8275 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8276 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8277 }
8278}
8279
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008280func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008281 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008282 apex {
8283 name: "myapex",
8284 key: "myapex.key",
8285 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008286 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008287 }
8288
8289 apex_key {
8290 name: "myapex.key",
8291 public_key: "testkey.avbpubkey",
8292 private_key: "testkey.pem",
8293 }
8294
8295 cc_library {
8296 name: "mylib",
8297 srcs: ["mylib.cpp"],
8298 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008299 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008300 },
8301 apex_available: ["myapex"],
8302 }
8303
8304 cc_prebuilt_library_shared {
8305 name: "mylib",
8306 prefer: false,
8307 srcs: ["prebuilt.so"],
8308 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008309 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008310 },
8311 apex_available: ["myapex"],
8312 }
8313 `)
8314}
8315
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008316func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008317 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008318 apex {
8319 name: "myapex",
8320 key: "myapex.key",
8321 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008322 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008323 }
8324 apex_key {
8325 name: "myapex.key",
8326 public_key: "testkey.avbpubkey",
8327 private_key: "testkey.pem",
8328 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008329 `,
8330 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8331 variables.CompressedApex = proptools.BoolPtr(true)
8332 }),
8333 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008334
8335 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8336 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8337
8338 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8339 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8340
8341 // Make sure output of bundle is .capex
8342 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8343 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8344
8345 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008346 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008347 var builder strings.Builder
8348 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8349 androidMk := builder.String()
8350 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8351}
8352
Martin Stjernholm2856c662020-12-02 15:03:42 +00008353func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008354 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008355 apex {
8356 name: "myapex",
8357 key: "myapex.key",
8358 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008359 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008360 }
8361
8362 apex_key {
8363 name: "myapex.key",
8364 public_key: "testkey.avbpubkey",
8365 private_key: "testkey.pem",
8366 }
8367
8368 cc_library {
8369 name: "mylib",
8370 srcs: ["mylib.cpp"],
8371 apex_available: ["myapex"],
8372 shared_libs: ["otherlib"],
8373 system_shared_libs: [],
8374 }
8375
8376 cc_library {
8377 name: "otherlib",
8378 srcs: ["mylib.cpp"],
8379 stubs: {
8380 versions: ["current"],
8381 },
8382 }
8383
8384 cc_prebuilt_library_shared {
8385 name: "otherlib",
8386 prefer: true,
8387 srcs: ["prebuilt.so"],
8388 stubs: {
8389 versions: ["current"],
8390 },
8391 }
8392 `)
8393
8394 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008395 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008396 var builder strings.Builder
8397 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8398 androidMk := builder.String()
8399
8400 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8401 // a thing there.
8402 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8403}
8404
Jiyong Parke3867542020-12-03 17:28:25 +09008405func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008406 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008407 apex {
8408 name: "myapex",
8409 key: "myapex.key",
8410 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008411 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008412 }
8413
8414 apex_key {
8415 name: "myapex.key",
8416 public_key: "testkey.avbpubkey",
8417 private_key: "testkey.pem",
8418 }
8419
8420 cc_library {
8421 name: "mylib",
8422 srcs: ["mylib.cpp"],
8423 system_shared_libs: [],
8424 stl: "none",
8425 apex_available: ["myapex"],
8426 shared_libs: ["mylib2"],
8427 target: {
8428 apex: {
8429 exclude_shared_libs: ["mylib2"],
8430 },
8431 },
8432 }
8433
8434 cc_library {
8435 name: "mylib2",
8436 srcs: ["mylib.cpp"],
8437 system_shared_libs: [],
8438 stl: "none",
8439 }
8440 `)
8441
8442 // Check if mylib is linked to mylib2 for the non-apex target
8443 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8444 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8445
8446 // Make sure that the link doesn't occur for the apex target
8447 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8448 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8449
8450 // It shouldn't appear in the copy cmd as well.
8451 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8452 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8453}
8454
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008455func TestPrebuiltStubLibDep(t *testing.T) {
8456 bpBase := `
8457 apex {
8458 name: "myapex",
8459 key: "myapex.key",
8460 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008461 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008462 }
8463 apex_key {
8464 name: "myapex.key",
8465 public_key: "testkey.avbpubkey",
8466 private_key: "testkey.pem",
8467 }
8468 cc_library {
8469 name: "mylib",
8470 srcs: ["mylib.cpp"],
8471 apex_available: ["myapex"],
8472 shared_libs: ["stublib"],
8473 system_shared_libs: [],
8474 }
8475 apex {
8476 name: "otherapex",
8477 enabled: %s,
8478 key: "myapex.key",
8479 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008480 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008481 }
8482 `
8483
8484 stublibSourceBp := `
8485 cc_library {
8486 name: "stublib",
8487 srcs: ["mylib.cpp"],
8488 apex_available: ["otherapex"],
8489 system_shared_libs: [],
8490 stl: "none",
8491 stubs: {
8492 versions: ["1"],
8493 },
8494 }
8495 `
8496
8497 stublibPrebuiltBp := `
8498 cc_prebuilt_library_shared {
8499 name: "stublib",
8500 srcs: ["prebuilt.so"],
8501 apex_available: ["otherapex"],
8502 stubs: {
8503 versions: ["1"],
8504 },
8505 %s
8506 }
8507 `
8508
8509 tests := []struct {
8510 name string
8511 stublibBp string
8512 usePrebuilt bool
8513 modNames []string // Modules to collect AndroidMkEntries for
8514 otherApexEnabled []string
8515 }{
8516 {
8517 name: "only_source",
8518 stublibBp: stublibSourceBp,
8519 usePrebuilt: false,
8520 modNames: []string{"stublib"},
8521 otherApexEnabled: []string{"true", "false"},
8522 },
8523 {
8524 name: "source_preferred",
8525 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8526 usePrebuilt: false,
8527 modNames: []string{"stublib", "prebuilt_stublib"},
8528 otherApexEnabled: []string{"true", "false"},
8529 },
8530 {
8531 name: "prebuilt_preferred",
8532 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8533 usePrebuilt: true,
8534 modNames: []string{"stublib", "prebuilt_stublib"},
8535 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8536 },
8537 {
8538 name: "only_prebuilt",
8539 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8540 usePrebuilt: true,
8541 modNames: []string{"stublib"},
8542 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8543 },
8544 }
8545
8546 for _, test := range tests {
8547 t.Run(test.name, func(t *testing.T) {
8548 for _, otherApexEnabled := range test.otherApexEnabled {
8549 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008550 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008551
8552 type modAndMkEntries struct {
8553 mod *cc.Module
8554 mkEntries android.AndroidMkEntries
8555 }
8556 entries := []*modAndMkEntries{}
8557
8558 // Gather shared lib modules that are installable
8559 for _, modName := range test.modNames {
8560 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8561 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8562 continue
8563 }
8564 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008565 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008566 continue
8567 }
Colin Crossaa255532020-07-03 13:18:24 -07008568 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008569 if ent.Disabled {
8570 continue
8571 }
8572 entries = append(entries, &modAndMkEntries{
8573 mod: mod,
8574 mkEntries: ent,
8575 })
8576 }
8577 }
8578 }
8579
8580 var entry *modAndMkEntries = nil
8581 for _, ent := range entries {
8582 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8583 if entry != nil {
8584 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8585 } else {
8586 entry = ent
8587 }
8588 }
8589 }
8590
8591 if entry == nil {
8592 t.Errorf("AndroidMk entry for \"stublib\" missing")
8593 } else {
8594 isPrebuilt := entry.mod.Prebuilt() != nil
8595 if isPrebuilt != test.usePrebuilt {
8596 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8597 }
8598 if !entry.mod.IsStubs() {
8599 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8600 }
8601 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8602 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8603 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008604 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008605 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008606 if !android.InList(expected, cflags) {
8607 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8608 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008609 }
8610 })
8611 }
8612 })
8613 }
8614}
8615
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008616func TestHostApexInHostOnlyBuild(t *testing.T) {
8617 testApex(t, `
8618 apex {
8619 name: "myapex",
8620 host_supported: true,
8621 key: "myapex.key",
8622 updatable: false,
8623 payload_type: "zip",
8624 }
8625 apex_key {
8626 name: "myapex.key",
8627 public_key: "testkey.avbpubkey",
8628 private_key: "testkey.pem",
8629 }
8630 `,
8631 android.FixtureModifyConfig(func(config android.Config) {
8632 // We may not have device targets in all builds, e.g. in
8633 // prebuilts/build-tools/build-prebuilts.sh
8634 config.Targets[android.Android] = []android.Target{}
8635 }))
8636}
8637
Colin Crossc33e5212021-05-25 18:16:02 -07008638func TestApexJavaCoverage(t *testing.T) {
8639 bp := `
8640 apex {
8641 name: "myapex",
8642 key: "myapex.key",
8643 java_libs: ["mylib"],
8644 bootclasspath_fragments: ["mybootclasspathfragment"],
8645 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8646 updatable: false,
8647 }
8648
8649 apex_key {
8650 name: "myapex.key",
8651 public_key: "testkey.avbpubkey",
8652 private_key: "testkey.pem",
8653 }
8654
8655 java_library {
8656 name: "mylib",
8657 srcs: ["mylib.java"],
8658 apex_available: ["myapex"],
8659 compile_dex: true,
8660 }
8661
8662 bootclasspath_fragment {
8663 name: "mybootclasspathfragment",
8664 contents: ["mybootclasspathlib"],
8665 apex_available: ["myapex"],
8666 }
8667
8668 java_library {
8669 name: "mybootclasspathlib",
8670 srcs: ["mybootclasspathlib.java"],
8671 apex_available: ["myapex"],
8672 compile_dex: true,
8673 }
8674
8675 systemserverclasspath_fragment {
8676 name: "mysystemserverclasspathfragment",
8677 contents: ["mysystemserverclasspathlib"],
8678 apex_available: ["myapex"],
8679 }
8680
8681 java_library {
8682 name: "mysystemserverclasspathlib",
8683 srcs: ["mysystemserverclasspathlib.java"],
8684 apex_available: ["myapex"],
8685 compile_dex: true,
8686 }
8687 `
8688
8689 result := android.GroupFixturePreparers(
8690 PrepareForTestWithApexBuildComponents,
8691 prepareForTestWithMyapex,
8692 java.PrepareForTestWithJavaDefaultModules,
8693 android.PrepareForTestWithAndroidBuildComponents,
8694 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008695 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8696 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008697 android.FixtureMergeEnv(map[string]string{
8698 "EMMA_INSTRUMENT": "true",
8699 }),
8700 ).RunTest(t)
8701
8702 // Make sure jacoco ran on both mylib and mybootclasspathlib
8703 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8704 t.Errorf("Failed to find jacoco rule for mylib")
8705 }
8706 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8707 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8708 }
8709 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8710 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8711 }
8712}
8713
Jiyong Park192600a2021-08-03 07:52:17 +00008714func TestProhibitStaticExecutable(t *testing.T) {
8715 testApexError(t, `executable mybin is static`, `
8716 apex {
8717 name: "myapex",
8718 key: "myapex.key",
8719 binaries: ["mybin"],
8720 min_sdk_version: "29",
8721 }
8722
8723 apex_key {
8724 name: "myapex.key",
8725 public_key: "testkey.avbpubkey",
8726 private_key: "testkey.pem",
8727 }
8728
8729 cc_binary {
8730 name: "mybin",
8731 srcs: ["mylib.cpp"],
8732 relative_install_path: "foo/bar",
8733 static_executable: true,
8734 system_shared_libs: [],
8735 stl: "none",
8736 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008737 min_sdk_version: "29",
8738 }
8739 `)
8740
8741 testApexError(t, `executable mybin.rust is static`, `
8742 apex {
8743 name: "myapex",
8744 key: "myapex.key",
8745 binaries: ["mybin.rust"],
8746 min_sdk_version: "29",
8747 }
8748
8749 apex_key {
8750 name: "myapex.key",
8751 public_key: "testkey.avbpubkey",
8752 private_key: "testkey.pem",
8753 }
8754
8755 rust_binary {
8756 name: "mybin.rust",
8757 srcs: ["foo.rs"],
8758 static_executable: true,
8759 apex_available: ["myapex"],
8760 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008761 }
8762 `)
8763}
8764
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008765func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8766 ctx := testApex(t, `
8767 apex {
8768 name: "myapex",
8769 key: "myapex.key",
8770 updatable: false,
8771 java_libs: ["foo"],
8772 }
8773
8774 apex_key {
8775 name: "myapex.key",
8776 public_key: "testkey.avbpubkey",
8777 private_key: "testkey.pem",
8778 }
8779
8780 java_library {
8781 name: "foo",
8782 srcs: ["foo.java"],
8783 apex_available: ["myapex"],
8784 installable: true,
8785 }
8786 `,
8787 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8788 )
8789
8790 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8791 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8792 var builder strings.Builder
8793 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8794 androidMk := builder.String()
8795 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")
8796}
8797
8798func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8799 ctx := testApex(t, `
8800 prebuilt_apex {
8801 name: "myapex",
8802 arch: {
8803 arm64: {
8804 src: "myapex-arm64.apex",
8805 },
8806 arm: {
8807 src: "myapex-arm.apex",
8808 },
8809 },
8810 exported_java_libs: ["foo"],
8811 }
8812
8813 java_import {
8814 name: "foo",
8815 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008816 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008817 }
8818 `,
8819 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8820 )
8821
8822 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8823 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8824 mainModuleEntries := entriesList[0]
8825 android.AssertArrayString(t,
8826 "LOCAL_REQUIRED_MODULES",
8827 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8828 []string{
8829 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8830 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8831 })
8832}
8833
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008834func TestAndroidMk_RequiredModules(t *testing.T) {
8835 ctx := testApex(t, `
8836 apex {
8837 name: "myapex",
8838 key: "myapex.key",
8839 updatable: false,
8840 java_libs: ["foo"],
8841 required: ["otherapex"],
8842 }
8843
8844 apex {
8845 name: "otherapex",
8846 key: "myapex.key",
8847 updatable: false,
8848 java_libs: ["foo"],
8849 required: ["otherapex"],
8850 }
8851
8852 apex_key {
8853 name: "myapex.key",
8854 public_key: "testkey.avbpubkey",
8855 private_key: "testkey.pem",
8856 }
8857
8858 java_library {
8859 name: "foo",
8860 srcs: ["foo.java"],
8861 apex_available: ["myapex", "otherapex"],
8862 installable: true,
8863 }
8864 `)
8865
8866 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8867 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8868 var builder strings.Builder
8869 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8870 androidMk := builder.String()
8871 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
8872}
8873
Jiakai Zhangd70dff72022-02-24 15:06:05 +00008874func TestAndroidMk_RequiredDeps(t *testing.T) {
8875 ctx := testApex(t, `
8876 apex {
8877 name: "myapex",
8878 key: "myapex.key",
8879 updatable: false,
8880 }
8881
8882 apex_key {
8883 name: "myapex.key",
8884 public_key: "testkey.avbpubkey",
8885 private_key: "testkey.pem",
8886 }
8887 `)
8888
8889 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8890 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
8891 data := android.AndroidMkDataForTest(t, ctx, bundle)
8892 var builder strings.Builder
8893 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
8894 androidMk := builder.String()
8895 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
8896
8897 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
8898 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
8899 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
8900 var flattenedBuilder strings.Builder
8901 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
8902 flattenedAndroidMk := flattenedBuilder.String()
8903 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
8904}
8905
Jooyung Hana6d36672022-02-24 13:58:07 +09008906func TestApexOutputFileProducer(t *testing.T) {
8907 for _, tc := range []struct {
8908 name string
8909 ref string
8910 expected_data []string
8911 }{
8912 {
8913 name: "test_using_output",
8914 ref: ":myapex",
8915 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
8916 },
8917 {
8918 name: "test_using_apex",
8919 ref: ":myapex{.apex}",
8920 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
8921 },
8922 } {
8923 t.Run(tc.name, func(t *testing.T) {
8924 ctx := testApex(t, `
8925 apex {
8926 name: "myapex",
8927 key: "myapex.key",
8928 compressible: true,
8929 updatable: false,
8930 }
8931
8932 apex_key {
8933 name: "myapex.key",
8934 public_key: "testkey.avbpubkey",
8935 private_key: "testkey.pem",
8936 }
8937
8938 java_test {
8939 name: "`+tc.name+`",
8940 srcs: ["a.java"],
8941 data: ["`+tc.ref+`"],
8942 }
8943 `,
8944 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8945 variables.CompressedApex = proptools.BoolPtr(true)
8946 }))
8947 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
8948 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
8949 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
8950 })
8951 }
8952}
8953
satayev758968a2021-12-06 11:42:40 +00008954func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
8955 preparer := android.GroupFixturePreparers(
8956 PrepareForTestWithApexBuildComponents,
8957 prepareForTestWithMyapex,
8958 java.PrepareForTestWithJavaSdkLibraryFiles,
8959 java.PrepareForTestWithJavaDefaultModules,
8960 android.PrepareForTestWithAndroidBuildComponents,
8961 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8962 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
8963 )
8964
8965 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
8966 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8967 preparer.RunTestWithBp(t, `
8968 apex {
8969 name: "myapex",
8970 key: "myapex.key",
8971 bootclasspath_fragments: ["mybootclasspathfragment"],
8972 min_sdk_version: "30",
8973 updatable: false,
8974 }
8975
8976 apex_key {
8977 name: "myapex.key",
8978 public_key: "testkey.avbpubkey",
8979 private_key: "testkey.pem",
8980 }
8981
8982 bootclasspath_fragment {
8983 name: "mybootclasspathfragment",
8984 contents: ["mybootclasspathlib"],
8985 apex_available: ["myapex"],
8986 }
8987
8988 java_sdk_library {
8989 name: "mybootclasspathlib",
8990 srcs: ["mybootclasspathlib.java"],
8991 apex_available: ["myapex"],
8992 compile_dex: true,
8993 unsafe_ignore_missing_latest_api: true,
8994 min_sdk_version: "31",
8995 static_libs: ["util"],
8996 }
8997
8998 java_library {
8999 name: "util",
9000 srcs: ["a.java"],
9001 apex_available: ["myapex"],
9002 min_sdk_version: "31",
9003 static_libs: ["another_util"],
9004 }
9005
9006 java_library {
9007 name: "another_util",
9008 srcs: ["a.java"],
9009 min_sdk_version: "31",
9010 apex_available: ["myapex"],
9011 }
9012 `)
9013 })
9014
9015 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9016 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9017 preparer.RunTestWithBp(t, `
9018 apex {
9019 name: "myapex",
9020 key: "myapex.key",
9021 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9022 min_sdk_version: "30",
9023 updatable: false,
9024 }
9025
9026 apex_key {
9027 name: "myapex.key",
9028 public_key: "testkey.avbpubkey",
9029 private_key: "testkey.pem",
9030 }
9031
9032 systemserverclasspath_fragment {
9033 name: "mysystemserverclasspathfragment",
9034 contents: ["mysystemserverclasspathlib"],
9035 apex_available: ["myapex"],
9036 }
9037
9038 java_sdk_library {
9039 name: "mysystemserverclasspathlib",
9040 srcs: ["mysystemserverclasspathlib.java"],
9041 apex_available: ["myapex"],
9042 compile_dex: true,
9043 min_sdk_version: "32",
9044 unsafe_ignore_missing_latest_api: true,
9045 static_libs: ["util"],
9046 }
9047
9048 java_library {
9049 name: "util",
9050 srcs: ["a.java"],
9051 apex_available: ["myapex"],
9052 min_sdk_version: "31",
9053 static_libs: ["another_util"],
9054 }
9055
9056 java_library {
9057 name: "another_util",
9058 srcs: ["a.java"],
9059 min_sdk_version: "31",
9060 apex_available: ["myapex"],
9061 }
9062 `)
9063 })
9064
9065 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9066 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9067 RunTestWithBp(t, `
9068 apex {
9069 name: "myapex",
9070 key: "myapex.key",
9071 bootclasspath_fragments: ["mybootclasspathfragment"],
9072 min_sdk_version: "30",
9073 updatable: false,
9074 }
9075
9076 apex_key {
9077 name: "myapex.key",
9078 public_key: "testkey.avbpubkey",
9079 private_key: "testkey.pem",
9080 }
9081
9082 bootclasspath_fragment {
9083 name: "mybootclasspathfragment",
9084 contents: ["mybootclasspathlib"],
9085 apex_available: ["myapex"],
9086 }
9087
9088 java_sdk_library {
9089 name: "mybootclasspathlib",
9090 srcs: ["mybootclasspathlib.java"],
9091 apex_available: ["myapex"],
9092 compile_dex: true,
9093 unsafe_ignore_missing_latest_api: true,
9094 }
9095 `)
9096 })
9097
9098 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9099 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9100 RunTestWithBp(t, `
9101 apex {
9102 name: "myapex",
9103 key: "myapex.key",
9104 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9105 min_sdk_version: "30",
9106 updatable: false,
9107 }
9108
9109 apex_key {
9110 name: "myapex.key",
9111 public_key: "testkey.avbpubkey",
9112 private_key: "testkey.pem",
9113 }
9114
9115 systemserverclasspath_fragment {
9116 name: "mysystemserverclasspathfragment",
9117 contents: ["mysystemserverclasspathlib"],
9118 apex_available: ["myapex"],
9119 }
9120
9121 java_sdk_library {
9122 name: "mysystemserverclasspathlib",
9123 srcs: ["mysystemserverclasspathlib.java"],
9124 apex_available: ["myapex"],
9125 compile_dex: true,
9126 unsafe_ignore_missing_latest_api: true,
9127 }
9128 `)
9129 })
9130}
9131
Jiakai Zhang6decef92022-01-12 17:56:19 +00009132// Verifies that the APEX depends on all the Make modules in the list.
9133func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9134 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9135 for _, dep := range deps {
9136 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9137 }
9138}
9139
9140// Verifies that the APEX does not depend on any of the Make modules in the list.
9141func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9142 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9143 for _, dep := range deps {
9144 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9145 }
9146}
9147
Spandan Das66773252022-01-15 00:23:18 +00009148func TestApexStrictUpdtabilityLint(t *testing.T) {
9149 bpTemplate := `
9150 apex {
9151 name: "myapex",
9152 key: "myapex.key",
9153 java_libs: ["myjavalib"],
9154 updatable: %v,
9155 min_sdk_version: "29",
9156 }
9157 apex_key {
9158 name: "myapex.key",
9159 }
9160 java_library {
9161 name: "myjavalib",
9162 srcs: ["MyClass.java"],
9163 apex_available: [ "myapex" ],
9164 lint: {
9165 strict_updatability_linting: %v,
9166 },
9167 sdk_version: "current",
9168 min_sdk_version: "29",
9169 }
9170 `
9171 fs := android.MockFS{
9172 "lint-baseline.xml": nil,
9173 }
9174
9175 testCases := []struct {
9176 testCaseName string
9177 apexUpdatable bool
9178 javaStrictUpdtabilityLint bool
9179 lintFileExists bool
9180 disallowedFlagExpected bool
9181 }{
9182 {
9183 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9184 apexUpdatable: true,
9185 javaStrictUpdtabilityLint: true,
9186 lintFileExists: false,
9187 disallowedFlagExpected: false,
9188 },
9189 {
9190 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9191 apexUpdatable: false,
9192 javaStrictUpdtabilityLint: false,
9193 lintFileExists: true,
9194 disallowedFlagExpected: false,
9195 },
9196 {
9197 testCaseName: "non-updatable apex respects strict updatability of javalib",
9198 apexUpdatable: false,
9199 javaStrictUpdtabilityLint: true,
9200 lintFileExists: true,
9201 disallowedFlagExpected: true,
9202 },
9203 {
9204 testCaseName: "updatable apex sets strict updatability of javalib to true",
9205 apexUpdatable: true,
9206 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9207 lintFileExists: true,
9208 disallowedFlagExpected: true,
9209 },
9210 }
9211
9212 for _, testCase := range testCases {
9213 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9214 fixtures := []android.FixturePreparer{}
9215 if testCase.lintFileExists {
9216 fixtures = append(fixtures, fs.AddToFixture())
9217 }
9218
9219 result := testApex(t, bp, fixtures...)
9220 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9221 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9222 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9223
9224 if disallowedFlagActual != testCase.disallowedFlagExpected {
9225 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9226 }
9227 }
9228}
9229
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009230func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9231 bp := `
9232 apex {
9233 name: "myapex",
9234 key: "myapex.key",
9235 java_libs: ["myjavalib"],
9236 updatable: true,
9237 min_sdk_version: "29",
9238 }
9239 apex_key {
9240 name: "myapex.key",
9241 }
9242 java_library {
9243 name: "myjavalib",
9244 srcs: ["MyClass.java"],
9245 apex_available: [ "myapex" ],
9246 sdk_version: "current",
9247 min_sdk_version: "29",
9248 }
9249 `
9250
9251 testCases := []struct {
9252 testCaseName string
9253 moduleDirectory string
9254 disallowedFlagExpected bool
9255 }{
9256 {
9257 testCaseName: "lintable module defined outside libcore",
9258 moduleDirectory: "",
9259 disallowedFlagExpected: true,
9260 },
9261 {
9262 testCaseName: "lintable module defined in libcore root directory",
9263 moduleDirectory: "libcore/",
9264 disallowedFlagExpected: false,
9265 },
9266 {
9267 testCaseName: "lintable module defined in libcore child directory",
9268 moduleDirectory: "libcore/childdir/",
9269 disallowedFlagExpected: true,
9270 },
9271 }
9272
9273 for _, testCase := range testCases {
9274 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9275 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9276 result := testApex(t, "", lintFileCreator, bpFileCreator)
9277 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9278 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9279 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9280 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9281
9282 if disallowedFlagActual != testCase.disallowedFlagExpected {
9283 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9284 }
9285 }
9286}
9287
Spandan Das66773252022-01-15 00:23:18 +00009288// checks transtive deps of an apex coming from bootclasspath_fragment
9289func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9290 bp := `
9291 apex {
9292 name: "myapex",
9293 key: "myapex.key",
9294 bootclasspath_fragments: ["mybootclasspathfragment"],
9295 updatable: true,
9296 min_sdk_version: "29",
9297 }
9298 apex_key {
9299 name: "myapex.key",
9300 }
9301 bootclasspath_fragment {
9302 name: "mybootclasspathfragment",
9303 contents: ["myjavalib"],
9304 apex_available: ["myapex"],
9305 }
9306 java_library {
9307 name: "myjavalib",
9308 srcs: ["MyClass.java"],
9309 apex_available: [ "myapex" ],
9310 sdk_version: "current",
9311 min_sdk_version: "29",
9312 compile_dex: true,
9313 }
9314 `
9315 fs := android.MockFS{
9316 "lint-baseline.xml": nil,
9317 }
9318
9319 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9320 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9321 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9322 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9323 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9324 }
9325}
9326
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009327func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009328 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009329}