blob: bb3556c3c51a67fe7cd062c328e8495e3c7ab93b [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",
685 "app/AppFoo/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",
Spandan Das42e89502022-05-06 22:12:55 +00002396 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002397 }
2398
2399 apex_key {
2400 name: "myapex.key",
2401 public_key: "testkey.avbpubkey",
2402 private_key: "testkey.pem",
2403 }
2404
2405 android_app {
2406 name: "AppFoo",
2407 srcs: ["foo/bar/MyClass.java"],
2408 sdk_version: "current",
2409 min_sdk_version: "29",
2410 system_modules: "none",
2411 stl: "none",
2412 static_libs: ["bar"],
2413 apex_available: [ "myapex" ],
2414 }
2415
2416 java_library {
2417 name: "bar",
2418 sdk_version: "current",
2419 srcs: ["a.java"],
2420 apex_available: [ "myapex" ],
2421 }
2422 `)
2423}
2424
2425func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002426 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002427 apex {
2428 name: "myapex",
2429 key: "myapex.key",
2430 native_shared_libs: ["mylib"],
2431 min_sdk_version: "29",
2432 }
2433
2434 apex_key {
2435 name: "myapex.key",
2436 public_key: "testkey.avbpubkey",
2437 private_key: "testkey.pem",
2438 }
2439
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002440 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002441 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2442 cc_library {
2443 name: "mylib",
2444 srcs: ["mylib.cpp"],
2445 shared_libs: ["mylib2"],
2446 system_shared_libs: [],
2447 stl: "none",
2448 apex_available: ["myapex", "otherapex"],
2449 min_sdk_version: "29",
2450 }
2451
2452 cc_library {
2453 name: "mylib2",
2454 srcs: ["mylib.cpp"],
2455 system_shared_libs: [],
2456 stl: "none",
2457 apex_available: ["otherapex"],
2458 stubs: { versions: ["29", "30"] },
2459 min_sdk_version: "30",
2460 }
2461
2462 apex {
2463 name: "otherapex",
2464 key: "myapex.key",
2465 native_shared_libs: ["mylib", "mylib2"],
2466 min_sdk_version: "30",
2467 }
2468 `)
2469 expectLink := func(from, from_variant, to, to_variant string) {
2470 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2471 libFlags := ld.Args["libFlags"]
2472 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2473 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002474 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002475 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002476}
2477
Jooyung Haned124c32021-01-26 11:43:46 +09002478func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002479 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2480 func(variables android.FixtureProductVariables) {
2481 variables.Platform_sdk_codename = proptools.StringPtr("S")
2482 variables.Platform_version_active_codenames = []string{"S"}
2483 },
2484 )
Jooyung Haned124c32021-01-26 11:43:46 +09002485 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2486 apex {
2487 name: "myapex",
2488 key: "myapex.key",
2489 native_shared_libs: ["libfoo"],
2490 min_sdk_version: "S",
2491 }
2492 apex_key {
2493 name: "myapex.key",
2494 public_key: "testkey.avbpubkey",
2495 private_key: "testkey.pem",
2496 }
2497 cc_library {
2498 name: "libfoo",
2499 shared_libs: ["libbar"],
2500 apex_available: ["myapex"],
2501 min_sdk_version: "29",
2502 }
2503 cc_library {
2504 name: "libbar",
2505 apex_available: ["myapex"],
2506 }
2507 `, withSAsActiveCodeNames)
2508}
2509
2510func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002511 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2512 variables.Platform_sdk_codename = proptools.StringPtr("S")
2513 variables.Platform_version_active_codenames = []string{"S", "T"}
2514 })
Colin Cross1c460562021-02-16 17:55:47 -08002515 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002516 apex {
2517 name: "myapex",
2518 key: "myapex.key",
2519 native_shared_libs: ["libfoo"],
2520 min_sdk_version: "S",
2521 }
2522 apex_key {
2523 name: "myapex.key",
2524 public_key: "testkey.avbpubkey",
2525 private_key: "testkey.pem",
2526 }
2527 cc_library {
2528 name: "libfoo",
2529 shared_libs: ["libbar"],
2530 apex_available: ["myapex"],
2531 min_sdk_version: "S",
2532 }
2533 cc_library {
2534 name: "libbar",
2535 stubs: {
2536 symbol_file: "libbar.map.txt",
2537 versions: ["30", "S", "T"],
2538 },
2539 }
2540 `, withSAsActiveCodeNames)
2541
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002542 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002543 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2544 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002545 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002546}
2547
Jiyong Park7c2ee712018-12-07 00:42:25 +09002548func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002549 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002550 apex {
2551 name: "myapex",
2552 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002553 native_shared_libs: ["mylib"],
2554 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002555 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002556 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002557 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002558 }
2559
2560 apex_key {
2561 name: "myapex.key",
2562 public_key: "testkey.avbpubkey",
2563 private_key: "testkey.pem",
2564 }
2565
2566 prebuilt_etc {
2567 name: "myetc",
2568 src: "myprebuilt",
2569 sub_dir: "foo/bar",
2570 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002571
2572 cc_library {
2573 name: "mylib",
2574 srcs: ["mylib.cpp"],
2575 relative_install_path: "foo/bar",
2576 system_shared_libs: [],
2577 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002578 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002579 }
2580
2581 cc_binary {
2582 name: "mybin",
2583 srcs: ["mylib.cpp"],
2584 relative_install_path: "foo/bar",
2585 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002586 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002587 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002588 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002589 `)
2590
Sundong Ahnabb64432019-10-22 13:58:29 +09002591 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002592 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002593
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002594 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002595 ensureContains(t, cmd, "/etc ")
2596 ensureContains(t, cmd, "/etc/foo ")
2597 ensureContains(t, cmd, "/etc/foo/bar ")
2598 ensureContains(t, cmd, "/lib64 ")
2599 ensureContains(t, cmd, "/lib64/foo ")
2600 ensureContains(t, cmd, "/lib64/foo/bar ")
2601 ensureContains(t, cmd, "/lib ")
2602 ensureContains(t, cmd, "/lib/foo ")
2603 ensureContains(t, cmd, "/lib/foo/bar ")
2604 ensureContains(t, cmd, "/bin ")
2605 ensureContains(t, cmd, "/bin/foo ")
2606 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002607}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002608
Jooyung Han35155c42020-02-06 17:33:20 +09002609func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002610 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002611 apex {
2612 name: "myapex",
2613 key: "myapex.key",
2614 multilib: {
2615 both: {
2616 native_shared_libs: ["mylib"],
2617 binaries: ["mybin"],
2618 },
2619 },
2620 compile_multilib: "both",
2621 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002622 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002623 }
2624
2625 apex_key {
2626 name: "myapex.key",
2627 public_key: "testkey.avbpubkey",
2628 private_key: "testkey.pem",
2629 }
2630
2631 cc_library {
2632 name: "mylib",
2633 relative_install_path: "foo/bar",
2634 system_shared_libs: [],
2635 stl: "none",
2636 apex_available: [ "myapex" ],
2637 native_bridge_supported: true,
2638 }
2639
2640 cc_binary {
2641 name: "mybin",
2642 relative_install_path: "foo/bar",
2643 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002644 stl: "none",
2645 apex_available: [ "myapex" ],
2646 native_bridge_supported: true,
2647 compile_multilib: "both", // default is "first" for binary
2648 multilib: {
2649 lib64: {
2650 suffix: "64",
2651 },
2652 },
2653 }
2654 `, withNativeBridgeEnabled)
2655 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2656 "bin/foo/bar/mybin",
2657 "bin/foo/bar/mybin64",
2658 "bin/arm/foo/bar/mybin",
2659 "bin/arm64/foo/bar/mybin64",
2660 "lib/foo/bar/mylib.so",
2661 "lib/arm/foo/bar/mylib.so",
2662 "lib64/foo/bar/mylib.so",
2663 "lib64/arm64/foo/bar/mylib.so",
2664 })
2665}
2666
Jooyung Han85d61762020-06-24 23:50:26 +09002667func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002668 result := android.GroupFixturePreparers(
2669 prepareForApexTest,
2670 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2671 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002672 apex {
2673 name: "myapex",
2674 key: "myapex.key",
2675 binaries: ["mybin"],
2676 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002677 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002678 }
2679 apex_key {
2680 name: "myapex.key",
2681 public_key: "testkey.avbpubkey",
2682 private_key: "testkey.pem",
2683 }
2684 cc_binary {
2685 name: "mybin",
2686 vendor: true,
2687 shared_libs: ["libfoo"],
2688 }
2689 cc_library {
2690 name: "libfoo",
2691 proprietary: true,
2692 }
2693 `)
2694
Colin Crossc68db4b2021-11-11 18:59:15 -08002695 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002696 "bin/mybin",
2697 "lib64/libfoo.so",
2698 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2699 "lib64/libc++.so",
2700 })
2701
Colin Crossc68db4b2021-11-11 18:59:15 -08002702 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2703 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002704 name := apexBundle.BaseModuleName()
2705 prefix := "TARGET_"
2706 var builder strings.Builder
2707 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002708 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002709 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002710 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002711
Colin Crossc68db4b2021-11-11 18:59:15 -08002712 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002713 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2714 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002715}
2716
Jooyung Hanc5a96762022-02-04 11:54:50 +09002717func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2718 testApexError(t, `Trying to include a VNDK library`, `
2719 apex {
2720 name: "myapex",
2721 key: "myapex.key",
2722 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2723 vendor: true,
2724 use_vndk_as_stable: true,
2725 updatable: false,
2726 }
2727 apex_key {
2728 name: "myapex.key",
2729 public_key: "testkey.avbpubkey",
2730 private_key: "testkey.pem",
2731 }`)
2732}
2733
Jooyung Handf78e212020-07-22 15:54:47 +09002734func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002735 // myapex myapex2
2736 // | |
2737 // mybin ------. mybin2
2738 // \ \ / |
2739 // (stable) .---\--------` |
2740 // \ / \ |
2741 // \ / \ /
2742 // libvndk libvendor
2743 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002744 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002745 apex {
2746 name: "myapex",
2747 key: "myapex.key",
2748 binaries: ["mybin"],
2749 vendor: true,
2750 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002751 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002752 }
2753 apex_key {
2754 name: "myapex.key",
2755 public_key: "testkey.avbpubkey",
2756 private_key: "testkey.pem",
2757 }
2758 cc_binary {
2759 name: "mybin",
2760 vendor: true,
2761 shared_libs: ["libvndk", "libvendor"],
2762 }
2763 cc_library {
2764 name: "libvndk",
2765 vndk: {
2766 enabled: true,
2767 },
2768 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002769 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002770 }
2771 cc_library {
2772 name: "libvendor",
2773 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002774 stl: "none",
2775 }
2776 apex {
2777 name: "myapex2",
2778 key: "myapex.key",
2779 binaries: ["mybin2"],
2780 vendor: true,
2781 use_vndk_as_stable: false,
2782 updatable: false,
2783 }
2784 cc_binary {
2785 name: "mybin2",
2786 vendor: true,
2787 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002788 }
2789 `)
2790
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002791 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002792
Jooyung Han91f92032022-02-04 12:36:33 +09002793 for _, tc := range []struct {
2794 name string
2795 apexName string
2796 moduleName string
2797 moduleVariant string
2798 libs []string
2799 contents []string
2800 requireVndkNamespace bool
2801 }{
2802 {
2803 name: "use_vndk_as_stable",
2804 apexName: "myapex",
2805 moduleName: "mybin",
2806 moduleVariant: vendorVariant + "_apex10000",
2807 libs: []string{
2808 // should link with vendor variants of VNDK libs(libvndk/libc++)
2809 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2810 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2811 // unstable Vendor libs as APEX variant
2812 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2813 },
2814 contents: []string{
2815 "bin/mybin",
2816 "lib64/libvendor.so",
2817 // VNDK libs (libvndk/libc++) are not included
2818 },
2819 requireVndkNamespace: true,
2820 },
2821 {
2822 name: "!use_vndk_as_stable",
2823 apexName: "myapex2",
2824 moduleName: "mybin2",
2825 moduleVariant: vendorVariant + "_myapex2",
2826 libs: []string{
2827 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2828 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2829 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2830 // unstable vendor libs have "merged" APEX variants
2831 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2832 },
2833 contents: []string{
2834 "bin/mybin2",
2835 "lib64/libvendor.so",
2836 // VNDK libs are included as well
2837 "lib64/libvndk.so",
2838 "lib64/libc++.so",
2839 },
2840 requireVndkNamespace: false,
2841 },
2842 } {
2843 t.Run(tc.name, func(t *testing.T) {
2844 // Check linked libs
2845 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2846 libs := names(ldRule.Args["libFlags"])
2847 for _, lib := range tc.libs {
2848 ensureListContains(t, libs, lib)
2849 }
2850 // Check apex contents
2851 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002852
Jooyung Han91f92032022-02-04 12:36:33 +09002853 // Check "requireNativeLibs"
2854 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2855 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2856 if tc.requireVndkNamespace {
2857 ensureListContains(t, requireNativeLibs, ":vndk")
2858 } else {
2859 ensureListNotContains(t, requireNativeLibs, ":vndk")
2860 }
2861 })
2862 }
Jooyung Handf78e212020-07-22 15:54:47 +09002863}
2864
Justin Yun13decfb2021-03-08 19:25:55 +09002865func TestProductVariant(t *testing.T) {
2866 ctx := testApex(t, `
2867 apex {
2868 name: "myapex",
2869 key: "myapex.key",
2870 updatable: false,
2871 product_specific: true,
2872 binaries: ["foo"],
2873 }
2874
2875 apex_key {
2876 name: "myapex.key",
2877 public_key: "testkey.avbpubkey",
2878 private_key: "testkey.pem",
2879 }
2880
2881 cc_binary {
2882 name: "foo",
2883 product_available: true,
2884 apex_available: ["myapex"],
2885 srcs: ["foo.cpp"],
2886 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002887 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2888 variables.ProductVndkVersion = proptools.StringPtr("current")
2889 }),
2890 )
Justin Yun13decfb2021-03-08 19:25:55 +09002891
2892 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002893 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002894 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2895 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2896 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2897 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2898}
2899
Jooyung Han8e5685d2020-09-21 11:02:57 +09002900func TestApex_withPrebuiltFirmware(t *testing.T) {
2901 testCases := []struct {
2902 name string
2903 additionalProp string
2904 }{
2905 {"system apex with prebuilt_firmware", ""},
2906 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2907 }
2908 for _, tc := range testCases {
2909 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002910 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002911 apex {
2912 name: "myapex",
2913 key: "myapex.key",
2914 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002915 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002916 `+tc.additionalProp+`
2917 }
2918 apex_key {
2919 name: "myapex.key",
2920 public_key: "testkey.avbpubkey",
2921 private_key: "testkey.pem",
2922 }
2923 prebuilt_firmware {
2924 name: "myfirmware",
2925 src: "myfirmware.bin",
2926 filename_from_src: true,
2927 `+tc.additionalProp+`
2928 }
2929 `)
2930 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2931 "etc/firmware/myfirmware.bin",
2932 })
2933 })
2934 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002935}
2936
Jooyung Hanefb184e2020-06-25 17:14:25 +09002937func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002938 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002939 apex {
2940 name: "myapex",
2941 key: "myapex.key",
2942 vendor: true,
2943 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002944 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002945 }
2946
2947 apex_key {
2948 name: "myapex.key",
2949 public_key: "testkey.avbpubkey",
2950 private_key: "testkey.pem",
2951 }
2952
2953 cc_library {
2954 name: "mylib",
2955 vendor_available: true,
2956 }
2957 `)
2958
2959 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002960 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002961 name := apexBundle.BaseModuleName()
2962 prefix := "TARGET_"
2963 var builder strings.Builder
2964 data.Custom(&builder, name, prefix, "", data)
2965 androidMk := builder.String()
2966 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2967}
2968
Jooyung Han2ed99d02020-06-24 23:26:26 +09002969func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002970 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002971 apex {
2972 name: "myapex",
2973 key: "myapex.key",
2974 vintf_fragments: ["fragment.xml"],
2975 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002976 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002977 }
2978 apex_key {
2979 name: "myapex.key",
2980 public_key: "testkey.avbpubkey",
2981 private_key: "testkey.pem",
2982 }
2983 cc_binary {
2984 name: "mybin",
2985 }
2986 `)
2987
2988 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002989 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002990 name := apexBundle.BaseModuleName()
2991 prefix := "TARGET_"
2992 var builder strings.Builder
2993 data.Custom(&builder, name, prefix, "", data)
2994 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002995 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002996 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002997}
2998
Jiyong Park16e91a02018-12-20 18:18:08 +09002999func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003000 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003001 apex {
3002 name: "myapex",
3003 key: "myapex.key",
3004 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003005 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003006 }
3007
3008 apex_key {
3009 name: "myapex.key",
3010 public_key: "testkey.avbpubkey",
3011 private_key: "testkey.pem",
3012 }
3013
3014 cc_library {
3015 name: "mylib",
3016 srcs: ["mylib.cpp"],
3017 system_shared_libs: [],
3018 stl: "none",
3019 stubs: {
3020 versions: ["1", "2", "3"],
3021 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003022 apex_available: [
3023 "//apex_available:platform",
3024 "myapex",
3025 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003026 }
3027
3028 cc_binary {
3029 name: "not_in_apex",
3030 srcs: ["mylib.cpp"],
3031 static_libs: ["mylib"],
3032 static_executable: true,
3033 system_shared_libs: [],
3034 stl: "none",
3035 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003036 `)
3037
Colin Cross7113d202019-11-20 16:39:12 -08003038 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003039
3040 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003041 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003042}
Jiyong Park9335a262018-12-24 11:31:58 +09003043
3044func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003045 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003046 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003047 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003048 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003049 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003050 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003051 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003052 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003053 }
3054
3055 cc_library {
3056 name: "mylib",
3057 srcs: ["mylib.cpp"],
3058 system_shared_libs: [],
3059 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003060 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003061 }
3062
3063 apex_key {
3064 name: "myapex.key",
3065 public_key: "testkey.avbpubkey",
3066 private_key: "testkey.pem",
3067 }
3068
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003069 android_app_certificate {
3070 name: "myapex.certificate",
3071 certificate: "testkey",
3072 }
3073
3074 android_app_certificate {
3075 name: "myapex.certificate.override",
3076 certificate: "testkey.override",
3077 }
3078
Jiyong Park9335a262018-12-24 11:31:58 +09003079 `)
3080
3081 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003082 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003083
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003084 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3085 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003086 "vendor/foo/devkeys/testkey.avbpubkey")
3087 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003088 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3089 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003090 "vendor/foo/devkeys/testkey.pem")
3091 }
3092
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003093 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003094 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003095 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003096 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003097 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003098 }
3099}
Jiyong Park58e364a2019-01-19 19:24:06 +09003100
Jooyung Hanf121a652019-12-17 14:30:11 +09003101func TestCertificate(t *testing.T) {
3102 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003103 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003104 apex {
3105 name: "myapex",
3106 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003107 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003108 }
3109 apex_key {
3110 name: "myapex.key",
3111 public_key: "testkey.avbpubkey",
3112 private_key: "testkey.pem",
3113 }`)
3114 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3115 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3116 if actual := rule.Args["certificates"]; actual != expected {
3117 t.Errorf("certificates should be %q, not %q", expected, actual)
3118 }
3119 })
3120 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003121 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003122 apex {
3123 name: "myapex_keytest",
3124 key: "myapex.key",
3125 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003126 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003127 }
3128 apex_key {
3129 name: "myapex.key",
3130 public_key: "testkey.avbpubkey",
3131 private_key: "testkey.pem",
3132 }
3133 android_app_certificate {
3134 name: "myapex.certificate.override",
3135 certificate: "testkey.override",
3136 }`)
3137 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3138 expected := "testkey.override.x509.pem testkey.override.pk8"
3139 if actual := rule.Args["certificates"]; actual != expected {
3140 t.Errorf("certificates should be %q, not %q", expected, actual)
3141 }
3142 })
3143 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003144 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003145 apex {
3146 name: "myapex",
3147 key: "myapex.key",
3148 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003149 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003150 }
3151 apex_key {
3152 name: "myapex.key",
3153 public_key: "testkey.avbpubkey",
3154 private_key: "testkey.pem",
3155 }
3156 android_app_certificate {
3157 name: "myapex.certificate",
3158 certificate: "testkey",
3159 }`)
3160 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3161 expected := "testkey.x509.pem testkey.pk8"
3162 if actual := rule.Args["certificates"]; actual != expected {
3163 t.Errorf("certificates should be %q, not %q", expected, actual)
3164 }
3165 })
3166 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003167 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003168 apex {
3169 name: "myapex_keytest",
3170 key: "myapex.key",
3171 file_contexts: ":myapex-file_contexts",
3172 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003173 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003174 }
3175 apex_key {
3176 name: "myapex.key",
3177 public_key: "testkey.avbpubkey",
3178 private_key: "testkey.pem",
3179 }
3180 android_app_certificate {
3181 name: "myapex.certificate.override",
3182 certificate: "testkey.override",
3183 }`)
3184 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3185 expected := "testkey.override.x509.pem testkey.override.pk8"
3186 if actual := rule.Args["certificates"]; actual != expected {
3187 t.Errorf("certificates should be %q, not %q", expected, actual)
3188 }
3189 })
3190 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003191 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003192 apex {
3193 name: "myapex",
3194 key: "myapex.key",
3195 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003196 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003197 }
3198 apex_key {
3199 name: "myapex.key",
3200 public_key: "testkey.avbpubkey",
3201 private_key: "testkey.pem",
3202 }`)
3203 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3204 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3205 if actual := rule.Args["certificates"]; actual != expected {
3206 t.Errorf("certificates should be %q, not %q", expected, actual)
3207 }
3208 })
3209 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003210 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003211 apex {
3212 name: "myapex_keytest",
3213 key: "myapex.key",
3214 file_contexts: ":myapex-file_contexts",
3215 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003216 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003217 }
3218 apex_key {
3219 name: "myapex.key",
3220 public_key: "testkey.avbpubkey",
3221 private_key: "testkey.pem",
3222 }
3223 android_app_certificate {
3224 name: "myapex.certificate.override",
3225 certificate: "testkey.override",
3226 }`)
3227 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3228 expected := "testkey.override.x509.pem testkey.override.pk8"
3229 if actual := rule.Args["certificates"]; actual != expected {
3230 t.Errorf("certificates should be %q, not %q", expected, actual)
3231 }
3232 })
3233}
3234
Jiyong Park58e364a2019-01-19 19:24:06 +09003235func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003236 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003237 apex {
3238 name: "myapex",
3239 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003240 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003241 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003242 }
3243
3244 apex {
3245 name: "otherapex",
3246 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003247 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003248 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003249 }
3250
3251 apex_key {
3252 name: "myapex.key",
3253 public_key: "testkey.avbpubkey",
3254 private_key: "testkey.pem",
3255 }
3256
3257 cc_library {
3258 name: "mylib",
3259 srcs: ["mylib.cpp"],
3260 system_shared_libs: [],
3261 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003262 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003263 "myapex",
3264 "otherapex",
3265 ],
Jooyung Han24282772020-03-21 23:20:55 +09003266 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003267 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003268 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003269 cc_library {
3270 name: "mylib2",
3271 srcs: ["mylib.cpp"],
3272 system_shared_libs: [],
3273 stl: "none",
3274 apex_available: [
3275 "myapex",
3276 "otherapex",
3277 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003278 static_libs: ["mylib3"],
3279 recovery_available: true,
3280 min_sdk_version: "29",
3281 }
3282 cc_library {
3283 name: "mylib3",
3284 srcs: ["mylib.cpp"],
3285 system_shared_libs: [],
3286 stl: "none",
3287 apex_available: [
3288 "myapex",
3289 "otherapex",
3290 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003291 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003292 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003293 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003294 `)
3295
Jooyung Hanc87a0592020-03-02 17:44:33 +09003296 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003297 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003298 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003299 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003300
Jooyung Hanccce2f22020-03-07 03:45:53 +09003301 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003302 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003303 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003304 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003305
Jooyung Hanccce2f22020-03-07 03:45:53 +09003306 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003307 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003308 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003309 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003310
Colin Crossaede88c2020-08-11 12:17:01 -07003311 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3312 // each variant defines additional macros to distinguish which apex variant it is built for
3313
3314 // non-APEX variant does not have __ANDROID_APEX__ defined
3315 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3316 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3317
Dan Albertb19953d2020-11-17 15:29:36 -08003318 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003319 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3320 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003321 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003322
Jooyung Hanc87a0592020-03-02 17:44:33 +09003323 // non-APEX variant does not have __ANDROID_APEX__ defined
3324 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3325 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3326
Dan Albertb19953d2020-11-17 15:29:36 -08003327 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003328 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003329 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003330 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003331}
Jiyong Park7e636d02019-01-28 16:16:54 +09003332
3333func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003334 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003335 apex {
3336 name: "myapex",
3337 key: "myapex.key",
3338 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003339 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003340 }
3341
3342 apex_key {
3343 name: "myapex.key",
3344 public_key: "testkey.avbpubkey",
3345 private_key: "testkey.pem",
3346 }
3347
3348 cc_library_headers {
3349 name: "mylib_headers",
3350 export_include_dirs: ["my_include"],
3351 system_shared_libs: [],
3352 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003353 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003354 }
3355
3356 cc_library {
3357 name: "mylib",
3358 srcs: ["mylib.cpp"],
3359 system_shared_libs: [],
3360 stl: "none",
3361 header_libs: ["mylib_headers"],
3362 export_header_lib_headers: ["mylib_headers"],
3363 stubs: {
3364 versions: ["1", "2", "3"],
3365 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003366 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003367 }
3368
3369 cc_library {
3370 name: "otherlib",
3371 srcs: ["mylib.cpp"],
3372 system_shared_libs: [],
3373 stl: "none",
3374 shared_libs: ["mylib"],
3375 }
3376 `)
3377
Colin Cross7113d202019-11-20 16:39:12 -08003378 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003379
3380 // Ensure that the include path of the header lib is exported to 'otherlib'
3381 ensureContains(t, cFlags, "-Imy_include")
3382}
Alex Light9670d332019-01-29 18:07:33 -08003383
Jiyong Park7cd10e32020-01-14 09:22:18 +09003384type fileInApex struct {
3385 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003386 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003387 isLink bool
3388}
3389
Jooyung Hana57af4a2020-01-23 05:36:59 +00003390func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003391 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003392 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003393 copyCmds := apexRule.Args["copy_commands"]
3394 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003395 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003396 for _, cmd := range strings.Split(copyCmds, "&&") {
3397 cmd = strings.TrimSpace(cmd)
3398 if cmd == "" {
3399 continue
3400 }
3401 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003402 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003403 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003404 switch terms[0] {
3405 case "mkdir":
3406 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003407 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003408 t.Fatal("copyCmds contains invalid cp command", cmd)
3409 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003410 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003411 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003412 isLink = false
3413 case "ln":
3414 if len(terms) != 3 && len(terms) != 4 {
3415 // ln LINK TARGET or ln -s LINK TARGET
3416 t.Fatal("copyCmds contains invalid ln command", cmd)
3417 }
3418 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003419 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003420 isLink = true
3421 default:
3422 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3423 }
3424 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003425 index := strings.Index(dst, imageApexDir)
3426 if index == -1 {
3427 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3428 }
3429 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003430 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003431 }
3432 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003433 return ret
3434}
3435
Jooyung Hana57af4a2020-01-23 05:36:59 +00003436func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3437 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003438 var failed bool
3439 var surplus []string
3440 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003441 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003442 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003443 for _, expected := range files {
3444 if matched, _ := path.Match(expected, file.path); matched {
3445 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003446 mactchFound = true
3447 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003448 }
3449 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003450 if !mactchFound {
3451 surplus = append(surplus, file.path)
3452 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003453 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003454
Jooyung Han31c470b2019-10-18 16:26:59 +09003455 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003456 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003457 t.Log("surplus files", surplus)
3458 failed = true
3459 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003460
3461 if len(files) > len(filesMatched) {
3462 var missing []string
3463 for _, expected := range files {
3464 if !filesMatched[expected] {
3465 missing = append(missing, expected)
3466 }
3467 }
3468 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003469 t.Log("missing files", missing)
3470 failed = true
3471 }
3472 if failed {
3473 t.Fail()
3474 }
3475}
3476
Jooyung Han344d5432019-08-23 11:17:39 +09003477func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003478 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003479 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003480 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003481 "etc/llndk.libraries.29.txt",
3482 "etc/vndkcore.libraries.29.txt",
3483 "etc/vndksp.libraries.29.txt",
3484 "etc/vndkprivate.libraries.29.txt",
3485 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003486 }
3487 testCases := []struct {
3488 vndkVersion string
3489 expectedFiles []string
3490 }{
3491 {
3492 vndkVersion: "current",
3493 expectedFiles: append(commonFiles,
3494 "lib/libvndk.so",
3495 "lib/libvndksp.so",
3496 "lib64/libvndk.so",
3497 "lib64/libvndksp.so"),
3498 },
3499 {
3500 vndkVersion: "",
3501 expectedFiles: append(commonFiles,
3502 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3503 "lib/libvndksp.so",
3504 "lib64/libvndksp.so"),
3505 },
3506 }
3507 for _, tc := range testCases {
3508 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3509 ctx := testApex(t, `
3510 apex_vndk {
3511 name: "com.android.vndk.current",
3512 key: "com.android.vndk.current.key",
3513 updatable: false,
3514 }
3515
3516 apex_key {
3517 name: "com.android.vndk.current.key",
3518 public_key: "testkey.avbpubkey",
3519 private_key: "testkey.pem",
3520 }
3521
3522 cc_library {
3523 name: "libvndk",
3524 srcs: ["mylib.cpp"],
3525 vendor_available: true,
3526 product_available: true,
3527 vndk: {
3528 enabled: true,
3529 },
3530 system_shared_libs: [],
3531 stl: "none",
3532 apex_available: [ "com.android.vndk.current" ],
3533 }
3534
3535 cc_library {
3536 name: "libvndksp",
3537 srcs: ["mylib.cpp"],
3538 vendor_available: true,
3539 product_available: true,
3540 vndk: {
3541 enabled: true,
3542 support_system_process: true,
3543 },
3544 system_shared_libs: [],
3545 stl: "none",
3546 apex_available: [ "com.android.vndk.current" ],
3547 }
3548
3549 // VNDK-Ext should not cause any problems
3550
3551 cc_library {
3552 name: "libvndk.ext",
3553 srcs: ["mylib2.cpp"],
3554 vendor: true,
3555 vndk: {
3556 enabled: true,
3557 extends: "libvndk",
3558 },
3559 system_shared_libs: [],
3560 stl: "none",
3561 }
3562
3563 cc_library {
3564 name: "libvndksp.ext",
3565 srcs: ["mylib2.cpp"],
3566 vendor: true,
3567 vndk: {
3568 enabled: true,
3569 support_system_process: true,
3570 extends: "libvndksp",
3571 },
3572 system_shared_libs: [],
3573 stl: "none",
3574 }
3575 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3576 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3577 }))
3578 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3579 })
3580 }
Jooyung Han344d5432019-08-23 11:17:39 +09003581}
3582
3583func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003584 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003585 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003586 name: "com.android.vndk.current",
3587 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003588 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003589 }
3590
3591 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003592 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003593 public_key: "testkey.avbpubkey",
3594 private_key: "testkey.pem",
3595 }
3596
3597 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003598 name: "libvndk",
3599 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003600 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003601 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003602 vndk: {
3603 enabled: true,
3604 },
3605 system_shared_libs: [],
3606 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003607 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003608 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003609
3610 cc_prebuilt_library_shared {
3611 name: "libvndk.arm",
3612 srcs: ["libvndk.arm.so"],
3613 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003614 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003615 vndk: {
3616 enabled: true,
3617 },
3618 enabled: false,
3619 arch: {
3620 arm: {
3621 enabled: true,
3622 },
3623 },
3624 system_shared_libs: [],
3625 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003626 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003627 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003628 `+vndkLibrariesTxtFiles("current"),
3629 withFiles(map[string][]byte{
3630 "libvndk.so": nil,
3631 "libvndk.arm.so": nil,
3632 }))
Colin Cross2807f002021-03-02 10:15:29 -08003633 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003634 "lib/libvndk.so",
3635 "lib/libvndk.arm.so",
3636 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003637 "lib/libc++.so",
3638 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003639 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003640 })
Jooyung Han344d5432019-08-23 11:17:39 +09003641}
3642
Jooyung Han39edb6c2019-11-06 16:53:07 +09003643func vndkLibrariesTxtFiles(vers ...string) (result string) {
3644 for _, v := range vers {
3645 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003646 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003647 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003648 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003649 name: "` + txt + `.libraries.txt",
3650 }
3651 `
3652 }
3653 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003654 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003655 result += `
3656 prebuilt_etc {
3657 name: "` + txt + `.libraries.` + v + `.txt",
3658 src: "dummy.txt",
3659 }
3660 `
3661 }
3662 }
3663 }
3664 return
3665}
3666
Jooyung Han344d5432019-08-23 11:17:39 +09003667func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003668 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003669 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003670 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003671 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003672 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003673 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003674 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003675 }
3676
3677 apex_key {
3678 name: "myapex.key",
3679 public_key: "testkey.avbpubkey",
3680 private_key: "testkey.pem",
3681 }
3682
Jooyung Han31c470b2019-10-18 16:26:59 +09003683 vndk_prebuilt_shared {
3684 name: "libvndk27",
3685 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003686 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003687 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003688 vndk: {
3689 enabled: true,
3690 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003691 target_arch: "arm64",
3692 arch: {
3693 arm: {
3694 srcs: ["libvndk27_arm.so"],
3695 },
3696 arm64: {
3697 srcs: ["libvndk27_arm64.so"],
3698 },
3699 },
Colin Cross2807f002021-03-02 10:15:29 -08003700 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003701 }
3702
3703 vndk_prebuilt_shared {
3704 name: "libvndk27",
3705 version: "27",
3706 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003707 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003708 vndk: {
3709 enabled: true,
3710 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003711 target_arch: "x86_64",
3712 arch: {
3713 x86: {
3714 srcs: ["libvndk27_x86.so"],
3715 },
3716 x86_64: {
3717 srcs: ["libvndk27_x86_64.so"],
3718 },
3719 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003720 }
3721 `+vndkLibrariesTxtFiles("27"),
3722 withFiles(map[string][]byte{
3723 "libvndk27_arm.so": nil,
3724 "libvndk27_arm64.so": nil,
3725 "libvndk27_x86.so": nil,
3726 "libvndk27_x86_64.so": nil,
3727 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003728
Colin Cross2807f002021-03-02 10:15:29 -08003729 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003730 "lib/libvndk27_arm.so",
3731 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003732 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003733 })
Jooyung Han344d5432019-08-23 11:17:39 +09003734}
3735
Jooyung Han90eee022019-10-01 20:02:42 +09003736func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003737 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003738 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003739 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003740 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003741 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003742 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003743 }
3744 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003745 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003746 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003747 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003748 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003749 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003750 }
3751 apex_key {
3752 name: "myapex.key",
3753 public_key: "testkey.avbpubkey",
3754 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003755 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003756
3757 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003758 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003759 actual := proptools.String(bundle.properties.Apex_name)
3760 if !reflect.DeepEqual(actual, expected) {
3761 t.Errorf("Got '%v', expected '%v'", actual, expected)
3762 }
3763 }
3764
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003765 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003766 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003767}
3768
Jooyung Han344d5432019-08-23 11:17:39 +09003769func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003770 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003771 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003772 name: "com.android.vndk.current",
3773 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003774 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003775 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003776 }
3777
3778 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003779 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003780 public_key: "testkey.avbpubkey",
3781 private_key: "testkey.pem",
3782 }
3783
3784 cc_library {
3785 name: "libvndk",
3786 srcs: ["mylib.cpp"],
3787 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003788 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003789 native_bridge_supported: true,
3790 host_supported: true,
3791 vndk: {
3792 enabled: true,
3793 },
3794 system_shared_libs: [],
3795 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003796 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003797 }
Colin Cross2807f002021-03-02 10:15:29 -08003798 `+vndkLibrariesTxtFiles("current"),
3799 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003800
Colin Cross2807f002021-03-02 10:15:29 -08003801 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003802 "lib/libvndk.so",
3803 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003804 "lib/libc++.so",
3805 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003806 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003807 })
Jooyung Han344d5432019-08-23 11:17:39 +09003808}
3809
3810func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003811 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003812 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003813 name: "com.android.vndk.current",
3814 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003815 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003816 native_bridge_supported: true,
3817 }
3818
3819 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003820 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003821 public_key: "testkey.avbpubkey",
3822 private_key: "testkey.pem",
3823 }
3824
3825 cc_library {
3826 name: "libvndk",
3827 srcs: ["mylib.cpp"],
3828 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003829 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003830 native_bridge_supported: true,
3831 host_supported: true,
3832 vndk: {
3833 enabled: true,
3834 },
3835 system_shared_libs: [],
3836 stl: "none",
3837 }
3838 `)
3839}
3840
Jooyung Han31c470b2019-10-18 16:26:59 +09003841func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003842 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003843 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003844 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003845 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003846 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003847 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003848 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003849 }
3850
3851 apex_key {
3852 name: "myapex.key",
3853 public_key: "testkey.avbpubkey",
3854 private_key: "testkey.pem",
3855 }
3856
3857 vndk_prebuilt_shared {
3858 name: "libvndk27",
3859 version: "27",
3860 target_arch: "arm",
3861 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003862 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003863 vndk: {
3864 enabled: true,
3865 },
3866 arch: {
3867 arm: {
3868 srcs: ["libvndk27.so"],
3869 }
3870 },
3871 }
3872
3873 vndk_prebuilt_shared {
3874 name: "libvndk27",
3875 version: "27",
3876 target_arch: "arm",
3877 binder32bit: true,
3878 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003879 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003880 vndk: {
3881 enabled: true,
3882 },
3883 arch: {
3884 arm: {
3885 srcs: ["libvndk27binder32.so"],
3886 }
3887 },
Colin Cross2807f002021-03-02 10:15:29 -08003888 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003889 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003890 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003891 withFiles(map[string][]byte{
3892 "libvndk27.so": nil,
3893 "libvndk27binder32.so": nil,
3894 }),
3895 withBinder32bit,
3896 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003897 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003898 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3899 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003900 },
3901 }),
3902 )
3903
Colin Cross2807f002021-03-02 10:15:29 -08003904 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003905 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003906 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003907 })
3908}
3909
Jooyung Han45a96772020-06-15 14:59:42 +09003910func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003911 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003912 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003913 name: "com.android.vndk.current",
3914 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003915 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003916 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003917 }
3918
3919 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003920 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003921 public_key: "testkey.avbpubkey",
3922 private_key: "testkey.pem",
3923 }
3924
3925 cc_library {
3926 name: "libz",
3927 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003928 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003929 vndk: {
3930 enabled: true,
3931 },
3932 stubs: {
3933 symbol_file: "libz.map.txt",
3934 versions: ["30"],
3935 }
3936 }
3937 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3938 "libz.map.txt": nil,
3939 }))
3940
Colin Cross2807f002021-03-02 10:15:29 -08003941 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003942 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3943 ensureListEmpty(t, provideNativeLibs)
3944}
3945
Jooyung Hane1633032019-08-01 17:41:43 +09003946func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003947 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003948 apex {
3949 name: "myapex_nodep",
3950 key: "myapex.key",
3951 native_shared_libs: ["lib_nodep"],
3952 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003953 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003954 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003955 }
3956
3957 apex {
3958 name: "myapex_dep",
3959 key: "myapex.key",
3960 native_shared_libs: ["lib_dep"],
3961 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003962 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003963 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003964 }
3965
3966 apex {
3967 name: "myapex_provider",
3968 key: "myapex.key",
3969 native_shared_libs: ["libfoo"],
3970 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003971 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003972 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003973 }
3974
3975 apex {
3976 name: "myapex_selfcontained",
3977 key: "myapex.key",
3978 native_shared_libs: ["lib_dep", "libfoo"],
3979 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003980 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003981 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003982 }
3983
3984 apex_key {
3985 name: "myapex.key",
3986 public_key: "testkey.avbpubkey",
3987 private_key: "testkey.pem",
3988 }
3989
3990 cc_library {
3991 name: "lib_nodep",
3992 srcs: ["mylib.cpp"],
3993 system_shared_libs: [],
3994 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003995 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003996 }
3997
3998 cc_library {
3999 name: "lib_dep",
4000 srcs: ["mylib.cpp"],
4001 shared_libs: ["libfoo"],
4002 system_shared_libs: [],
4003 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004004 apex_available: [
4005 "myapex_dep",
4006 "myapex_provider",
4007 "myapex_selfcontained",
4008 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004009 }
4010
4011 cc_library {
4012 name: "libfoo",
4013 srcs: ["mytest.cpp"],
4014 stubs: {
4015 versions: ["1"],
4016 },
4017 system_shared_libs: [],
4018 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004019 apex_available: [
4020 "myapex_provider",
4021 "myapex_selfcontained",
4022 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004023 }
4024 `)
4025
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004026 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004027 var provideNativeLibs, requireNativeLibs []string
4028
Sundong Ahnabb64432019-10-22 13:58:29 +09004029 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004030 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4031 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004032 ensureListEmpty(t, provideNativeLibs)
4033 ensureListEmpty(t, requireNativeLibs)
4034
Sundong Ahnabb64432019-10-22 13:58:29 +09004035 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004036 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4037 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004038 ensureListEmpty(t, provideNativeLibs)
4039 ensureListContains(t, requireNativeLibs, "libfoo.so")
4040
Sundong Ahnabb64432019-10-22 13:58:29 +09004041 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004042 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4043 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004044 ensureListContains(t, provideNativeLibs, "libfoo.so")
4045 ensureListEmpty(t, requireNativeLibs)
4046
Sundong Ahnabb64432019-10-22 13:58:29 +09004047 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004048 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4049 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004050 ensureListContains(t, provideNativeLibs, "libfoo.so")
4051 ensureListEmpty(t, requireNativeLibs)
4052}
4053
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004054func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004055 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004056 apex {
4057 name: "myapex",
4058 key: "myapex.key",
4059 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004060 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004061 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004062 }
4063
4064 apex_key {
4065 name: "myapex.key",
4066 public_key: "testkey.avbpubkey",
4067 private_key: "testkey.pem",
4068 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004069
4070 cc_library {
4071 name: "mylib",
4072 srcs: ["mylib.cpp"],
4073 system_shared_libs: [],
4074 stl: "none",
4075 apex_available: [
4076 "//apex_available:platform",
4077 "myapex",
4078 ],
4079 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004080 `)
4081
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004082 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004083 apexManifestRule := module.Rule("apexManifestRule")
4084 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4085 apexRule := module.Rule("apexRule")
4086 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004087
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004088 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004089 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004090 name := apexBundle.BaseModuleName()
4091 prefix := "TARGET_"
4092 var builder strings.Builder
4093 data.Custom(&builder, name, prefix, "", data)
4094 androidMk := builder.String()
4095 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4096 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004097}
4098
Alex Light0851b882019-02-07 13:20:53 -08004099func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004100 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004101 apex {
4102 name: "myapex",
4103 key: "myapex.key",
4104 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004105 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004106 }
4107
4108 apex_key {
4109 name: "myapex.key",
4110 public_key: "testkey.avbpubkey",
4111 private_key: "testkey.pem",
4112 }
4113
4114 cc_library {
4115 name: "mylib_common",
4116 srcs: ["mylib.cpp"],
4117 system_shared_libs: [],
4118 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004119 apex_available: [
4120 "//apex_available:platform",
4121 "myapex",
4122 ],
Alex Light0851b882019-02-07 13:20:53 -08004123 }
4124 `)
4125
Sundong Ahnabb64432019-10-22 13:58:29 +09004126 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004127 apexRule := module.Rule("apexRule")
4128 copyCmds := apexRule.Args["copy_commands"]
4129
4130 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4131 t.Log("Apex was a test apex!")
4132 t.Fail()
4133 }
4134 // Ensure that main rule creates an output
4135 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4136
4137 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004138 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004139
4140 // Ensure that both direct and indirect deps are copied into apex
4141 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4142
Colin Cross7113d202019-11-20 16:39:12 -08004143 // Ensure that the platform variant ends with _shared
4144 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004145
Colin Cross56a83212020-09-15 18:30:11 -07004146 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004147 t.Log("Found mylib_common not in any apex!")
4148 t.Fail()
4149 }
4150}
4151
4152func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004153 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004154 apex_test {
4155 name: "myapex",
4156 key: "myapex.key",
4157 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004158 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004159 }
4160
4161 apex_key {
4162 name: "myapex.key",
4163 public_key: "testkey.avbpubkey",
4164 private_key: "testkey.pem",
4165 }
4166
4167 cc_library {
4168 name: "mylib_common_test",
4169 srcs: ["mylib.cpp"],
4170 system_shared_libs: [],
4171 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004172 // TODO: remove //apex_available:platform
4173 apex_available: [
4174 "//apex_available:platform",
4175 "myapex",
4176 ],
Alex Light0851b882019-02-07 13:20:53 -08004177 }
4178 `)
4179
Sundong Ahnabb64432019-10-22 13:58:29 +09004180 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004181 apexRule := module.Rule("apexRule")
4182 copyCmds := apexRule.Args["copy_commands"]
4183
4184 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4185 t.Log("Apex was not a test apex!")
4186 t.Fail()
4187 }
4188 // Ensure that main rule creates an output
4189 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4190
4191 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004192 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004193
4194 // Ensure that both direct and indirect deps are copied into apex
4195 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4196
Colin Cross7113d202019-11-20 16:39:12 -08004197 // Ensure that the platform variant ends with _shared
4198 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004199}
4200
Alex Light9670d332019-01-29 18:07:33 -08004201func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004202 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004203 apex {
4204 name: "myapex",
4205 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004206 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004207 multilib: {
4208 first: {
4209 native_shared_libs: ["mylib_common"],
4210 }
4211 },
4212 target: {
4213 android: {
4214 multilib: {
4215 first: {
4216 native_shared_libs: ["mylib"],
4217 }
4218 }
4219 },
4220 host: {
4221 multilib: {
4222 first: {
4223 native_shared_libs: ["mylib2"],
4224 }
4225 }
4226 }
4227 }
4228 }
4229
4230 apex_key {
4231 name: "myapex.key",
4232 public_key: "testkey.avbpubkey",
4233 private_key: "testkey.pem",
4234 }
4235
4236 cc_library {
4237 name: "mylib",
4238 srcs: ["mylib.cpp"],
4239 system_shared_libs: [],
4240 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004241 // TODO: remove //apex_available:platform
4242 apex_available: [
4243 "//apex_available:platform",
4244 "myapex",
4245 ],
Alex Light9670d332019-01-29 18:07:33 -08004246 }
4247
4248 cc_library {
4249 name: "mylib_common",
4250 srcs: ["mylib.cpp"],
4251 system_shared_libs: [],
4252 stl: "none",
4253 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004254 // TODO: remove //apex_available:platform
4255 apex_available: [
4256 "//apex_available:platform",
4257 "myapex",
4258 ],
Alex Light9670d332019-01-29 18:07:33 -08004259 }
4260
4261 cc_library {
4262 name: "mylib2",
4263 srcs: ["mylib.cpp"],
4264 system_shared_libs: [],
4265 stl: "none",
4266 compile_multilib: "first",
4267 }
4268 `)
4269
Sundong Ahnabb64432019-10-22 13:58:29 +09004270 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004271 copyCmds := apexRule.Args["copy_commands"]
4272
4273 // Ensure that main rule creates an output
4274 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4275
4276 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004277 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4278 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4279 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004280
4281 // Ensure that both direct and indirect deps are copied into apex
4282 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4283 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4284 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4285
Colin Cross7113d202019-11-20 16:39:12 -08004286 // Ensure that the platform variant ends with _shared
4287 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4288 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4289 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004290}
Jiyong Park04480cf2019-02-06 00:16:29 +09004291
Jiyong Park59140302020-12-14 18:44:04 +09004292func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004293 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004294 apex {
4295 name: "myapex",
4296 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004297 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004298 arch: {
4299 arm64: {
4300 native_shared_libs: ["mylib.arm64"],
4301 },
4302 x86_64: {
4303 native_shared_libs: ["mylib.x64"],
4304 },
4305 }
4306 }
4307
4308 apex_key {
4309 name: "myapex.key",
4310 public_key: "testkey.avbpubkey",
4311 private_key: "testkey.pem",
4312 }
4313
4314 cc_library {
4315 name: "mylib.arm64",
4316 srcs: ["mylib.cpp"],
4317 system_shared_libs: [],
4318 stl: "none",
4319 // TODO: remove //apex_available:platform
4320 apex_available: [
4321 "//apex_available:platform",
4322 "myapex",
4323 ],
4324 }
4325
4326 cc_library {
4327 name: "mylib.x64",
4328 srcs: ["mylib.cpp"],
4329 system_shared_libs: [],
4330 stl: "none",
4331 // TODO: remove //apex_available:platform
4332 apex_available: [
4333 "//apex_available:platform",
4334 "myapex",
4335 ],
4336 }
4337 `)
4338
4339 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4340 copyCmds := apexRule.Args["copy_commands"]
4341
4342 // Ensure that apex variant is created for the direct dep
4343 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4344 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4345
4346 // Ensure that both direct and indirect deps are copied into apex
4347 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4348 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4349}
4350
Jiyong Park04480cf2019-02-06 00:16:29 +09004351func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004352 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004353 apex {
4354 name: "myapex",
4355 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004356 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004357 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004358 }
4359
4360 apex_key {
4361 name: "myapex.key",
4362 public_key: "testkey.avbpubkey",
4363 private_key: "testkey.pem",
4364 }
4365
4366 sh_binary {
4367 name: "myscript",
4368 src: "mylib.cpp",
4369 filename: "myscript.sh",
4370 sub_dir: "script",
4371 }
4372 `)
4373
Sundong Ahnabb64432019-10-22 13:58:29 +09004374 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004375 copyCmds := apexRule.Args["copy_commands"]
4376
4377 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4378}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004379
Jooyung Han91df2082019-11-20 01:49:42 +09004380func TestApexInVariousPartition(t *testing.T) {
4381 testcases := []struct {
4382 propName, parition, flattenedPartition string
4383 }{
4384 {"", "system", "system_ext"},
4385 {"product_specific: true", "product", "product"},
4386 {"soc_specific: true", "vendor", "vendor"},
4387 {"proprietary: true", "vendor", "vendor"},
4388 {"vendor: true", "vendor", "vendor"},
4389 {"system_ext_specific: true", "system_ext", "system_ext"},
4390 }
4391 for _, tc := range testcases {
4392 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004393 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004394 apex {
4395 name: "myapex",
4396 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004397 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004398 `+tc.propName+`
4399 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004400
Jooyung Han91df2082019-11-20 01:49:42 +09004401 apex_key {
4402 name: "myapex.key",
4403 public_key: "testkey.avbpubkey",
4404 private_key: "testkey.pem",
4405 }
4406 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004407
Jooyung Han91df2082019-11-20 01:49:42 +09004408 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004409 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4410 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004411 if actual != expected {
4412 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4413 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004414
Jooyung Han91df2082019-11-20 01:49:42 +09004415 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004416 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4417 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004418 if actual != expected {
4419 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4420 }
4421 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004422 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004423}
Jiyong Park67882562019-03-21 01:11:21 +09004424
Jooyung Han580eb4f2020-06-24 19:33:06 +09004425func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004426 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004427 apex {
4428 name: "myapex",
4429 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004430 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004431 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004432
Jooyung Han580eb4f2020-06-24 19:33:06 +09004433 apex_key {
4434 name: "myapex.key",
4435 public_key: "testkey.avbpubkey",
4436 private_key: "testkey.pem",
4437 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004438 `)
4439 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004440 rule := module.Output("file_contexts")
4441 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4442}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004443
Jooyung Han580eb4f2020-06-24 19:33:06 +09004444func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004445 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004446 apex {
4447 name: "myapex",
4448 key: "myapex.key",
4449 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004450 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004451 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004452
Jooyung Han580eb4f2020-06-24 19:33:06 +09004453 apex_key {
4454 name: "myapex.key",
4455 public_key: "testkey.avbpubkey",
4456 private_key: "testkey.pem",
4457 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004458 `, withFiles(map[string][]byte{
4459 "my_own_file_contexts": nil,
4460 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004461}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004462
Jooyung Han580eb4f2020-06-24 19:33:06 +09004463func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004464 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004465 apex {
4466 name: "myapex",
4467 key: "myapex.key",
4468 product_specific: true,
4469 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004470 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004471 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004472
Jooyung Han580eb4f2020-06-24 19:33:06 +09004473 apex_key {
4474 name: "myapex.key",
4475 public_key: "testkey.avbpubkey",
4476 private_key: "testkey.pem",
4477 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004478 `)
4479
Colin Cross1c460562021-02-16 17:55:47 -08004480 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004481 apex {
4482 name: "myapex",
4483 key: "myapex.key",
4484 product_specific: true,
4485 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004486 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004487 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004488
Jooyung Han580eb4f2020-06-24 19:33:06 +09004489 apex_key {
4490 name: "myapex.key",
4491 public_key: "testkey.avbpubkey",
4492 private_key: "testkey.pem",
4493 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004494 `, withFiles(map[string][]byte{
4495 "product_specific_file_contexts": nil,
4496 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004497 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4498 rule := module.Output("file_contexts")
4499 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4500}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004501
Jooyung Han580eb4f2020-06-24 19:33:06 +09004502func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004503 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004504 apex {
4505 name: "myapex",
4506 key: "myapex.key",
4507 product_specific: true,
4508 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004509 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004510 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004511
Jooyung Han580eb4f2020-06-24 19:33:06 +09004512 apex_key {
4513 name: "myapex.key",
4514 public_key: "testkey.avbpubkey",
4515 private_key: "testkey.pem",
4516 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004517
Jooyung Han580eb4f2020-06-24 19:33:06 +09004518 filegroup {
4519 name: "my-file-contexts",
4520 srcs: ["product_specific_file_contexts"],
4521 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004522 `, withFiles(map[string][]byte{
4523 "product_specific_file_contexts": nil,
4524 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004525 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4526 rule := module.Output("file_contexts")
4527 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004528}
4529
Jiyong Park67882562019-03-21 01:11:21 +09004530func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004531 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004532 apex_key {
4533 name: "myapex.key",
4534 public_key: ":my.avbpubkey",
4535 private_key: ":my.pem",
4536 product_specific: true,
4537 }
4538
4539 filegroup {
4540 name: "my.avbpubkey",
4541 srcs: ["testkey2.avbpubkey"],
4542 }
4543
4544 filegroup {
4545 name: "my.pem",
4546 srcs: ["testkey2.pem"],
4547 }
4548 `)
4549
4550 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4551 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004552 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004553 if actual_pubkey != expected_pubkey {
4554 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4555 }
4556 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004557 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004558 if actual_privkey != expected_privkey {
4559 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4560 }
4561}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004562
4563func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004564 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004565 prebuilt_apex {
4566 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004567 arch: {
4568 arm64: {
4569 src: "myapex-arm64.apex",
4570 },
4571 arm: {
4572 src: "myapex-arm.apex",
4573 },
4574 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004575 }
4576 `)
4577
Wei Li340ee8e2022-03-18 17:33:24 -07004578 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4579 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004580
Jiyong Parkc95714e2019-03-29 14:23:10 +09004581 expectedInput := "myapex-arm64.apex"
4582 if prebuilt.inputApex.String() != expectedInput {
4583 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4584 }
Wei Li340ee8e2022-03-18 17:33:24 -07004585 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4586 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4587 rule := testingModule.Rule("genProvenanceMetaData")
4588 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4589 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4590 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4591 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004592}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004593
Paul Duffinc0609c62021-03-01 17:27:16 +00004594func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004595 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004596 prebuilt_apex {
4597 name: "myapex",
4598 }
4599 `)
4600}
4601
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004602func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004603 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004604 prebuilt_apex {
4605 name: "myapex",
4606 src: "myapex-arm.apex",
4607 filename: "notmyapex.apex",
4608 }
4609 `)
4610
Wei Li340ee8e2022-03-18 17:33:24 -07004611 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4612 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004613
4614 expected := "notmyapex.apex"
4615 if p.installFilename != expected {
4616 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4617 }
Wei Li340ee8e2022-03-18 17:33:24 -07004618 rule := testingModule.Rule("genProvenanceMetaData")
4619 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4620 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4621 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4622 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004623}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004624
Samiul Islam7c02e262021-09-08 17:48:28 +01004625func TestApexSetFilenameOverride(t *testing.T) {
4626 testApex(t, `
4627 apex_set {
4628 name: "com.company.android.myapex",
4629 apex_name: "com.android.myapex",
4630 set: "company-myapex.apks",
4631 filename: "com.company.android.myapex.apex"
4632 }
4633 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4634
4635 testApex(t, `
4636 apex_set {
4637 name: "com.company.android.myapex",
4638 apex_name: "com.android.myapex",
4639 set: "company-myapex.apks",
4640 filename: "com.company.android.myapex.capex"
4641 }
4642 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4643
4644 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4645 apex_set {
4646 name: "com.company.android.myapex",
4647 apex_name: "com.android.myapex",
4648 set: "company-myapex.apks",
4649 filename: "some-random-suffix"
4650 }
4651 `)
4652}
4653
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004654func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004655 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004656 prebuilt_apex {
4657 name: "myapex.prebuilt",
4658 src: "myapex-arm.apex",
4659 overrides: [
4660 "myapex",
4661 ],
4662 }
4663 `)
4664
Wei Li340ee8e2022-03-18 17:33:24 -07004665 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4666 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004667
4668 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004669 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004670 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004671 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004672 }
Wei Li340ee8e2022-03-18 17:33:24 -07004673 rule := testingModule.Rule("genProvenanceMetaData")
4674 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4675 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4676 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4677 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004678}
4679
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004680func TestPrebuiltApexName(t *testing.T) {
4681 testApex(t, `
4682 prebuilt_apex {
4683 name: "com.company.android.myapex",
4684 apex_name: "com.android.myapex",
4685 src: "company-myapex-arm.apex",
4686 }
4687 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4688
4689 testApex(t, `
4690 apex_set {
4691 name: "com.company.android.myapex",
4692 apex_name: "com.android.myapex",
4693 set: "company-myapex.apks",
4694 }
4695 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4696}
4697
4698func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4699 _ = android.GroupFixturePreparers(
4700 java.PrepareForTestWithJavaDefaultModules,
4701 PrepareForTestWithApexBuildComponents,
4702 android.FixtureWithRootAndroidBp(`
4703 platform_bootclasspath {
4704 name: "platform-bootclasspath",
4705 fragments: [
4706 {
4707 apex: "com.android.art",
4708 module: "art-bootclasspath-fragment",
4709 },
4710 ],
4711 }
4712
4713 prebuilt_apex {
4714 name: "com.company.android.art",
4715 apex_name: "com.android.art",
4716 src: "com.company.android.art-arm.apex",
4717 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4718 }
4719
4720 prebuilt_bootclasspath_fragment {
4721 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004722 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004723 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004724 hidden_api: {
4725 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4726 metadata: "my-bootclasspath-fragment/metadata.csv",
4727 index: "my-bootclasspath-fragment/index.csv",
4728 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4729 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4730 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004731 }
4732
4733 java_import {
4734 name: "core-oj",
4735 jars: ["prebuilt.jar"],
4736 }
4737 `),
4738 ).RunTest(t)
4739}
4740
Paul Duffin092153d2021-01-26 11:42:39 +00004741// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4742// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004743func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004744 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004745
Paul Duffin89886cb2021-02-05 16:44:03 +00004746 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004747 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004748 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004749 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004750 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004751 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004752 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4753 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4754 android.NormalizePathForTesting(dexJarBuildPath))
4755 }
4756
4757 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004758 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004759 // Make sure the import has been given the correct path to the dex jar.
4760 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4761 dexJarBuildPath := p.DexJarInstallPath()
4762 stem := android.RemoveOptionalPrebuiltPrefix(name)
4763 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4764 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4765 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004766 }
4767
Paul Duffin39853512021-02-26 11:09:39 +00004768 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004769 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004770 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004771 android.AssertArrayString(t, "Check if there is no source variant",
4772 []string{"android_common"},
4773 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004774 }
4775
4776 t.Run("prebuilt only", func(t *testing.T) {
4777 bp := `
4778 prebuilt_apex {
4779 name: "myapex",
4780 arch: {
4781 arm64: {
4782 src: "myapex-arm64.apex",
4783 },
4784 arm: {
4785 src: "myapex-arm.apex",
4786 },
4787 },
Paul Duffin39853512021-02-26 11:09:39 +00004788 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004789 }
4790
4791 java_import {
4792 name: "libfoo",
4793 jars: ["libfoo.jar"],
4794 }
Paul Duffin39853512021-02-26 11:09:39 +00004795
4796 java_sdk_library_import {
4797 name: "libbar",
4798 public: {
4799 jars: ["libbar.jar"],
4800 },
4801 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004802 `
4803
4804 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4805 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4806
Martin Stjernholm44825602021-09-17 01:44:12 +01004807 deapexerName := deapexerModuleName("myapex")
4808 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4809
Paul Duffinf6932af2021-02-26 18:21:56 +00004810 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004811 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004812 rule := deapexer.Rule("deapexer")
4813 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4814 t.Errorf("expected: %q, found: %q", expected, actual)
4815 }
4816
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004817 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004818 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004819 rule = prebuiltApex.Rule("android/soong/android.Cp")
4820 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4821 t.Errorf("expected: %q, found: %q", expected, actual)
4822 }
4823
Paul Duffin89886cb2021-02-05 16:44:03 +00004824 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004825 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004826
4827 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004828 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004829 })
4830
4831 t.Run("prebuilt with source preferred", func(t *testing.T) {
4832
4833 bp := `
4834 prebuilt_apex {
4835 name: "myapex",
4836 arch: {
4837 arm64: {
4838 src: "myapex-arm64.apex",
4839 },
4840 arm: {
4841 src: "myapex-arm.apex",
4842 },
4843 },
Paul Duffin39853512021-02-26 11:09:39 +00004844 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004845 }
4846
4847 java_import {
4848 name: "libfoo",
4849 jars: ["libfoo.jar"],
4850 }
4851
4852 java_library {
4853 name: "libfoo",
4854 }
Paul Duffin39853512021-02-26 11:09:39 +00004855
4856 java_sdk_library_import {
4857 name: "libbar",
4858 public: {
4859 jars: ["libbar.jar"],
4860 },
4861 }
4862
4863 java_sdk_library {
4864 name: "libbar",
4865 srcs: ["foo/bar/MyClass.java"],
4866 unsafe_ignore_missing_latest_api: true,
4867 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004868 `
4869
4870 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4871 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4872
Paul Duffin89886cb2021-02-05 16:44:03 +00004873 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004874 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004875 ensureNoSourceVariant(t, ctx, "libfoo")
4876
4877 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004878 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004879 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004880 })
4881
4882 t.Run("prebuilt preferred with source", func(t *testing.T) {
4883 bp := `
4884 prebuilt_apex {
4885 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004886 arch: {
4887 arm64: {
4888 src: "myapex-arm64.apex",
4889 },
4890 arm: {
4891 src: "myapex-arm.apex",
4892 },
4893 },
Paul Duffin39853512021-02-26 11:09:39 +00004894 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004895 }
4896
4897 java_import {
4898 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004899 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004900 jars: ["libfoo.jar"],
4901 }
4902
4903 java_library {
4904 name: "libfoo",
4905 }
Paul Duffin39853512021-02-26 11:09:39 +00004906
4907 java_sdk_library_import {
4908 name: "libbar",
4909 prefer: true,
4910 public: {
4911 jars: ["libbar.jar"],
4912 },
4913 }
4914
4915 java_sdk_library {
4916 name: "libbar",
4917 srcs: ["foo/bar/MyClass.java"],
4918 unsafe_ignore_missing_latest_api: true,
4919 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004920 `
4921
4922 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4923 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4924
Paul Duffin89886cb2021-02-05 16:44:03 +00004925 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004926 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004927 ensureNoSourceVariant(t, ctx, "libfoo")
4928
4929 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004930 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004931 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004932 })
4933}
4934
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004935func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004936 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004937 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004938 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4939 // is disabled.
4940 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4941 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004942
Paul Duffin37856732021-02-26 14:24:15 +00004943 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4944 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004945 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004946 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004947 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004948 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004949 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004950 foundLibfooJar = true
4951 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004952 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004953 }
4954 }
4955 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004956 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004957 }
4958 }
4959
Paul Duffin40a3f652021-07-19 13:11:24 +01004960 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004961 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004962 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004963 var rule android.TestingBuildParams
4964
4965 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4966 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004967 }
4968
Paul Duffin40a3f652021-07-19 13:11:24 +01004969 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4970 t.Helper()
4971 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4972 var rule android.TestingBuildParams
4973
4974 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4975 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4976 }
4977
Paul Duffin89f570a2021-06-16 01:42:33 +01004978 fragment := java.ApexVariantReference{
4979 Apex: proptools.StringPtr("myapex"),
4980 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4981 }
4982
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004983 t.Run("prebuilt only", func(t *testing.T) {
4984 bp := `
4985 prebuilt_apex {
4986 name: "myapex",
4987 arch: {
4988 arm64: {
4989 src: "myapex-arm64.apex",
4990 },
4991 arm: {
4992 src: "myapex-arm.apex",
4993 },
4994 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004995 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4996 }
4997
4998 prebuilt_bootclasspath_fragment {
4999 name: "my-bootclasspath-fragment",
5000 contents: ["libfoo", "libbar"],
5001 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005002 hidden_api: {
5003 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5004 metadata: "my-bootclasspath-fragment/metadata.csv",
5005 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005006 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5007 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5008 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005009 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005010 }
5011
5012 java_import {
5013 name: "libfoo",
5014 jars: ["libfoo.jar"],
5015 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005016 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005017 }
Paul Duffin37856732021-02-26 14:24:15 +00005018
5019 java_sdk_library_import {
5020 name: "libbar",
5021 public: {
5022 jars: ["libbar.jar"],
5023 },
5024 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005025 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005026 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005027 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005028 `
5029
Paul Duffin89f570a2021-06-16 01:42:33 +01005030 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005031 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5032 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005033
Paul Duffin537ea3d2021-05-14 10:38:00 +01005034 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005035 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005036 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005037 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005038 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5039 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005040 })
5041
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005042 t.Run("apex_set only", func(t *testing.T) {
5043 bp := `
5044 apex_set {
5045 name: "myapex",
5046 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005047 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5048 }
5049
5050 prebuilt_bootclasspath_fragment {
5051 name: "my-bootclasspath-fragment",
5052 contents: ["libfoo", "libbar"],
5053 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005054 hidden_api: {
5055 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5056 metadata: "my-bootclasspath-fragment/metadata.csv",
5057 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005058 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5059 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5060 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005061 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005062 }
5063
5064 java_import {
5065 name: "libfoo",
5066 jars: ["libfoo.jar"],
5067 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005068 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005069 }
5070
5071 java_sdk_library_import {
5072 name: "libbar",
5073 public: {
5074 jars: ["libbar.jar"],
5075 },
5076 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005077 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005078 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005079 }
5080 `
5081
Paul Duffin89f570a2021-06-16 01:42:33 +01005082 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005083 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5084 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5085
Paul Duffin537ea3d2021-05-14 10:38:00 +01005086 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005087 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005088 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005089 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005090 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5091 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005092 })
5093
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005094 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5095 bp := `
5096 prebuilt_apex {
5097 name: "myapex",
5098 arch: {
5099 arm64: {
5100 src: "myapex-arm64.apex",
5101 },
5102 arm: {
5103 src: "myapex-arm.apex",
5104 },
5105 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005106 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5107 }
5108
5109 prebuilt_bootclasspath_fragment {
5110 name: "my-bootclasspath-fragment",
5111 contents: ["libfoo", "libbar"],
5112 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005113 hidden_api: {
5114 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5115 metadata: "my-bootclasspath-fragment/metadata.csv",
5116 index: "my-bootclasspath-fragment/index.csv",
5117 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5118 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5119 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005120 }
5121
5122 java_import {
5123 name: "libfoo",
5124 jars: ["libfoo.jar"],
5125 apex_available: ["myapex"],
5126 }
5127
5128 java_library {
5129 name: "libfoo",
5130 srcs: ["foo/bar/MyClass.java"],
5131 apex_available: ["myapex"],
5132 }
Paul Duffin37856732021-02-26 14:24:15 +00005133
5134 java_sdk_library_import {
5135 name: "libbar",
5136 public: {
5137 jars: ["libbar.jar"],
5138 },
5139 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005140 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005141 }
5142
5143 java_sdk_library {
5144 name: "libbar",
5145 srcs: ["foo/bar/MyClass.java"],
5146 unsafe_ignore_missing_latest_api: true,
5147 apex_available: ["myapex"],
5148 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005149 `
5150
5151 // In this test the source (java_library) libfoo is active since the
5152 // prebuilt (java_import) defaults to prefer:false. However the
5153 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5154 // find the dex boot jar in it. We either need to disable the source libfoo
5155 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005156 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005157 // dexbootjar check is skipped if AllowMissingDependencies is true
5158 preparerAllowMissingDeps := android.GroupFixturePreparers(
5159 preparer,
5160 android.PrepareForTestWithAllowMissingDependencies,
5161 )
5162 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005163 })
5164
5165 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5166 bp := `
5167 prebuilt_apex {
5168 name: "myapex",
5169 arch: {
5170 arm64: {
5171 src: "myapex-arm64.apex",
5172 },
5173 arm: {
5174 src: "myapex-arm.apex",
5175 },
5176 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005177 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5178 }
5179
5180 prebuilt_bootclasspath_fragment {
5181 name: "my-bootclasspath-fragment",
5182 contents: ["libfoo", "libbar"],
5183 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005184 hidden_api: {
5185 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5186 metadata: "my-bootclasspath-fragment/metadata.csv",
5187 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005188 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5189 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5190 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005191 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005192 }
5193
5194 java_import {
5195 name: "libfoo",
5196 prefer: true,
5197 jars: ["libfoo.jar"],
5198 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005199 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005200 }
5201
5202 java_library {
5203 name: "libfoo",
5204 srcs: ["foo/bar/MyClass.java"],
5205 apex_available: ["myapex"],
5206 }
Paul Duffin37856732021-02-26 14:24:15 +00005207
5208 java_sdk_library_import {
5209 name: "libbar",
5210 prefer: true,
5211 public: {
5212 jars: ["libbar.jar"],
5213 },
5214 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005215 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005216 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005217 }
5218
5219 java_sdk_library {
5220 name: "libbar",
5221 srcs: ["foo/bar/MyClass.java"],
5222 unsafe_ignore_missing_latest_api: true,
5223 apex_available: ["myapex"],
5224 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005225 `
5226
Paul Duffin89f570a2021-06-16 01:42:33 +01005227 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005228 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5229 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005230
Paul Duffin537ea3d2021-05-14 10:38:00 +01005231 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005232 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005233 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005234 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005235 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5236 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005237 })
5238
5239 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5240 bp := `
5241 apex {
5242 name: "myapex",
5243 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005244 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005245 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005246 }
5247
5248 apex_key {
5249 name: "myapex.key",
5250 public_key: "testkey.avbpubkey",
5251 private_key: "testkey.pem",
5252 }
5253
5254 prebuilt_apex {
5255 name: "myapex",
5256 arch: {
5257 arm64: {
5258 src: "myapex-arm64.apex",
5259 },
5260 arm: {
5261 src: "myapex-arm.apex",
5262 },
5263 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005264 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5265 }
5266
5267 prebuilt_bootclasspath_fragment {
5268 name: "my-bootclasspath-fragment",
5269 contents: ["libfoo", "libbar"],
5270 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005271 hidden_api: {
5272 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5273 metadata: "my-bootclasspath-fragment/metadata.csv",
5274 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005275 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5276 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5277 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005278 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005279 }
5280
5281 java_import {
5282 name: "libfoo",
5283 jars: ["libfoo.jar"],
5284 apex_available: ["myapex"],
5285 }
5286
5287 java_library {
5288 name: "libfoo",
5289 srcs: ["foo/bar/MyClass.java"],
5290 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005291 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005292 }
Paul Duffin37856732021-02-26 14:24:15 +00005293
5294 java_sdk_library_import {
5295 name: "libbar",
5296 public: {
5297 jars: ["libbar.jar"],
5298 },
5299 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005300 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005301 }
5302
5303 java_sdk_library {
5304 name: "libbar",
5305 srcs: ["foo/bar/MyClass.java"],
5306 unsafe_ignore_missing_latest_api: true,
5307 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005308 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005309 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005310 `
5311
Paul Duffin89f570a2021-06-16 01:42:33 +01005312 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005313 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5314 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005315
Paul Duffin537ea3d2021-05-14 10:38:00 +01005316 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005317 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005318 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005319 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005320 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5321 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005322 })
5323
5324 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5325 bp := `
5326 apex {
5327 name: "myapex",
5328 enabled: false,
5329 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005330 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005331 }
5332
5333 apex_key {
5334 name: "myapex.key",
5335 public_key: "testkey.avbpubkey",
5336 private_key: "testkey.pem",
5337 }
5338
5339 prebuilt_apex {
5340 name: "myapex",
5341 arch: {
5342 arm64: {
5343 src: "myapex-arm64.apex",
5344 },
5345 arm: {
5346 src: "myapex-arm.apex",
5347 },
5348 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005349 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5350 }
5351
5352 prebuilt_bootclasspath_fragment {
5353 name: "my-bootclasspath-fragment",
5354 contents: ["libfoo", "libbar"],
5355 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005356 hidden_api: {
5357 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5358 metadata: "my-bootclasspath-fragment/metadata.csv",
5359 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005360 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5361 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5362 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005363 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005364 }
5365
5366 java_import {
5367 name: "libfoo",
5368 prefer: true,
5369 jars: ["libfoo.jar"],
5370 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005371 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005372 }
5373
5374 java_library {
5375 name: "libfoo",
5376 srcs: ["foo/bar/MyClass.java"],
5377 apex_available: ["myapex"],
5378 }
Paul Duffin37856732021-02-26 14:24:15 +00005379
5380 java_sdk_library_import {
5381 name: "libbar",
5382 prefer: true,
5383 public: {
5384 jars: ["libbar.jar"],
5385 },
5386 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005387 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005388 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005389 }
5390
5391 java_sdk_library {
5392 name: "libbar",
5393 srcs: ["foo/bar/MyClass.java"],
5394 unsafe_ignore_missing_latest_api: true,
5395 apex_available: ["myapex"],
5396 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005397 `
5398
Paul Duffin89f570a2021-06-16 01:42:33 +01005399 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005400 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5401 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005402
Paul Duffin537ea3d2021-05-14 10:38:00 +01005403 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005404 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005405 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005406 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005407 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5408 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005409 })
5410}
5411
Roland Levillain630846d2019-06-26 12:48:34 +01005412func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005413 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005414 apex_test {
5415 name: "myapex",
5416 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005417 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005418 tests: [
5419 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005420 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005421 ],
5422 }
5423
5424 apex_key {
5425 name: "myapex.key",
5426 public_key: "testkey.avbpubkey",
5427 private_key: "testkey.pem",
5428 }
5429
Liz Kammer1c14a212020-05-12 15:26:55 -07005430 filegroup {
5431 name: "fg",
5432 srcs: [
5433 "baz",
5434 "bar/baz"
5435 ],
5436 }
5437
Roland Levillain630846d2019-06-26 12:48:34 +01005438 cc_test {
5439 name: "mytest",
5440 gtest: false,
5441 srcs: ["mytest.cpp"],
5442 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005443 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005444 system_shared_libs: [],
5445 static_executable: true,
5446 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005447 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005448 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005449
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005450 cc_library {
5451 name: "mylib",
5452 srcs: ["mylib.cpp"],
5453 system_shared_libs: [],
5454 stl: "none",
5455 }
5456
Liz Kammer5bd365f2020-05-27 15:15:11 -07005457 filegroup {
5458 name: "fg2",
5459 srcs: [
5460 "testdata/baz"
5461 ],
5462 }
5463
Roland Levillain9b5fde92019-06-28 15:41:19 +01005464 cc_test {
5465 name: "mytests",
5466 gtest: false,
5467 srcs: [
5468 "mytest1.cpp",
5469 "mytest2.cpp",
5470 "mytest3.cpp",
5471 ],
5472 test_per_src: true,
5473 relative_install_path: "test",
5474 system_shared_libs: [],
5475 static_executable: true,
5476 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005477 data: [
5478 ":fg",
5479 ":fg2",
5480 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005481 }
Roland Levillain630846d2019-06-26 12:48:34 +01005482 `)
5483
Sundong Ahnabb64432019-10-22 13:58:29 +09005484 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005485 copyCmds := apexRule.Args["copy_commands"]
5486
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005487 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005488 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005489 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005490
Liz Kammer1c14a212020-05-12 15:26:55 -07005491 //Ensure that test data are copied into apex.
5492 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5493 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5494
Roland Levillain9b5fde92019-06-28 15:41:19 +01005495 // Ensure that test deps built with `test_per_src` are copied into apex.
5496 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5497 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5498 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005499
5500 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005501 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005502 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005503 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005504 prefix := "TARGET_"
5505 var builder strings.Builder
5506 data.Custom(&builder, name, prefix, "", data)
5507 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005508 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5509 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5510 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5511 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005512 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005513 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005514 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005515
5516 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005517 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005518 data.Custom(&builder, name, prefix, "", data)
5519 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005520 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5521 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005522}
5523
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005524func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005525 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005526 apex {
5527 name: "myapex",
5528 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005529 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005530 }
5531 apex_key {
5532 name: "myapex.key",
5533 public_key: "testkey.avbpubkey",
5534 private_key: "testkey.pem",
5535 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005536 `,
5537 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5538 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5539 }),
5540 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005541 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005542 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005543 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005544 var builder strings.Builder
5545 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5546 androidMk := builder.String()
5547 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5548}
5549
Jooyung Hand48f3c32019-08-23 11:18:57 +09005550func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5551 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5552 apex {
5553 name: "myapex",
5554 key: "myapex.key",
5555 native_shared_libs: ["libfoo"],
5556 }
5557
5558 apex_key {
5559 name: "myapex.key",
5560 public_key: "testkey.avbpubkey",
5561 private_key: "testkey.pem",
5562 }
5563
5564 cc_library {
5565 name: "libfoo",
5566 stl: "none",
5567 system_shared_libs: [],
5568 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005569 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005570 }
5571 `)
5572 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5573 apex {
5574 name: "myapex",
5575 key: "myapex.key",
5576 java_libs: ["myjar"],
5577 }
5578
5579 apex_key {
5580 name: "myapex.key",
5581 public_key: "testkey.avbpubkey",
5582 private_key: "testkey.pem",
5583 }
5584
5585 java_library {
5586 name: "myjar",
5587 srcs: ["foo/bar/MyClass.java"],
5588 sdk_version: "none",
5589 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005590 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005591 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005592 }
5593 `)
5594}
5595
Bill Peckhama41a6962021-01-11 10:58:54 -08005596func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005597 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005598 apex {
5599 name: "myapex",
5600 key: "myapex.key",
5601 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005602 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005603 }
5604
5605 apex_key {
5606 name: "myapex.key",
5607 public_key: "testkey.avbpubkey",
5608 private_key: "testkey.pem",
5609 }
5610
5611 java_import {
5612 name: "myjavaimport",
5613 apex_available: ["myapex"],
5614 jars: ["my.jar"],
5615 compile_dex: true,
5616 }
5617 `)
5618
5619 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5620 apexRule := module.Rule("apexRule")
5621 copyCmds := apexRule.Args["copy_commands"]
5622 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5623}
5624
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005625func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005626 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005627 apex {
5628 name: "myapex",
5629 key: "myapex.key",
5630 apps: [
5631 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005632 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005633 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005634 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005635 }
5636
5637 apex_key {
5638 name: "myapex.key",
5639 public_key: "testkey.avbpubkey",
5640 private_key: "testkey.pem",
5641 }
5642
5643 android_app {
5644 name: "AppFoo",
5645 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005646 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005647 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005648 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005650 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005651 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005652
5653 android_app {
5654 name: "AppFooPriv",
5655 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005656 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005657 system_modules: "none",
5658 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005659 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005660 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005661 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005662
5663 cc_library_shared {
5664 name: "libjni",
5665 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005666 shared_libs: ["libfoo"],
5667 stl: "none",
5668 system_shared_libs: [],
5669 apex_available: [ "myapex" ],
5670 sdk_version: "current",
5671 }
5672
5673 cc_library_shared {
5674 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005675 stl: "none",
5676 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005677 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005678 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005679 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005680 `)
5681
Sundong Ahnabb64432019-10-22 13:58:29 +09005682 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005683 apexRule := module.Rule("apexRule")
5684 copyCmds := apexRule.Args["copy_commands"]
5685
5686 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005687 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005688
Colin Crossaede88c2020-08-11 12:17:01 -07005689 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005690 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005691 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005692 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005693 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005694 // JNI libraries including transitive deps are
5695 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005696 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005697 // ... embedded inside APK (jnilibs.zip)
5698 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5699 // ... and not directly inside the APEX
5700 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5701 }
Dario Frenicde2a032019-10-27 00:29:22 +01005702}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005703
Dario Frenicde2a032019-10-27 00:29:22 +01005704func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005705 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005706 apex {
5707 name: "myapex",
5708 key: "myapex.key",
5709 apps: [
5710 "AppFooPrebuilt",
5711 "AppFooPrivPrebuilt",
5712 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005713 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005714 }
5715
5716 apex_key {
5717 name: "myapex.key",
5718 public_key: "testkey.avbpubkey",
5719 private_key: "testkey.pem",
5720 }
5721
5722 android_app_import {
5723 name: "AppFooPrebuilt",
5724 apk: "PrebuiltAppFoo.apk",
5725 presigned: true,
5726 dex_preopt: {
5727 enabled: false,
5728 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005729 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005730 }
5731
5732 android_app_import {
5733 name: "AppFooPrivPrebuilt",
5734 apk: "PrebuiltAppFooPriv.apk",
5735 privileged: true,
5736 presigned: true,
5737 dex_preopt: {
5738 enabled: false,
5739 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005740 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005741 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005742 }
5743 `)
5744
Sundong Ahnabb64432019-10-22 13:58:29 +09005745 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005746 apexRule := module.Rule("apexRule")
5747 copyCmds := apexRule.Args["copy_commands"]
5748
5749 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005750 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5751}
5752
5753func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005754 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005755 apex {
5756 name: "myapex",
5757 key: "myapex.key",
5758 apps: [
5759 "AppFoo",
5760 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005761 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005762 }
5763
5764 apex_key {
5765 name: "myapex.key",
5766 public_key: "testkey.avbpubkey",
5767 private_key: "testkey.pem",
5768 }
5769
5770 android_app {
5771 name: "AppFoo",
5772 srcs: ["foo/bar/MyClass.java"],
5773 sdk_version: "none",
5774 system_modules: "none",
5775 apex_available: [ "myapex" ],
5776 }
5777
5778 android_app_import {
5779 name: "AppFoo",
5780 apk: "AppFooPrebuilt.apk",
5781 filename: "AppFooPrebuilt.apk",
5782 presigned: true,
5783 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005784 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005785 }
5786 `, withFiles(map[string][]byte{
5787 "AppFooPrebuilt.apk": nil,
5788 }))
5789
5790 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005791 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005792 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005793}
5794
Dario Freni6f3937c2019-12-20 22:58:03 +00005795func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005796 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005797 apex {
5798 name: "myapex",
5799 key: "myapex.key",
5800 apps: [
5801 "TesterHelpAppFoo",
5802 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005803 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005804 }
5805
5806 apex_key {
5807 name: "myapex.key",
5808 public_key: "testkey.avbpubkey",
5809 private_key: "testkey.pem",
5810 }
5811
5812 android_test_helper_app {
5813 name: "TesterHelpAppFoo",
5814 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005815 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005816 }
5817
5818 `)
5819
5820 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5821 apexRule := module.Rule("apexRule")
5822 copyCmds := apexRule.Args["copy_commands"]
5823
5824 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5825}
5826
Jooyung Han18020ea2019-11-13 10:50:48 +09005827func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5828 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005829 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005830 apex {
5831 name: "myapex",
5832 key: "myapex.key",
5833 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005834 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005835 }
5836
5837 apex_key {
5838 name: "myapex.key",
5839 public_key: "testkey.avbpubkey",
5840 private_key: "testkey.pem",
5841 }
5842
5843 apex {
5844 name: "otherapex",
5845 key: "myapex.key",
5846 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005847 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005848 }
5849
5850 cc_defaults {
5851 name: "libfoo-defaults",
5852 apex_available: ["otherapex"],
5853 }
5854
5855 cc_library {
5856 name: "libfoo",
5857 defaults: ["libfoo-defaults"],
5858 stl: "none",
5859 system_shared_libs: [],
5860 }`)
5861}
5862
Paul Duffine52e66f2020-03-30 17:54:29 +01005863func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005864 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005865 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005866 apex {
5867 name: "myapex",
5868 key: "myapex.key",
5869 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005870 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005871 }
5872
5873 apex_key {
5874 name: "myapex.key",
5875 public_key: "testkey.avbpubkey",
5876 private_key: "testkey.pem",
5877 }
5878
5879 apex {
5880 name: "otherapex",
5881 key: "otherapex.key",
5882 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005883 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005884 }
5885
5886 apex_key {
5887 name: "otherapex.key",
5888 public_key: "testkey.avbpubkey",
5889 private_key: "testkey.pem",
5890 }
5891
5892 cc_library {
5893 name: "libfoo",
5894 stl: "none",
5895 system_shared_libs: [],
5896 apex_available: ["otherapex"],
5897 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005898}
Jiyong Park127b40b2019-09-30 16:04:35 +09005899
Paul Duffine52e66f2020-03-30 17:54:29 +01005900func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005901 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005902 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005903.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005904.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005905.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005906.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005907.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005908.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005909 apex {
5910 name: "myapex",
5911 key: "myapex.key",
5912 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005913 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005914 }
5915
5916 apex_key {
5917 name: "myapex.key",
5918 public_key: "testkey.avbpubkey",
5919 private_key: "testkey.pem",
5920 }
5921
Jiyong Park127b40b2019-09-30 16:04:35 +09005922 cc_library {
5923 name: "libfoo",
5924 stl: "none",
5925 shared_libs: ["libbar"],
5926 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005927 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005928 }
5929
5930 cc_library {
5931 name: "libbar",
5932 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005933 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005934 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005935 apex_available: ["myapex"],
5936 }
5937
5938 cc_library {
5939 name: "libbaz",
5940 stl: "none",
5941 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005942 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005943}
Jiyong Park127b40b2019-09-30 16:04:35 +09005944
Paul Duffine52e66f2020-03-30 17:54:29 +01005945func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005946 testApexError(t, "\"otherapex\" is not a valid module name", `
5947 apex {
5948 name: "myapex",
5949 key: "myapex.key",
5950 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005951 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005952 }
5953
5954 apex_key {
5955 name: "myapex.key",
5956 public_key: "testkey.avbpubkey",
5957 private_key: "testkey.pem",
5958 }
5959
5960 cc_library {
5961 name: "libfoo",
5962 stl: "none",
5963 system_shared_libs: [],
5964 apex_available: ["otherapex"],
5965 }`)
5966
Paul Duffine52e66f2020-03-30 17:54:29 +01005967 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005968 apex {
5969 name: "myapex",
5970 key: "myapex.key",
5971 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005972 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005973 }
5974
5975 apex_key {
5976 name: "myapex.key",
5977 public_key: "testkey.avbpubkey",
5978 private_key: "testkey.pem",
5979 }
5980
5981 cc_library {
5982 name: "libfoo",
5983 stl: "none",
5984 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005985 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005986 apex_available: ["myapex"],
5987 }
5988
5989 cc_library {
5990 name: "libbar",
5991 stl: "none",
5992 system_shared_libs: [],
5993 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005994 }
5995
5996 cc_library {
5997 name: "libbaz",
5998 stl: "none",
5999 system_shared_libs: [],
6000 stubs: {
6001 versions: ["10", "20", "30"],
6002 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006003 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006004}
Jiyong Park127b40b2019-09-30 16:04:35 +09006005
Jiyong Park89e850a2020-04-07 16:37:39 +09006006func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006007 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006008 apex {
6009 name: "myapex",
6010 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006011 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006012 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006013 }
6014
6015 apex_key {
6016 name: "myapex.key",
6017 public_key: "testkey.avbpubkey",
6018 private_key: "testkey.pem",
6019 }
6020
6021 cc_library {
6022 name: "libfoo",
6023 stl: "none",
6024 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006025 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006026 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006027 }
6028
6029 cc_library {
6030 name: "libfoo2",
6031 stl: "none",
6032 system_shared_libs: [],
6033 shared_libs: ["libbaz"],
6034 apex_available: ["//apex_available:platform"],
6035 }
6036
6037 cc_library {
6038 name: "libbar",
6039 stl: "none",
6040 system_shared_libs: [],
6041 apex_available: ["myapex"],
6042 }
6043
6044 cc_library {
6045 name: "libbaz",
6046 stl: "none",
6047 system_shared_libs: [],
6048 apex_available: ["myapex"],
6049 stubs: {
6050 versions: ["1"],
6051 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006052 }`)
6053
Jiyong Park89e850a2020-04-07 16:37:39 +09006054 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6055 // because it depends on libbar which isn't available to platform
6056 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6057 if libfoo.NotAvailableForPlatform() != true {
6058 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6059 }
6060
6061 // libfoo2 however can be available to platform because it depends on libbaz which provides
6062 // stubs
6063 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6064 if libfoo2.NotAvailableForPlatform() == true {
6065 t.Errorf("%q should be available to platform", libfoo2.String())
6066 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006067}
Jiyong Parka90ca002019-10-07 15:47:24 +09006068
Paul Duffine52e66f2020-03-30 17:54:29 +01006069func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006070 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006071 apex {
6072 name: "myapex",
6073 key: "myapex.key",
6074 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006075 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006076 }
6077
6078 apex_key {
6079 name: "myapex.key",
6080 public_key: "testkey.avbpubkey",
6081 private_key: "testkey.pem",
6082 }
6083
6084 cc_library {
6085 name: "libfoo",
6086 stl: "none",
6087 system_shared_libs: [],
6088 apex_available: ["myapex"],
6089 static: {
6090 apex_available: ["//apex_available:platform"],
6091 },
6092 }`)
6093
Jiyong Park89e850a2020-04-07 16:37:39 +09006094 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6095 if libfooShared.NotAvailableForPlatform() != true {
6096 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6097 }
6098 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6099 if libfooStatic.NotAvailableForPlatform() != false {
6100 t.Errorf("%q should be available to platform", libfooStatic.String())
6101 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006102}
6103
Jiyong Park5d790c32019-11-15 18:40:32 +09006104func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006105 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006106 apex {
6107 name: "myapex",
6108 key: "myapex.key",
6109 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006110 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006111 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006112 bootclasspath_fragments: ["mybootclasspath_fragment"],
6113 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6114 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006115 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006116 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006117 }
6118
6119 override_apex {
6120 name: "override_myapex",
6121 base: "myapex",
6122 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08006123 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006124 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006125 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6126 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6127 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006128 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006129 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006130 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006131 key: "mynewapex.key",
6132 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006133 }
6134
6135 apex_key {
6136 name: "myapex.key",
6137 public_key: "testkey.avbpubkey",
6138 private_key: "testkey.pem",
6139 }
6140
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006141 apex_key {
6142 name: "mynewapex.key",
6143 public_key: "testkey2.avbpubkey",
6144 private_key: "testkey2.pem",
6145 }
6146
6147 android_app_certificate {
6148 name: "myapex.certificate",
6149 certificate: "testkey",
6150 }
6151
Jiyong Park5d790c32019-11-15 18:40:32 +09006152 android_app {
6153 name: "app",
6154 srcs: ["foo/bar/MyClass.java"],
6155 package_name: "foo",
6156 sdk_version: "none",
6157 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006158 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006159 }
6160
6161 override_android_app {
6162 name: "override_app",
6163 base: "app",
6164 package_name: "bar",
6165 }
markchien7c803b82021-08-26 22:10:06 +08006166
6167 bpf {
6168 name: "bpf",
6169 srcs: ["bpf.c"],
6170 }
6171
6172 bpf {
6173 name: "override_bpf",
6174 srcs: ["override_bpf.c"],
6175 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006176
6177 prebuilt_etc {
6178 name: "myetc",
6179 src: "myprebuilt",
6180 }
6181
6182 prebuilt_etc {
6183 name: "override_myetc",
6184 src: "override_myprebuilt",
6185 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006186
6187 java_library {
6188 name: "bcplib",
6189 srcs: ["a.java"],
6190 compile_dex: true,
6191 apex_available: ["myapex"],
6192 permitted_packages: ["bcp.lib"],
6193 }
6194
6195 bootclasspath_fragment {
6196 name: "mybootclasspath_fragment",
6197 contents: ["bcplib"],
6198 apex_available: ["myapex"],
6199 }
6200
6201 java_library {
6202 name: "override_bcplib",
6203 srcs: ["a.java"],
6204 compile_dex: true,
6205 apex_available: ["myapex"],
6206 permitted_packages: ["override.bcp.lib"],
6207 }
6208
6209 bootclasspath_fragment {
6210 name: "override_bootclasspath_fragment",
6211 contents: ["override_bcplib"],
6212 apex_available: ["myapex"],
6213 }
6214
6215 java_library {
6216 name: "systemserverlib",
6217 srcs: ["a.java"],
6218 apex_available: ["myapex"],
6219 }
6220
6221 systemserverclasspath_fragment {
6222 name: "mysystemserverclasspath_fragment",
6223 standalone_contents: ["systemserverlib"],
6224 apex_available: ["myapex"],
6225 }
6226
6227 java_library {
6228 name: "override_systemserverlib",
6229 srcs: ["a.java"],
6230 apex_available: ["myapex"],
6231 }
6232
6233 systemserverclasspath_fragment {
6234 name: "override_systemserverclasspath_fragment",
6235 standalone_contents: ["override_systemserverlib"],
6236 apex_available: ["myapex"],
6237 }
6238
6239 java_library {
6240 name: "myjava_library",
6241 srcs: ["a.java"],
6242 compile_dex: true,
6243 apex_available: ["myapex"],
6244 }
6245
6246 java_library {
6247 name: "override_java_library",
6248 srcs: ["a.java"],
6249 compile_dex: true,
6250 apex_available: ["myapex"],
6251 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006252 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006253
Jiyong Park317645e2019-12-05 13:20:58 +09006254 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6255 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6256 if originalVariant.GetOverriddenBy() != "" {
6257 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6258 }
6259 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6260 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6261 }
6262
Jiyong Park5d790c32019-11-15 18:40:32 +09006263 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6264 apexRule := module.Rule("apexRule")
6265 copyCmds := apexRule.Args["copy_commands"]
6266
6267 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006268 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006269
markchien7c803b82021-08-26 22:10:06 +08006270 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6271 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6272
Daniel Norman5a3ce132021-08-26 15:44:43 -07006273 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6274 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6275
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006276 apexBundle := module.Module().(*apexBundle)
6277 name := apexBundle.Name()
6278 if name != "override_myapex" {
6279 t.Errorf("name should be \"override_myapex\", but was %q", name)
6280 }
6281
Baligh Uddin004d7172020-02-19 21:29:28 -08006282 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6283 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6284 }
6285
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006286 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6287 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6288 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6289 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6290 android.AssertArrayString(t, "Java_libs does not match",
6291 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6292
Jiyong Park20bacab2020-03-03 11:45:41 +09006293 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006294 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006295 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6296
6297 signApkRule := module.Rule("signapk")
6298 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006299
Colin Crossaa255532020-07-03 13:18:24 -07006300 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006301 var builder strings.Builder
6302 data.Custom(&builder, name, "TARGET_", "", data)
6303 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006304 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006305 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006306 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006307 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6308 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6309 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006310 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006311 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006312 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006313 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006314 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006315 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006316 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6317 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6318 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006319 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006320}
6321
Albert Martineefabcf2022-03-21 20:11:16 +00006322func TestMinSdkVersionOverride(t *testing.T) {
6323 // Override from 29 to 31
6324 minSdkOverride31 := "31"
6325 ctx := testApex(t, `
6326 apex {
6327 name: "myapex",
6328 key: "myapex.key",
6329 native_shared_libs: ["mylib"],
6330 updatable: true,
6331 min_sdk_version: "29"
6332 }
6333
6334 override_apex {
6335 name: "override_myapex",
6336 base: "myapex",
6337 logging_parent: "com.foo.bar",
6338 package_name: "test.overridden.package"
6339 }
6340
6341 apex_key {
6342 name: "myapex.key",
6343 public_key: "testkey.avbpubkey",
6344 private_key: "testkey.pem",
6345 }
6346
6347 cc_library {
6348 name: "mylib",
6349 srcs: ["mylib.cpp"],
6350 runtime_libs: ["libbar"],
6351 system_shared_libs: [],
6352 stl: "none",
6353 apex_available: [ "myapex" ],
6354 min_sdk_version: "apex_inherit"
6355 }
6356
6357 cc_library {
6358 name: "libbar",
6359 srcs: ["mylib.cpp"],
6360 system_shared_libs: [],
6361 stl: "none",
6362 apex_available: [ "myapex" ],
6363 min_sdk_version: "apex_inherit"
6364 }
6365
6366 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6367
6368 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6369 copyCmds := apexRule.Args["copy_commands"]
6370
6371 // Ensure that direct non-stubs dep is always included
6372 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6373
6374 // Ensure that runtime_libs dep in included
6375 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6376
6377 // Ensure libraries target overridden min_sdk_version value
6378 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6379}
6380
6381func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6382 // Attempt to override from 31 to 29, should be a NOOP
6383 minSdkOverride29 := "29"
6384 ctx := testApex(t, `
6385 apex {
6386 name: "myapex",
6387 key: "myapex.key",
6388 native_shared_libs: ["mylib"],
6389 updatable: true,
6390 min_sdk_version: "31"
6391 }
6392
6393 override_apex {
6394 name: "override_myapex",
6395 base: "myapex",
6396 logging_parent: "com.foo.bar",
6397 package_name: "test.overridden.package"
6398 }
6399
6400 apex_key {
6401 name: "myapex.key",
6402 public_key: "testkey.avbpubkey",
6403 private_key: "testkey.pem",
6404 }
6405
6406 cc_library {
6407 name: "mylib",
6408 srcs: ["mylib.cpp"],
6409 runtime_libs: ["libbar"],
6410 system_shared_libs: [],
6411 stl: "none",
6412 apex_available: [ "myapex" ],
6413 min_sdk_version: "apex_inherit"
6414 }
6415
6416 cc_library {
6417 name: "libbar",
6418 srcs: ["mylib.cpp"],
6419 system_shared_libs: [],
6420 stl: "none",
6421 apex_available: [ "myapex" ],
6422 min_sdk_version: "apex_inherit"
6423 }
6424
6425 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6426
6427 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6428 copyCmds := apexRule.Args["copy_commands"]
6429
6430 // Ensure that direct non-stubs dep is always included
6431 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6432
6433 // Ensure that runtime_libs dep in included
6434 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6435
6436 // Ensure libraries target the original min_sdk_version value rather than the overridden
6437 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6438}
6439
Jooyung Han214bf372019-11-12 13:03:50 +09006440func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006441 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006442 apex {
6443 name: "myapex",
6444 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006445 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006446 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006447 }
6448
6449 apex_key {
6450 name: "myapex.key",
6451 public_key: "testkey.avbpubkey",
6452 private_key: "testkey.pem",
6453 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006454
6455 cc_library {
6456 name: "mylib",
6457 srcs: ["mylib.cpp"],
6458 stl: "libc++",
6459 system_shared_libs: [],
6460 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006461 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006462 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006463 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006464
6465 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6466 args := module.Rule("apexRule").Args
6467 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006468 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006469
6470 // The copies of the libraries in the apex should have one more dependency than
6471 // the ones outside the apex, namely the unwinder. Ideally we should check
6472 // the dependency names directly here but for some reason the names are blank in
6473 // this test.
6474 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006475 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006476 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6477 if len(apexImplicits) != len(nonApexImplicits)+1 {
6478 t.Errorf("%q missing unwinder dep", lib)
6479 }
6480 }
Jooyung Han214bf372019-11-12 13:03:50 +09006481}
6482
Paul Duffine05480a2021-03-08 15:07:14 +00006483var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006484 "api/current.txt": nil,
6485 "api/removed.txt": nil,
6486 "api/system-current.txt": nil,
6487 "api/system-removed.txt": nil,
6488 "api/test-current.txt": nil,
6489 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006490
Anton Hanssondff2c782020-12-21 17:10:01 +00006491 "100/public/api/foo.txt": nil,
6492 "100/public/api/foo-removed.txt": nil,
6493 "100/system/api/foo.txt": nil,
6494 "100/system/api/foo-removed.txt": nil,
6495
Paul Duffineedc5d52020-06-12 17:46:39 +01006496 // For java_sdk_library_import
6497 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006498}
6499
Jooyung Han58f26ab2019-12-18 15:34:32 +09006500func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006501 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006502 apex {
6503 name: "myapex",
6504 key: "myapex.key",
6505 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006506 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006507 }
6508
6509 apex_key {
6510 name: "myapex.key",
6511 public_key: "testkey.avbpubkey",
6512 private_key: "testkey.pem",
6513 }
6514
6515 java_sdk_library {
6516 name: "foo",
6517 srcs: ["a.java"],
6518 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006519 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006520 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006521
6522 prebuilt_apis {
6523 name: "sdk",
6524 api_dirs: ["100"],
6525 }
Paul Duffin9b879592020-05-26 13:21:35 +01006526 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006527
6528 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006529 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006530 "javalib/foo.jar",
6531 "etc/permissions/foo.xml",
6532 })
6533 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006534 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006535 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 +09006536}
6537
Paul Duffin9b879592020-05-26 13:21:35 +01006538func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006539 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006540 apex {
6541 name: "myapex",
6542 key: "myapex.key",
6543 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006544 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006545 }
6546
6547 apex_key {
6548 name: "myapex.key",
6549 public_key: "testkey.avbpubkey",
6550 private_key: "testkey.pem",
6551 }
6552
6553 java_sdk_library {
6554 name: "foo",
6555 srcs: ["a.java"],
6556 api_packages: ["foo"],
6557 apex_available: ["myapex"],
6558 sdk_version: "none",
6559 system_modules: "none",
6560 }
6561
6562 java_library {
6563 name: "bar",
6564 srcs: ["a.java"],
6565 libs: ["foo"],
6566 apex_available: ["myapex"],
6567 sdk_version: "none",
6568 system_modules: "none",
6569 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006570
6571 prebuilt_apis {
6572 name: "sdk",
6573 api_dirs: ["100"],
6574 }
Paul Duffin9b879592020-05-26 13:21:35 +01006575 `, withFiles(filesForSdkLibrary))
6576
6577 // java_sdk_library installs both impl jar and permission XML
6578 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6579 "javalib/bar.jar",
6580 "javalib/foo.jar",
6581 "etc/permissions/foo.xml",
6582 })
6583
6584 // The bar library should depend on the implementation jar.
6585 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006586 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006587 t.Errorf("expected %q, found %#q", expected, actual)
6588 }
6589}
6590
6591func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006592 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006593 apex {
6594 name: "myapex",
6595 key: "myapex.key",
6596 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006597 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006598 }
6599
6600 apex_key {
6601 name: "myapex.key",
6602 public_key: "testkey.avbpubkey",
6603 private_key: "testkey.pem",
6604 }
6605
6606 java_sdk_library {
6607 name: "foo",
6608 srcs: ["a.java"],
6609 api_packages: ["foo"],
6610 apex_available: ["myapex"],
6611 sdk_version: "none",
6612 system_modules: "none",
6613 }
6614
6615 java_library {
6616 name: "bar",
6617 srcs: ["a.java"],
6618 libs: ["foo"],
6619 sdk_version: "none",
6620 system_modules: "none",
6621 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006622
6623 prebuilt_apis {
6624 name: "sdk",
6625 api_dirs: ["100"],
6626 }
Paul Duffin9b879592020-05-26 13:21:35 +01006627 `, withFiles(filesForSdkLibrary))
6628
6629 // java_sdk_library installs both impl jar and permission XML
6630 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6631 "javalib/foo.jar",
6632 "etc/permissions/foo.xml",
6633 })
6634
6635 // The bar library should depend on the stubs jar.
6636 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006637 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006638 t.Errorf("expected %q, found %#q", expected, actual)
6639 }
6640}
6641
Paul Duffineedc5d52020-06-12 17:46:39 +01006642func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006643 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006644 prebuilt_apis {
6645 name: "sdk",
6646 api_dirs: ["100"],
6647 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006648 withFiles(map[string][]byte{
6649 "apex/a.java": nil,
6650 "apex/apex_manifest.json": nil,
6651 "apex/Android.bp": []byte(`
6652 package {
6653 default_visibility: ["//visibility:private"],
6654 }
6655
6656 apex {
6657 name: "myapex",
6658 key: "myapex.key",
6659 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006660 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006661 }
6662
6663 apex_key {
6664 name: "myapex.key",
6665 public_key: "testkey.avbpubkey",
6666 private_key: "testkey.pem",
6667 }
6668
6669 java_library {
6670 name: "bar",
6671 srcs: ["a.java"],
6672 libs: ["foo"],
6673 apex_available: ["myapex"],
6674 sdk_version: "none",
6675 system_modules: "none",
6676 }
6677`),
6678 "source/a.java": nil,
6679 "source/api/current.txt": nil,
6680 "source/api/removed.txt": nil,
6681 "source/Android.bp": []byte(`
6682 package {
6683 default_visibility: ["//visibility:private"],
6684 }
6685
6686 java_sdk_library {
6687 name: "foo",
6688 visibility: ["//apex"],
6689 srcs: ["a.java"],
6690 api_packages: ["foo"],
6691 apex_available: ["myapex"],
6692 sdk_version: "none",
6693 system_modules: "none",
6694 public: {
6695 enabled: true,
6696 },
6697 }
6698`),
6699 "prebuilt/a.jar": nil,
6700 "prebuilt/Android.bp": []byte(`
6701 package {
6702 default_visibility: ["//visibility:private"],
6703 }
6704
6705 java_sdk_library_import {
6706 name: "foo",
6707 visibility: ["//apex", "//source"],
6708 apex_available: ["myapex"],
6709 prefer: true,
6710 public: {
6711 jars: ["a.jar"],
6712 },
6713 }
6714`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006715 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006716 )
6717
6718 // java_sdk_library installs both impl jar and permission XML
6719 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6720 "javalib/bar.jar",
6721 "javalib/foo.jar",
6722 "etc/permissions/foo.xml",
6723 })
6724
6725 // The bar library should depend on the implementation jar.
6726 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006727 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006728 t.Errorf("expected %q, found %#q", expected, actual)
6729 }
6730}
6731
6732func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6733 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6734 apex {
6735 name: "myapex",
6736 key: "myapex.key",
6737 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006738 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006739 }
6740
6741 apex_key {
6742 name: "myapex.key",
6743 public_key: "testkey.avbpubkey",
6744 private_key: "testkey.pem",
6745 }
6746
6747 java_sdk_library_import {
6748 name: "foo",
6749 apex_available: ["myapex"],
6750 prefer: true,
6751 public: {
6752 jars: ["a.jar"],
6753 },
6754 }
6755
6756 `, withFiles(filesForSdkLibrary))
6757}
6758
atrost6e126252020-01-27 17:01:16 +00006759func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006760 result := android.GroupFixturePreparers(
6761 prepareForApexTest,
6762 java.PrepareForTestWithPlatformCompatConfig,
6763 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006764 apex {
6765 name: "myapex",
6766 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006767 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006768 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006769 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006770 }
6771
6772 apex_key {
6773 name: "myapex.key",
6774 public_key: "testkey.avbpubkey",
6775 private_key: "testkey.pem",
6776 }
6777
6778 platform_compat_config {
6779 name: "myjar-platform-compat-config",
6780 src: ":myjar",
6781 }
6782
6783 java_library {
6784 name: "myjar",
6785 srcs: ["foo/bar/MyClass.java"],
6786 sdk_version: "none",
6787 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006788 apex_available: [ "myapex" ],
6789 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006790
6791 // Make sure that a preferred prebuilt does not affect the apex contents.
6792 prebuilt_platform_compat_config {
6793 name: "myjar-platform-compat-config",
6794 metadata: "compat-config/metadata.xml",
6795 prefer: true,
6796 }
atrost6e126252020-01-27 17:01:16 +00006797 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006798 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006799 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6800 "etc/compatconfig/myjar-platform-compat-config.xml",
6801 "javalib/myjar.jar",
6802 })
6803}
6804
Jiyong Park479321d2019-12-16 11:47:12 +09006805func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6806 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6807 apex {
6808 name: "myapex",
6809 key: "myapex.key",
6810 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006811 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006812 }
6813
6814 apex_key {
6815 name: "myapex.key",
6816 public_key: "testkey.avbpubkey",
6817 private_key: "testkey.pem",
6818 }
6819
6820 java_library {
6821 name: "myjar",
6822 srcs: ["foo/bar/MyClass.java"],
6823 sdk_version: "none",
6824 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006825 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006826 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006827 }
6828 `)
6829}
6830
Jiyong Park7afd1072019-12-30 16:56:33 +09006831func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006832 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006833 apex {
6834 name: "myapex",
6835 key: "myapex.key",
6836 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006837 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006838 }
6839
6840 apex_key {
6841 name: "myapex.key",
6842 public_key: "testkey.avbpubkey",
6843 private_key: "testkey.pem",
6844 }
6845
6846 cc_library {
6847 name: "mylib",
6848 srcs: ["mylib.cpp"],
6849 system_shared_libs: [],
6850 stl: "none",
6851 required: ["a", "b"],
6852 host_required: ["c", "d"],
6853 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006854 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006855 }
6856 `)
6857
6858 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006859 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006860 name := apexBundle.BaseModuleName()
6861 prefix := "TARGET_"
6862 var builder strings.Builder
6863 data.Custom(&builder, name, prefix, "", data)
6864 androidMk := builder.String()
6865 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6866 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6867 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6868}
6869
Jiyong Park7cd10e32020-01-14 09:22:18 +09006870func TestSymlinksFromApexToSystem(t *testing.T) {
6871 bp := `
6872 apex {
6873 name: "myapex",
6874 key: "myapex.key",
6875 native_shared_libs: ["mylib"],
6876 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006877 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006878 }
6879
Jiyong Park9d677202020-02-19 16:29:35 +09006880 apex {
6881 name: "myapex.updatable",
6882 key: "myapex.key",
6883 native_shared_libs: ["mylib"],
6884 java_libs: ["myjar"],
6885 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006886 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006887 }
6888
Jiyong Park7cd10e32020-01-14 09:22:18 +09006889 apex_key {
6890 name: "myapex.key",
6891 public_key: "testkey.avbpubkey",
6892 private_key: "testkey.pem",
6893 }
6894
6895 cc_library {
6896 name: "mylib",
6897 srcs: ["mylib.cpp"],
6898 shared_libs: ["myotherlib"],
6899 system_shared_libs: [],
6900 stl: "none",
6901 apex_available: [
6902 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006903 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006904 "//apex_available:platform",
6905 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006906 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006907 }
6908
6909 cc_library {
6910 name: "myotherlib",
6911 srcs: ["mylib.cpp"],
6912 system_shared_libs: [],
6913 stl: "none",
6914 apex_available: [
6915 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006916 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006917 "//apex_available:platform",
6918 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006919 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006920 }
6921
6922 java_library {
6923 name: "myjar",
6924 srcs: ["foo/bar/MyClass.java"],
6925 sdk_version: "none",
6926 system_modules: "none",
6927 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006928 apex_available: [
6929 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006930 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006931 "//apex_available:platform",
6932 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006933 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006934 }
6935
6936 java_library {
6937 name: "myotherjar",
6938 srcs: ["foo/bar/MyClass.java"],
6939 sdk_version: "none",
6940 system_modules: "none",
6941 apex_available: [
6942 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006943 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006944 "//apex_available:platform",
6945 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006946 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006947 }
6948 `
6949
6950 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6951 for _, f := range files {
6952 if f.path == file {
6953 if f.isLink {
6954 t.Errorf("%q is not a real file", file)
6955 }
6956 return
6957 }
6958 }
6959 t.Errorf("%q is not found", file)
6960 }
6961
6962 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6963 for _, f := range files {
6964 if f.path == file {
6965 if !f.isLink {
6966 t.Errorf("%q is not a symlink", file)
6967 }
6968 return
6969 }
6970 }
6971 t.Errorf("%q is not found", file)
6972 }
6973
Jiyong Park9d677202020-02-19 16:29:35 +09006974 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6975 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006976 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006977 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006978 ensureRealfileExists(t, files, "javalib/myjar.jar")
6979 ensureRealfileExists(t, files, "lib64/mylib.so")
6980 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6981
Jiyong Park9d677202020-02-19 16:29:35 +09006982 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6983 ensureRealfileExists(t, files, "javalib/myjar.jar")
6984 ensureRealfileExists(t, files, "lib64/mylib.so")
6985 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6986
6987 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006988 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006989 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006990 ensureRealfileExists(t, files, "javalib/myjar.jar")
6991 ensureRealfileExists(t, files, "lib64/mylib.so")
6992 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006993
6994 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6995 ensureRealfileExists(t, files, "javalib/myjar.jar")
6996 ensureRealfileExists(t, files, "lib64/mylib.so")
6997 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006998}
6999
Yo Chiange8128052020-07-23 20:09:18 +08007000func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007001 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007002 apex {
7003 name: "myapex",
7004 key: "myapex.key",
7005 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007006 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007007 }
7008
7009 apex_key {
7010 name: "myapex.key",
7011 public_key: "testkey.avbpubkey",
7012 private_key: "testkey.pem",
7013 }
7014
7015 cc_library_shared {
7016 name: "mylib",
7017 srcs: ["mylib.cpp"],
7018 shared_libs: ["myotherlib"],
7019 system_shared_libs: [],
7020 stl: "none",
7021 apex_available: [
7022 "myapex",
7023 "//apex_available:platform",
7024 ],
7025 }
7026
7027 cc_prebuilt_library_shared {
7028 name: "myotherlib",
7029 srcs: ["prebuilt.so"],
7030 system_shared_libs: [],
7031 stl: "none",
7032 apex_available: [
7033 "myapex",
7034 "//apex_available:platform",
7035 ],
7036 }
7037 `)
7038
7039 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007040 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007041 var builder strings.Builder
7042 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7043 androidMk := builder.String()
7044 // `myotherlib` is added to `myapex` as symlink
7045 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
7046 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7047 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7048 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09007049 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 +08007050}
7051
Jooyung Han643adc42020-02-27 13:50:06 +09007052func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007053 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007054 apex {
7055 name: "myapex",
7056 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007057 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007058 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007059 }
7060
7061 apex_key {
7062 name: "myapex.key",
7063 public_key: "testkey.avbpubkey",
7064 private_key: "testkey.pem",
7065 }
7066
7067 cc_library {
7068 name: "mylib",
7069 srcs: ["mylib.cpp"],
7070 shared_libs: ["mylib2"],
7071 system_shared_libs: [],
7072 stl: "none",
7073 apex_available: [ "myapex" ],
7074 }
7075
7076 cc_library {
7077 name: "mylib2",
7078 srcs: ["mylib.cpp"],
7079 system_shared_libs: [],
7080 stl: "none",
7081 apex_available: [ "myapex" ],
7082 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007083
7084 rust_ffi_shared {
7085 name: "libfoo.rust",
7086 crate_name: "foo",
7087 srcs: ["foo.rs"],
7088 shared_libs: ["libfoo.shared_from_rust"],
7089 prefer_rlib: true,
7090 apex_available: ["myapex"],
7091 }
7092
7093 cc_library_shared {
7094 name: "libfoo.shared_from_rust",
7095 srcs: ["mylib.cpp"],
7096 system_shared_libs: [],
7097 stl: "none",
7098 stubs: {
7099 versions: ["10", "11", "12"],
7100 },
7101 }
7102
Jooyung Han643adc42020-02-27 13:50:06 +09007103 `)
7104
7105 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7106 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007107 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007108 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7109 "lib64/mylib.so",
7110 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007111 "lib64/libfoo.rust.so",
7112 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7113 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007114 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007115
7116 // b/220397949
7117 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007118}
7119
Jooyung Han49f67012020-04-17 13:43:10 +09007120func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007121 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007122 apex {
7123 name: "myapex",
7124 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007125 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007126 }
7127 apex_key {
7128 name: "myapex.key",
7129 public_key: "testkey.avbpubkey",
7130 private_key: "testkey.pem",
7131 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007132 `,
7133 android.FixtureModifyConfig(func(config android.Config) {
7134 delete(config.Targets, android.Android)
7135 config.AndroidCommonTarget = android.Target{}
7136 }),
7137 )
Jooyung Han49f67012020-04-17 13:43:10 +09007138
7139 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7140 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7141 }
7142}
7143
Jiyong Parkbd159612020-02-28 15:22:21 +09007144func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007145 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007146 apex {
7147 name: "myapex",
7148 key: "myapex.key",
7149 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007150 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007151 }
7152
7153 apex_key {
7154 name: "myapex.key",
7155 public_key: "testkey.avbpubkey",
7156 private_key: "testkey.pem",
7157 }
7158
7159 android_app {
7160 name: "AppFoo",
7161 srcs: ["foo/bar/MyClass.java"],
7162 sdk_version: "none",
7163 system_modules: "none",
7164 apex_available: [ "myapex" ],
7165 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007166 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007167
Colin Crosscf371cc2020-11-13 11:48:42 -08007168 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007169 content := bundleConfigRule.Args["content"]
7170
7171 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007172 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09007173}
7174
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007175func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007176 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007177 apex {
7178 name: "myapex",
7179 key: "myapex.key",
7180 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007181 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007182 }
7183
7184 apex_key {
7185 name: "myapex.key",
7186 public_key: "testkey.avbpubkey",
7187 private_key: "testkey.pem",
7188 }
7189
7190 android_app_set {
7191 name: "AppSet",
7192 set: "AppSet.apks",
7193 }`)
7194 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007195 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007196 content := bundleConfigRule.Args["content"]
7197 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7198 s := mod.Rule("apexRule").Args["copy_commands"]
7199 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
7200 if len(copyCmds) != 3 {
7201 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
7202 }
7203 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
7204 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
7205 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
7206}
7207
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007208func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007209 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007210 apex_set {
7211 name: "myapex",
7212 filename: "foo_v2.apex",
7213 sanitized: {
7214 none: { set: "myapex.apks", },
7215 hwaddress: { set: "myapex.hwasan.apks", },
7216 },
Paul Duffin24704672021-04-06 16:09:30 +01007217 }
7218 `
7219 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007220
Paul Duffin24704672021-04-06 16:09:30 +01007221 // Check that the extractor produces the correct output file from the correct input file.
7222 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007223
Paul Duffin24704672021-04-06 16:09:30 +01007224 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7225 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007226
Paul Duffin24704672021-04-06 16:09:30 +01007227 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7228
7229 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007230 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7231 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007232
7233 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007234}
7235
Paul Duffin89f570a2021-06-16 01:42:33 +01007236func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007237 t.Helper()
7238
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007239 bp := `
7240 java_library {
7241 name: "some-updatable-apex-lib",
7242 srcs: ["a.java"],
7243 sdk_version: "current",
7244 apex_available: [
7245 "some-updatable-apex",
7246 ],
satayevabcd5972021-08-06 17:49:46 +01007247 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007248 }
7249
7250 java_library {
7251 name: "some-non-updatable-apex-lib",
7252 srcs: ["a.java"],
7253 apex_available: [
7254 "some-non-updatable-apex",
7255 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007256 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007257 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007258 }
7259
7260 bootclasspath_fragment {
7261 name: "some-non-updatable-fragment",
7262 contents: ["some-non-updatable-apex-lib"],
7263 apex_available: [
7264 "some-non-updatable-apex",
7265 ],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007266 }
7267
7268 java_library {
7269 name: "some-platform-lib",
7270 srcs: ["a.java"],
7271 sdk_version: "current",
7272 installable: true,
7273 }
7274
7275 java_library {
7276 name: "some-art-lib",
7277 srcs: ["a.java"],
7278 sdk_version: "current",
7279 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007280 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007281 ],
7282 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007283 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007284 }
7285
7286 apex {
7287 name: "some-updatable-apex",
7288 key: "some-updatable-apex.key",
7289 java_libs: ["some-updatable-apex-lib"],
7290 updatable: true,
7291 min_sdk_version: "current",
7292 }
7293
7294 apex {
7295 name: "some-non-updatable-apex",
7296 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007297 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007298 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007299 }
7300
7301 apex_key {
7302 name: "some-updatable-apex.key",
7303 }
7304
7305 apex_key {
7306 name: "some-non-updatable-apex.key",
7307 }
7308
7309 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007310 name: "com.android.art.debug",
7311 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007312 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007313 updatable: true,
7314 min_sdk_version: "current",
7315 }
7316
Paul Duffinf23bc472021-04-27 12:42:20 +01007317 bootclasspath_fragment {
7318 name: "art-bootclasspath-fragment",
7319 image_name: "art",
7320 contents: ["some-art-lib"],
7321 apex_available: [
7322 "com.android.art.debug",
7323 ],
7324 }
7325
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007326 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007327 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007328 }
7329
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007330 filegroup {
7331 name: "some-updatable-apex-file_contexts",
7332 srcs: [
7333 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7334 ],
7335 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007336
7337 filegroup {
7338 name: "some-non-updatable-apex-file_contexts",
7339 srcs: [
7340 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7341 ],
7342 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007343 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007344
Paul Duffin89f570a2021-06-16 01:42:33 +01007345 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007346}
7347
Paul Duffin89f570a2021-06-16 01:42:33 +01007348func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007349 t.Helper()
7350
Paul Duffin55607122021-03-30 23:32:51 +01007351 fs := android.MockFS{
7352 "a.java": nil,
7353 "a.jar": nil,
7354 "apex_manifest.json": nil,
7355 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007356 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007357 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7358 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7359 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007360 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007361 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007362
Paul Duffin55607122021-03-30 23:32:51 +01007363 errorHandler := android.FixtureExpectsNoErrors
7364 if errmsg != "" {
7365 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007366 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007367
Paul Duffin55607122021-03-30 23:32:51 +01007368 result := android.GroupFixturePreparers(
7369 cc.PrepareForTestWithCcDefaultModules,
7370 java.PrepareForTestWithHiddenApiBuildComponents,
7371 java.PrepareForTestWithJavaDefaultModules,
7372 java.PrepareForTestWithJavaSdkLibraryFiles,
7373 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007374 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007375 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007376 android.FixtureModifyMockFS(func(fs android.MockFS) {
7377 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7378 insert := ""
7379 for _, fragment := range fragments {
7380 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7381 }
7382 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7383 platform_bootclasspath {
7384 name: "platform-bootclasspath",
7385 fragments: [
7386 %s
7387 ],
7388 }
7389 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007390 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007391 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007392 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007393 ).
7394 ExtendWithErrorHandler(errorHandler).
7395 RunTestWithBp(t, bp)
7396
7397 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007398}
7399
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007400func TestDuplicateDeapexeresFromPrebuiltApexes(t *testing.T) {
7401 preparers := android.GroupFixturePreparers(
7402 java.PrepareForTestWithJavaDefaultModules,
7403 PrepareForTestWithApexBuildComponents,
7404 ).
7405 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7406 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7407
7408 bpBase := `
7409 apex_set {
7410 name: "com.android.myapex",
7411 installable: true,
7412 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7413 set: "myapex.apks",
7414 }
7415
7416 apex_set {
7417 name: "com.mycompany.android.myapex",
7418 apex_name: "com.android.myapex",
7419 installable: true,
7420 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7421 set: "company-myapex.apks",
7422 }
7423
7424 prebuilt_bootclasspath_fragment {
7425 name: "my-bootclasspath-fragment",
7426 apex_available: ["com.android.myapex"],
7427 %s
7428 }
7429 `
7430
7431 t.Run("java_import", func(t *testing.T) {
7432 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7433 java_import {
7434 name: "libfoo",
7435 jars: ["libfoo.jar"],
7436 apex_available: ["com.android.myapex"],
7437 }
7438 `)
7439 })
7440
7441 t.Run("java_sdk_library_import", func(t *testing.T) {
7442 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7443 java_sdk_library_import {
7444 name: "libfoo",
7445 public: {
7446 jars: ["libbar.jar"],
7447 },
7448 apex_available: ["com.android.myapex"],
7449 }
7450 `)
7451 })
7452
7453 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7454 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7455 image_name: "art",
7456 contents: ["libfoo"],
7457 `)+`
7458 java_sdk_library_import {
7459 name: "libfoo",
7460 public: {
7461 jars: ["libbar.jar"],
7462 },
7463 apex_available: ["com.android.myapex"],
7464 }
7465 `)
7466 })
7467}
7468
Jooyung Han548640b2020-04-27 12:10:30 +09007469func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7470 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7471 apex {
7472 name: "myapex",
7473 key: "myapex.key",
7474 updatable: true,
7475 }
7476
7477 apex_key {
7478 name: "myapex.key",
7479 public_key: "testkey.avbpubkey",
7480 private_key: "testkey.pem",
7481 }
7482 `)
7483}
7484
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007485func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7486 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7487 apex {
7488 name: "myapex",
7489 key: "myapex.key",
7490 }
7491
7492 apex_key {
7493 name: "myapex.key",
7494 public_key: "testkey.avbpubkey",
7495 private_key: "testkey.pem",
7496 }
7497 `)
7498}
7499
Daniel Norman69109112021-12-02 12:52:42 -08007500func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7501 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7502 apex {
7503 name: "myapex",
7504 key: "myapex.key",
7505 updatable: true,
7506 soc_specific: true,
7507 }
7508
7509 apex_key {
7510 name: "myapex.key",
7511 public_key: "testkey.avbpubkey",
7512 private_key: "testkey.pem",
7513 }
7514 `)
7515}
7516
satayevb98371c2021-06-15 16:49:50 +01007517func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7518 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7519 apex {
7520 name: "myapex",
7521 key: "myapex.key",
7522 systemserverclasspath_fragments: [
7523 "mysystemserverclasspathfragment",
7524 ],
7525 min_sdk_version: "29",
7526 updatable: true,
7527 }
7528
7529 apex_key {
7530 name: "myapex.key",
7531 public_key: "testkey.avbpubkey",
7532 private_key: "testkey.pem",
7533 }
7534
7535 java_library {
7536 name: "foo",
7537 srcs: ["b.java"],
7538 min_sdk_version: "29",
7539 installable: true,
7540 apex_available: [
7541 "myapex",
7542 ],
7543 }
7544
7545 systemserverclasspath_fragment {
7546 name: "mysystemserverclasspathfragment",
7547 generate_classpaths_proto: false,
7548 contents: [
7549 "foo",
7550 ],
7551 apex_available: [
7552 "myapex",
7553 ],
7554 }
satayevabcd5972021-08-06 17:49:46 +01007555 `,
7556 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7557 )
satayevb98371c2021-06-15 16:49:50 +01007558}
7559
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007560func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007561 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7562 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7563 // modules to be included in the BootJars.
7564 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7565 return android.GroupFixturePreparers(
7566 dexpreopt.FixtureSetBootJars(bootJars...),
7567 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7568 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7569 }),
7570 )
7571 }
7572
7573 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7574 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7575 // specified in the ArtApexJars configuration.
7576 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7577 return android.GroupFixturePreparers(
7578 dexpreopt.FixtureSetArtBootJars(bootJars...),
7579 dexpreopt.FixtureSetBootJars(bootJars...),
7580 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7581 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7582 }),
7583 )
7584 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007585
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007586 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007587 preparer := android.GroupFixturePreparers(
7588 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7589 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7590 )
7591 fragments := []java.ApexVariantReference{
7592 {
7593 Apex: proptools.StringPtr("com.android.art.debug"),
7594 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7595 },
7596 {
7597 Apex: proptools.StringPtr("some-non-updatable-apex"),
7598 Module: proptools.StringPtr("some-non-updatable-fragment"),
7599 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007600 }
satayevabcd5972021-08-06 17:49:46 +01007601 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007602 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007603
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007604 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007605 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7606 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007607 preparer := android.GroupFixturePreparers(
7608 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7609 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7610 )
Paul Duffin60264a02021-04-12 20:02:36 +01007611 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007612 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007613
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007614 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 +01007615 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 +01007616 // Update the dexpreopt ArtApexJars directly.
7617 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7618 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007619 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007620
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007621 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 +01007622 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 +01007623 // Update the dexpreopt ArtApexJars directly.
7624 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7625 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007626 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007627
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007628 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 +01007629 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 +01007630 preparer := android.GroupFixturePreparers(
7631 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7632 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7633 )
Paul Duffin60264a02021-04-12 20:02:36 +01007634 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007635 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007636
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007637 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 +01007638 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007639 fragment := java.ApexVariantReference{
7640 Apex: proptools.StringPtr("some-non-updatable-apex"),
7641 Module: proptools.StringPtr("some-non-updatable-fragment"),
7642 }
7643 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007644 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007645
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007646 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007647 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007648 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7649 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007650 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007651
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007652 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007653 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007654 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7655 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007656 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007657
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007658 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007659 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007660 // Update the dexpreopt ArtApexJars directly.
7661 preparer := prepareSetArtJars("platform:some-platform-lib")
7662 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007663 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007664
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007665 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007666 preparer := android.GroupFixturePreparers(
7667 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7668 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7669 )
7670 fragments := []java.ApexVariantReference{
7671 {
7672 Apex: proptools.StringPtr("some-non-updatable-apex"),
7673 Module: proptools.StringPtr("some-non-updatable-fragment"),
7674 },
7675 }
7676 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007677 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007678}
7679
7680func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007681 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007682 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007683 fragment := java.ApexVariantReference{
7684 Apex: proptools.StringPtr("myapex"),
7685 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7686 }
7687
Paul Duffin064b70c2020-11-02 17:32:38 +00007688 testDexpreoptWithApexes(t, `
7689 prebuilt_apex {
7690 name: "myapex" ,
7691 arch: {
7692 arm64: {
7693 src: "myapex-arm64.apex",
7694 },
7695 arm: {
7696 src: "myapex-arm.apex",
7697 },
7698 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007699 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7700 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007701
Paul Duffin89f570a2021-06-16 01:42:33 +01007702 prebuilt_bootclasspath_fragment {
7703 name: "my-bootclasspath-fragment",
7704 contents: ["libfoo"],
7705 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007706 hidden_api: {
7707 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7708 metadata: "my-bootclasspath-fragment/metadata.csv",
7709 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007710 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7711 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7712 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007713 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007714 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007715
Paul Duffin89f570a2021-06-16 01:42:33 +01007716 java_import {
7717 name: "libfoo",
7718 jars: ["libfoo.jar"],
7719 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007720 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007721 }
7722 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007723 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007724}
7725
Spandan Dasf14e2542021-11-12 00:01:37 +00007726func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007727 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007728 bp += `
7729 apex_key {
7730 name: "myapex.key",
7731 public_key: "testkey.avbpubkey",
7732 private_key: "testkey.pem",
7733 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007734 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007735 "lib1/src/A.java": nil,
7736 "lib2/src/B.java": nil,
7737 "system/sepolicy/apex/myapex-file_contexts": nil,
7738 }
7739
Paul Duffin45338f02021-03-30 23:07:52 +01007740 errorHandler := android.FixtureExpectsNoErrors
7741 if errmsg != "" {
7742 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007743 }
Colin Crossae8600b2020-10-29 17:09:13 -07007744
Paul Duffin45338f02021-03-30 23:07:52 +01007745 android.GroupFixturePreparers(
7746 android.PrepareForTestWithAndroidBuildComponents,
7747 java.PrepareForTestWithJavaBuildComponents,
7748 PrepareForTestWithApexBuildComponents,
7749 android.PrepareForTestWithNeverallowRules(rules),
7750 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007751 apexBootJars := make([]string, 0, len(bootJars))
7752 for _, apexBootJar := range bootJars {
7753 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007754 }
satayevd604b212021-07-21 14:23:52 +01007755 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007756 }),
7757 fs.AddToFixture(),
7758 ).
7759 ExtendWithErrorHandler(errorHandler).
7760 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007761}
7762
7763func TestApexPermittedPackagesRules(t *testing.T) {
7764 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00007765 name string
7766 expectedError string
7767 bp string
7768 bootJars []string
7769 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01007770 }{
7771
7772 {
7773 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7774 expectedError: "",
7775 bp: `
7776 java_library {
7777 name: "bcp_lib1",
7778 srcs: ["lib1/src/*.java"],
7779 permitted_packages: ["foo.bar"],
7780 apex_available: ["myapex"],
7781 sdk_version: "none",
7782 system_modules: "none",
7783 }
7784 java_library {
7785 name: "nonbcp_lib2",
7786 srcs: ["lib2/src/*.java"],
7787 apex_available: ["myapex"],
7788 permitted_packages: ["a.b"],
7789 sdk_version: "none",
7790 system_modules: "none",
7791 }
7792 apex {
7793 name: "myapex",
7794 key: "myapex.key",
7795 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007796 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007797 }`,
7798 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007799 bcpPermittedPackages: map[string][]string{
7800 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007801 "foo.bar",
7802 },
7803 },
7804 },
7805 {
Anton Hanssone1b18362021-12-23 15:05:38 +00007806 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00007807 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 +01007808 bp: `
7809 java_library {
7810 name: "bcp_lib1",
7811 srcs: ["lib1/src/*.java"],
7812 apex_available: ["myapex"],
7813 permitted_packages: ["foo.bar"],
7814 sdk_version: "none",
7815 system_modules: "none",
7816 }
7817 java_library {
7818 name: "bcp_lib2",
7819 srcs: ["lib2/src/*.java"],
7820 apex_available: ["myapex"],
7821 permitted_packages: ["foo.bar", "bar.baz"],
7822 sdk_version: "none",
7823 system_modules: "none",
7824 }
7825 apex {
7826 name: "myapex",
7827 key: "myapex.key",
7828 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007829 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007830 }
7831 `,
7832 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007833 bcpPermittedPackages: map[string][]string{
7834 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007835 "foo.bar",
7836 },
Spandan Dasf14e2542021-11-12 00:01:37 +00007837 "bcp_lib2": []string{
7838 "foo.bar",
7839 },
7840 },
7841 },
7842 {
7843 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
7844 expectedError: "",
7845 bp: `
7846 java_library {
7847 name: "bcp_lib_restricted",
7848 srcs: ["lib1/src/*.java"],
7849 apex_available: ["myapex"],
7850 permitted_packages: ["foo.bar"],
7851 sdk_version: "none",
7852 min_sdk_version: "29",
7853 system_modules: "none",
7854 }
7855 java_library {
7856 name: "bcp_lib_unrestricted",
7857 srcs: ["lib2/src/*.java"],
7858 apex_available: ["myapex"],
7859 permitted_packages: ["foo.bar", "bar.baz"],
7860 sdk_version: "none",
7861 min_sdk_version: "29",
7862 system_modules: "none",
7863 }
7864 apex {
7865 name: "myapex",
7866 key: "myapex.key",
7867 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
7868 updatable: true,
7869 min_sdk_version: "29",
7870 }
7871 `,
7872 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7873 bcpPermittedPackages: map[string][]string{
7874 "bcp_lib1_non_updateable": []string{
7875 "foo.bar",
7876 },
7877 // 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 +01007878 },
7879 },
7880 }
7881 for _, tc := range testcases {
7882 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00007883 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
7884 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01007885 })
7886 }
7887}
7888
Jiyong Park62304bb2020-04-13 16:19:48 +09007889func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007890 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09007891 apex {
7892 name: "myapex",
7893 key: "myapex.key",
7894 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007895 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09007896 }
7897
7898 apex_key {
7899 name: "myapex.key",
7900 public_key: "testkey.avbpubkey",
7901 private_key: "testkey.pem",
7902 }
7903
7904 cc_library {
7905 name: "mylib",
7906 srcs: ["mylib.cpp"],
7907 system_shared_libs: [],
7908 stl: "none",
7909 stubs: {
7910 versions: ["1"],
7911 },
7912 apex_available: ["myapex"],
7913 }
7914
7915 cc_library {
7916 name: "myprivlib",
7917 srcs: ["mylib.cpp"],
7918 system_shared_libs: [],
7919 stl: "none",
7920 apex_available: ["myapex"],
7921 }
7922
7923
7924 cc_test {
7925 name: "mytest",
7926 gtest: false,
7927 srcs: ["mylib.cpp"],
7928 system_shared_libs: [],
7929 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09007930 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09007931 test_for: ["myapex"]
7932 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007933
7934 cc_library {
7935 name: "mytestlib",
7936 srcs: ["mylib.cpp"],
7937 system_shared_libs: [],
7938 shared_libs: ["mylib", "myprivlib"],
7939 stl: "none",
7940 test_for: ["myapex"],
7941 }
7942
7943 cc_benchmark {
7944 name: "mybench",
7945 srcs: ["mylib.cpp"],
7946 system_shared_libs: [],
7947 shared_libs: ["mylib", "myprivlib"],
7948 stl: "none",
7949 test_for: ["myapex"],
7950 }
Jiyong Park62304bb2020-04-13 16:19:48 +09007951 `)
7952
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007953 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007954 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007955 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7956 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7957 }
7958
7959 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09007960 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007961 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7962 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7963 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7964}
Jiyong Park46a512f2020-12-04 18:02:13 +09007965
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007966func TestIndirectTestFor(t *testing.T) {
7967 ctx := testApex(t, `
7968 apex {
7969 name: "myapex",
7970 key: "myapex.key",
7971 native_shared_libs: ["mylib", "myprivlib"],
7972 updatable: false,
7973 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007974
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007975 apex_key {
7976 name: "myapex.key",
7977 public_key: "testkey.avbpubkey",
7978 private_key: "testkey.pem",
7979 }
7980
7981 cc_library {
7982 name: "mylib",
7983 srcs: ["mylib.cpp"],
7984 system_shared_libs: [],
7985 stl: "none",
7986 stubs: {
7987 versions: ["1"],
7988 },
7989 apex_available: ["myapex"],
7990 }
7991
7992 cc_library {
7993 name: "myprivlib",
7994 srcs: ["mylib.cpp"],
7995 system_shared_libs: [],
7996 stl: "none",
7997 shared_libs: ["mylib"],
7998 apex_available: ["myapex"],
7999 }
8000
8001 cc_library {
8002 name: "mytestlib",
8003 srcs: ["mylib.cpp"],
8004 system_shared_libs: [],
8005 shared_libs: ["myprivlib"],
8006 stl: "none",
8007 test_for: ["myapex"],
8008 }
8009 `)
8010
8011 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008012 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008013 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8014 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8015 }
8016
8017 // The platform variant of mytestlib links to the platform variant of the
8018 // internal myprivlib.
8019 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8020
8021 // The platform variant of myprivlib links to the platform variant of mylib
8022 // and bypasses its stubs.
8023 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 +09008024}
8025
Martin Stjernholmec009002021-03-27 15:18:31 +00008026func TestTestForForLibInOtherApex(t *testing.T) {
8027 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8028 _ = testApex(t, `
8029 apex {
8030 name: "com.android.art",
8031 key: "myapex.key",
8032 native_shared_libs: ["mylib"],
8033 updatable: false,
8034 }
8035
8036 apex {
8037 name: "com.android.art.debug",
8038 key: "myapex.key",
8039 native_shared_libs: ["mylib", "mytestlib"],
8040 updatable: false,
8041 }
8042
8043 apex_key {
8044 name: "myapex.key",
8045 public_key: "testkey.avbpubkey",
8046 private_key: "testkey.pem",
8047 }
8048
8049 cc_library {
8050 name: "mylib",
8051 srcs: ["mylib.cpp"],
8052 system_shared_libs: [],
8053 stl: "none",
8054 stubs: {
8055 versions: ["1"],
8056 },
8057 apex_available: ["com.android.art", "com.android.art.debug"],
8058 }
8059
8060 cc_library {
8061 name: "mytestlib",
8062 srcs: ["mylib.cpp"],
8063 system_shared_libs: [],
8064 shared_libs: ["mylib"],
8065 stl: "none",
8066 apex_available: ["com.android.art.debug"],
8067 test_for: ["com.android.art"],
8068 }
8069 `,
8070 android.MockFS{
8071 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8072 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8073 }.AddToFixture())
8074}
8075
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008076// TODO(jungjw): Move this to proptools
8077func intPtr(i int) *int {
8078 return &i
8079}
8080
8081func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008082 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008083 apex_set {
8084 name: "myapex",
8085 set: "myapex.apks",
8086 filename: "foo_v2.apex",
8087 overrides: ["foo"],
8088 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008089 `,
8090 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8091 variables.Platform_sdk_version = intPtr(30)
8092 }),
8093 android.FixtureModifyConfig(func(config android.Config) {
8094 config.Targets[android.Android] = []android.Target{
8095 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8096 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8097 }
8098 }),
8099 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008100
Paul Duffin24704672021-04-06 16:09:30 +01008101 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008102
8103 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008104 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008105 actual := extractedApex.Args["abis"]
8106 expected := "ARMEABI_V7A,ARM64_V8A"
8107 if actual != expected {
8108 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8109 }
8110 actual = extractedApex.Args["sdk-version"]
8111 expected = "30"
8112 if actual != expected {
8113 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8114 }
8115
Paul Duffin6717d882021-06-15 19:09:41 +01008116 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008117 a := m.Module().(*ApexSet)
8118 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008119 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008120 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8121 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8122 }
8123}
8124
Jiyong Park7d95a512020-05-10 15:16:24 +09008125func TestNoStaticLinkingToStubsLib(t *testing.T) {
8126 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8127 apex {
8128 name: "myapex",
8129 key: "myapex.key",
8130 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008131 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008132 }
8133
8134 apex_key {
8135 name: "myapex.key",
8136 public_key: "testkey.avbpubkey",
8137 private_key: "testkey.pem",
8138 }
8139
8140 cc_library {
8141 name: "mylib",
8142 srcs: ["mylib.cpp"],
8143 static_libs: ["otherlib"],
8144 system_shared_libs: [],
8145 stl: "none",
8146 apex_available: [ "myapex" ],
8147 }
8148
8149 cc_library {
8150 name: "otherlib",
8151 srcs: ["mylib.cpp"],
8152 system_shared_libs: [],
8153 stl: "none",
8154 stubs: {
8155 versions: ["1", "2", "3"],
8156 },
8157 apex_available: [ "myapex" ],
8158 }
8159 `)
8160}
8161
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008162func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008163 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008164 apex {
8165 name: "myapex",
8166 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008167 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008168 custom_sign_tool: "sign_myapex",
8169 }
8170
8171 apex_key {
8172 name: "myapex.key",
8173 public_key: "testkey.avbpubkey",
8174 private_key: "testkey.pem",
8175 }
8176 `)
8177
8178 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8179 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8180 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"`)
8181}
8182
8183func TestApexKeysTxtOverrides(t *testing.T) {
8184 ctx := testApex(t, `
8185 apex {
8186 name: "myapex",
8187 key: "myapex.key",
8188 updatable: false,
8189 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008190 }
8191
8192 apex_key {
8193 name: "myapex.key",
8194 public_key: "testkey.avbpubkey",
8195 private_key: "testkey.pem",
8196 }
8197
8198 prebuilt_apex {
8199 name: "myapex",
8200 prefer: true,
8201 arch: {
8202 arm64: {
8203 src: "myapex-arm64.apex",
8204 },
8205 arm: {
8206 src: "myapex-arm.apex",
8207 },
8208 },
8209 }
8210
8211 apex_set {
8212 name: "myapex_set",
8213 set: "myapex.apks",
8214 filename: "myapex_set.apex",
8215 overrides: ["myapex"],
8216 }
8217 `)
8218
8219 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8220 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8221 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 +09008222 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 +09008223}
8224
Jooyung Han938b5932020-06-20 12:47:47 +09008225func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008226 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008227 apex {
8228 name: "myapex",
8229 key: "myapex.key",
8230 apps: ["app"],
8231 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008232 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008233 }
8234
8235 apex_key {
8236 name: "myapex.key",
8237 public_key: "testkey.avbpubkey",
8238 private_key: "testkey.pem",
8239 }
8240
8241 android_app {
8242 name: "app",
8243 srcs: ["foo/bar/MyClass.java"],
8244 package_name: "foo",
8245 sdk_version: "none",
8246 system_modules: "none",
8247 apex_available: [ "myapex" ],
8248 }
8249 `, withFiles(map[string][]byte{
8250 "sub/Android.bp": []byte(`
8251 override_apex {
8252 name: "override_myapex",
8253 base: "myapex",
8254 apps: ["override_app"],
8255 allowed_files: ":allowed",
8256 }
8257 // Overridable "path" property should be referenced indirectly
8258 filegroup {
8259 name: "allowed",
8260 srcs: ["allowed.txt"],
8261 }
8262 override_android_app {
8263 name: "override_app",
8264 base: "app",
8265 package_name: "bar",
8266 }
8267 `),
8268 }))
8269
8270 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8271 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8272 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8273 }
8274
8275 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8276 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8277 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8278 }
8279}
8280
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008281func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008282 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008283 apex {
8284 name: "myapex",
8285 key: "myapex.key",
8286 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008287 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008288 }
8289
8290 apex_key {
8291 name: "myapex.key",
8292 public_key: "testkey.avbpubkey",
8293 private_key: "testkey.pem",
8294 }
8295
8296 cc_library {
8297 name: "mylib",
8298 srcs: ["mylib.cpp"],
8299 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008300 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008301 },
8302 apex_available: ["myapex"],
8303 }
8304
8305 cc_prebuilt_library_shared {
8306 name: "mylib",
8307 prefer: false,
8308 srcs: ["prebuilt.so"],
8309 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008310 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008311 },
8312 apex_available: ["myapex"],
8313 }
8314 `)
8315}
8316
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008317func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008318 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008319 apex {
8320 name: "myapex",
8321 key: "myapex.key",
8322 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008323 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008324 }
8325 apex_key {
8326 name: "myapex.key",
8327 public_key: "testkey.avbpubkey",
8328 private_key: "testkey.pem",
8329 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008330 `,
8331 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8332 variables.CompressedApex = proptools.BoolPtr(true)
8333 }),
8334 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008335
8336 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8337 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8338
8339 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8340 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8341
8342 // Make sure output of bundle is .capex
8343 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8344 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8345
8346 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008347 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008348 var builder strings.Builder
8349 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8350 androidMk := builder.String()
8351 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8352}
8353
Martin Stjernholm2856c662020-12-02 15:03:42 +00008354func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008355 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008356 apex {
8357 name: "myapex",
8358 key: "myapex.key",
8359 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008360 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008361 }
8362
8363 apex_key {
8364 name: "myapex.key",
8365 public_key: "testkey.avbpubkey",
8366 private_key: "testkey.pem",
8367 }
8368
8369 cc_library {
8370 name: "mylib",
8371 srcs: ["mylib.cpp"],
8372 apex_available: ["myapex"],
8373 shared_libs: ["otherlib"],
8374 system_shared_libs: [],
8375 }
8376
8377 cc_library {
8378 name: "otherlib",
8379 srcs: ["mylib.cpp"],
8380 stubs: {
8381 versions: ["current"],
8382 },
8383 }
8384
8385 cc_prebuilt_library_shared {
8386 name: "otherlib",
8387 prefer: true,
8388 srcs: ["prebuilt.so"],
8389 stubs: {
8390 versions: ["current"],
8391 },
8392 }
8393 `)
8394
8395 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008396 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008397 var builder strings.Builder
8398 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8399 androidMk := builder.String()
8400
8401 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8402 // a thing there.
8403 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8404}
8405
Jiyong Parke3867542020-12-03 17:28:25 +09008406func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008407 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008408 apex {
8409 name: "myapex",
8410 key: "myapex.key",
8411 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008412 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008413 }
8414
8415 apex_key {
8416 name: "myapex.key",
8417 public_key: "testkey.avbpubkey",
8418 private_key: "testkey.pem",
8419 }
8420
8421 cc_library {
8422 name: "mylib",
8423 srcs: ["mylib.cpp"],
8424 system_shared_libs: [],
8425 stl: "none",
8426 apex_available: ["myapex"],
8427 shared_libs: ["mylib2"],
8428 target: {
8429 apex: {
8430 exclude_shared_libs: ["mylib2"],
8431 },
8432 },
8433 }
8434
8435 cc_library {
8436 name: "mylib2",
8437 srcs: ["mylib.cpp"],
8438 system_shared_libs: [],
8439 stl: "none",
8440 }
8441 `)
8442
8443 // Check if mylib is linked to mylib2 for the non-apex target
8444 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8445 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8446
8447 // Make sure that the link doesn't occur for the apex target
8448 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8449 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8450
8451 // It shouldn't appear in the copy cmd as well.
8452 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8453 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8454}
8455
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008456func TestPrebuiltStubLibDep(t *testing.T) {
8457 bpBase := `
8458 apex {
8459 name: "myapex",
8460 key: "myapex.key",
8461 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008462 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008463 }
8464 apex_key {
8465 name: "myapex.key",
8466 public_key: "testkey.avbpubkey",
8467 private_key: "testkey.pem",
8468 }
8469 cc_library {
8470 name: "mylib",
8471 srcs: ["mylib.cpp"],
8472 apex_available: ["myapex"],
8473 shared_libs: ["stublib"],
8474 system_shared_libs: [],
8475 }
8476 apex {
8477 name: "otherapex",
8478 enabled: %s,
8479 key: "myapex.key",
8480 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008481 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008482 }
8483 `
8484
8485 stublibSourceBp := `
8486 cc_library {
8487 name: "stublib",
8488 srcs: ["mylib.cpp"],
8489 apex_available: ["otherapex"],
8490 system_shared_libs: [],
8491 stl: "none",
8492 stubs: {
8493 versions: ["1"],
8494 },
8495 }
8496 `
8497
8498 stublibPrebuiltBp := `
8499 cc_prebuilt_library_shared {
8500 name: "stublib",
8501 srcs: ["prebuilt.so"],
8502 apex_available: ["otherapex"],
8503 stubs: {
8504 versions: ["1"],
8505 },
8506 %s
8507 }
8508 `
8509
8510 tests := []struct {
8511 name string
8512 stublibBp string
8513 usePrebuilt bool
8514 modNames []string // Modules to collect AndroidMkEntries for
8515 otherApexEnabled []string
8516 }{
8517 {
8518 name: "only_source",
8519 stublibBp: stublibSourceBp,
8520 usePrebuilt: false,
8521 modNames: []string{"stublib"},
8522 otherApexEnabled: []string{"true", "false"},
8523 },
8524 {
8525 name: "source_preferred",
8526 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8527 usePrebuilt: false,
8528 modNames: []string{"stublib", "prebuilt_stublib"},
8529 otherApexEnabled: []string{"true", "false"},
8530 },
8531 {
8532 name: "prebuilt_preferred",
8533 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8534 usePrebuilt: true,
8535 modNames: []string{"stublib", "prebuilt_stublib"},
8536 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8537 },
8538 {
8539 name: "only_prebuilt",
8540 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8541 usePrebuilt: true,
8542 modNames: []string{"stublib"},
8543 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8544 },
8545 }
8546
8547 for _, test := range tests {
8548 t.Run(test.name, func(t *testing.T) {
8549 for _, otherApexEnabled := range test.otherApexEnabled {
8550 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008551 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008552
8553 type modAndMkEntries struct {
8554 mod *cc.Module
8555 mkEntries android.AndroidMkEntries
8556 }
8557 entries := []*modAndMkEntries{}
8558
8559 // Gather shared lib modules that are installable
8560 for _, modName := range test.modNames {
8561 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8562 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8563 continue
8564 }
8565 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008566 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008567 continue
8568 }
Colin Crossaa255532020-07-03 13:18:24 -07008569 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008570 if ent.Disabled {
8571 continue
8572 }
8573 entries = append(entries, &modAndMkEntries{
8574 mod: mod,
8575 mkEntries: ent,
8576 })
8577 }
8578 }
8579 }
8580
8581 var entry *modAndMkEntries = nil
8582 for _, ent := range entries {
8583 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8584 if entry != nil {
8585 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8586 } else {
8587 entry = ent
8588 }
8589 }
8590 }
8591
8592 if entry == nil {
8593 t.Errorf("AndroidMk entry for \"stublib\" missing")
8594 } else {
8595 isPrebuilt := entry.mod.Prebuilt() != nil
8596 if isPrebuilt != test.usePrebuilt {
8597 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8598 }
8599 if !entry.mod.IsStubs() {
8600 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8601 }
8602 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8603 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8604 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008605 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008606 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008607 if !android.InList(expected, cflags) {
8608 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8609 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008610 }
8611 })
8612 }
8613 })
8614 }
8615}
8616
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008617func TestHostApexInHostOnlyBuild(t *testing.T) {
8618 testApex(t, `
8619 apex {
8620 name: "myapex",
8621 host_supported: true,
8622 key: "myapex.key",
8623 updatable: false,
8624 payload_type: "zip",
8625 }
8626 apex_key {
8627 name: "myapex.key",
8628 public_key: "testkey.avbpubkey",
8629 private_key: "testkey.pem",
8630 }
8631 `,
8632 android.FixtureModifyConfig(func(config android.Config) {
8633 // We may not have device targets in all builds, e.g. in
8634 // prebuilts/build-tools/build-prebuilts.sh
8635 config.Targets[android.Android] = []android.Target{}
8636 }))
8637}
8638
Colin Crossc33e5212021-05-25 18:16:02 -07008639func TestApexJavaCoverage(t *testing.T) {
8640 bp := `
8641 apex {
8642 name: "myapex",
8643 key: "myapex.key",
8644 java_libs: ["mylib"],
8645 bootclasspath_fragments: ["mybootclasspathfragment"],
8646 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8647 updatable: false,
8648 }
8649
8650 apex_key {
8651 name: "myapex.key",
8652 public_key: "testkey.avbpubkey",
8653 private_key: "testkey.pem",
8654 }
8655
8656 java_library {
8657 name: "mylib",
8658 srcs: ["mylib.java"],
8659 apex_available: ["myapex"],
8660 compile_dex: true,
8661 }
8662
8663 bootclasspath_fragment {
8664 name: "mybootclasspathfragment",
8665 contents: ["mybootclasspathlib"],
8666 apex_available: ["myapex"],
8667 }
8668
8669 java_library {
8670 name: "mybootclasspathlib",
8671 srcs: ["mybootclasspathlib.java"],
8672 apex_available: ["myapex"],
8673 compile_dex: true,
8674 }
8675
8676 systemserverclasspath_fragment {
8677 name: "mysystemserverclasspathfragment",
8678 contents: ["mysystemserverclasspathlib"],
8679 apex_available: ["myapex"],
8680 }
8681
8682 java_library {
8683 name: "mysystemserverclasspathlib",
8684 srcs: ["mysystemserverclasspathlib.java"],
8685 apex_available: ["myapex"],
8686 compile_dex: true,
8687 }
8688 `
8689
8690 result := android.GroupFixturePreparers(
8691 PrepareForTestWithApexBuildComponents,
8692 prepareForTestWithMyapex,
8693 java.PrepareForTestWithJavaDefaultModules,
8694 android.PrepareForTestWithAndroidBuildComponents,
8695 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008696 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8697 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008698 android.FixtureMergeEnv(map[string]string{
8699 "EMMA_INSTRUMENT": "true",
8700 }),
8701 ).RunTest(t)
8702
8703 // Make sure jacoco ran on both mylib and mybootclasspathlib
8704 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8705 t.Errorf("Failed to find jacoco rule for mylib")
8706 }
8707 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8708 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8709 }
8710 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8711 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8712 }
8713}
8714
Jiyong Park192600a2021-08-03 07:52:17 +00008715func TestProhibitStaticExecutable(t *testing.T) {
8716 testApexError(t, `executable mybin is static`, `
8717 apex {
8718 name: "myapex",
8719 key: "myapex.key",
8720 binaries: ["mybin"],
8721 min_sdk_version: "29",
8722 }
8723
8724 apex_key {
8725 name: "myapex.key",
8726 public_key: "testkey.avbpubkey",
8727 private_key: "testkey.pem",
8728 }
8729
8730 cc_binary {
8731 name: "mybin",
8732 srcs: ["mylib.cpp"],
8733 relative_install_path: "foo/bar",
8734 static_executable: true,
8735 system_shared_libs: [],
8736 stl: "none",
8737 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008738 min_sdk_version: "29",
8739 }
8740 `)
8741
8742 testApexError(t, `executable mybin.rust is static`, `
8743 apex {
8744 name: "myapex",
8745 key: "myapex.key",
8746 binaries: ["mybin.rust"],
8747 min_sdk_version: "29",
8748 }
8749
8750 apex_key {
8751 name: "myapex.key",
8752 public_key: "testkey.avbpubkey",
8753 private_key: "testkey.pem",
8754 }
8755
8756 rust_binary {
8757 name: "mybin.rust",
8758 srcs: ["foo.rs"],
8759 static_executable: true,
8760 apex_available: ["myapex"],
8761 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008762 }
8763 `)
8764}
8765
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008766func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8767 ctx := testApex(t, `
8768 apex {
8769 name: "myapex",
8770 key: "myapex.key",
8771 updatable: false,
8772 java_libs: ["foo"],
8773 }
8774
8775 apex_key {
8776 name: "myapex.key",
8777 public_key: "testkey.avbpubkey",
8778 private_key: "testkey.pem",
8779 }
8780
8781 java_library {
8782 name: "foo",
8783 srcs: ["foo.java"],
8784 apex_available: ["myapex"],
8785 installable: true,
8786 }
8787 `,
8788 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8789 )
8790
8791 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8792 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8793 var builder strings.Builder
8794 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8795 androidMk := builder.String()
8796 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")
8797}
8798
8799func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8800 ctx := testApex(t, `
8801 prebuilt_apex {
8802 name: "myapex",
8803 arch: {
8804 arm64: {
8805 src: "myapex-arm64.apex",
8806 },
8807 arm: {
8808 src: "myapex-arm.apex",
8809 },
8810 },
8811 exported_java_libs: ["foo"],
8812 }
8813
8814 java_import {
8815 name: "foo",
8816 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008817 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008818 }
8819 `,
8820 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8821 )
8822
8823 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8824 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8825 mainModuleEntries := entriesList[0]
8826 android.AssertArrayString(t,
8827 "LOCAL_REQUIRED_MODULES",
8828 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8829 []string{
8830 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8831 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8832 })
8833}
8834
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008835func TestAndroidMk_RequiredModules(t *testing.T) {
8836 ctx := testApex(t, `
8837 apex {
8838 name: "myapex",
8839 key: "myapex.key",
8840 updatable: false,
8841 java_libs: ["foo"],
8842 required: ["otherapex"],
8843 }
8844
8845 apex {
8846 name: "otherapex",
8847 key: "myapex.key",
8848 updatable: false,
8849 java_libs: ["foo"],
8850 required: ["otherapex"],
8851 }
8852
8853 apex_key {
8854 name: "myapex.key",
8855 public_key: "testkey.avbpubkey",
8856 private_key: "testkey.pem",
8857 }
8858
8859 java_library {
8860 name: "foo",
8861 srcs: ["foo.java"],
8862 apex_available: ["myapex", "otherapex"],
8863 installable: true,
8864 }
8865 `)
8866
8867 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8868 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8869 var builder strings.Builder
8870 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8871 androidMk := builder.String()
8872 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
8873}
8874
Jiakai Zhangd70dff72022-02-24 15:06:05 +00008875func TestAndroidMk_RequiredDeps(t *testing.T) {
8876 ctx := testApex(t, `
8877 apex {
8878 name: "myapex",
8879 key: "myapex.key",
8880 updatable: false,
8881 }
8882
8883 apex_key {
8884 name: "myapex.key",
8885 public_key: "testkey.avbpubkey",
8886 private_key: "testkey.pem",
8887 }
8888 `)
8889
8890 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8891 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
8892 data := android.AndroidMkDataForTest(t, ctx, bundle)
8893 var builder strings.Builder
8894 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
8895 androidMk := builder.String()
8896 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
8897
8898 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
8899 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
8900 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
8901 var flattenedBuilder strings.Builder
8902 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
8903 flattenedAndroidMk := flattenedBuilder.String()
8904 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
8905}
8906
Jooyung Hana6d36672022-02-24 13:58:07 +09008907func TestApexOutputFileProducer(t *testing.T) {
8908 for _, tc := range []struct {
8909 name string
8910 ref string
8911 expected_data []string
8912 }{
8913 {
8914 name: "test_using_output",
8915 ref: ":myapex",
8916 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
8917 },
8918 {
8919 name: "test_using_apex",
8920 ref: ":myapex{.apex}",
8921 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
8922 },
8923 } {
8924 t.Run(tc.name, func(t *testing.T) {
8925 ctx := testApex(t, `
8926 apex {
8927 name: "myapex",
8928 key: "myapex.key",
8929 compressible: true,
8930 updatable: false,
8931 }
8932
8933 apex_key {
8934 name: "myapex.key",
8935 public_key: "testkey.avbpubkey",
8936 private_key: "testkey.pem",
8937 }
8938
8939 java_test {
8940 name: "`+tc.name+`",
8941 srcs: ["a.java"],
8942 data: ["`+tc.ref+`"],
8943 }
8944 `,
8945 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8946 variables.CompressedApex = proptools.BoolPtr(true)
8947 }))
8948 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
8949 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
8950 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
8951 })
8952 }
8953}
8954
satayev758968a2021-12-06 11:42:40 +00008955func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
8956 preparer := android.GroupFixturePreparers(
8957 PrepareForTestWithApexBuildComponents,
8958 prepareForTestWithMyapex,
8959 java.PrepareForTestWithJavaSdkLibraryFiles,
8960 java.PrepareForTestWithJavaDefaultModules,
8961 android.PrepareForTestWithAndroidBuildComponents,
8962 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8963 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
8964 )
8965
8966 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
8967 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8968 preparer.RunTestWithBp(t, `
8969 apex {
8970 name: "myapex",
8971 key: "myapex.key",
8972 bootclasspath_fragments: ["mybootclasspathfragment"],
8973 min_sdk_version: "30",
8974 updatable: false,
8975 }
8976
8977 apex_key {
8978 name: "myapex.key",
8979 public_key: "testkey.avbpubkey",
8980 private_key: "testkey.pem",
8981 }
8982
8983 bootclasspath_fragment {
8984 name: "mybootclasspathfragment",
8985 contents: ["mybootclasspathlib"],
8986 apex_available: ["myapex"],
8987 }
8988
8989 java_sdk_library {
8990 name: "mybootclasspathlib",
8991 srcs: ["mybootclasspathlib.java"],
8992 apex_available: ["myapex"],
8993 compile_dex: true,
8994 unsafe_ignore_missing_latest_api: true,
8995 min_sdk_version: "31",
8996 static_libs: ["util"],
8997 }
8998
8999 java_library {
9000 name: "util",
9001 srcs: ["a.java"],
9002 apex_available: ["myapex"],
9003 min_sdk_version: "31",
9004 static_libs: ["another_util"],
9005 }
9006
9007 java_library {
9008 name: "another_util",
9009 srcs: ["a.java"],
9010 min_sdk_version: "31",
9011 apex_available: ["myapex"],
9012 }
9013 `)
9014 })
9015
9016 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9017 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9018 preparer.RunTestWithBp(t, `
9019 apex {
9020 name: "myapex",
9021 key: "myapex.key",
9022 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9023 min_sdk_version: "30",
9024 updatable: false,
9025 }
9026
9027 apex_key {
9028 name: "myapex.key",
9029 public_key: "testkey.avbpubkey",
9030 private_key: "testkey.pem",
9031 }
9032
9033 systemserverclasspath_fragment {
9034 name: "mysystemserverclasspathfragment",
9035 contents: ["mysystemserverclasspathlib"],
9036 apex_available: ["myapex"],
9037 }
9038
9039 java_sdk_library {
9040 name: "mysystemserverclasspathlib",
9041 srcs: ["mysystemserverclasspathlib.java"],
9042 apex_available: ["myapex"],
9043 compile_dex: true,
9044 min_sdk_version: "32",
9045 unsafe_ignore_missing_latest_api: true,
9046 static_libs: ["util"],
9047 }
9048
9049 java_library {
9050 name: "util",
9051 srcs: ["a.java"],
9052 apex_available: ["myapex"],
9053 min_sdk_version: "31",
9054 static_libs: ["another_util"],
9055 }
9056
9057 java_library {
9058 name: "another_util",
9059 srcs: ["a.java"],
9060 min_sdk_version: "31",
9061 apex_available: ["myapex"],
9062 }
9063 `)
9064 })
9065
9066 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9067 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9068 RunTestWithBp(t, `
9069 apex {
9070 name: "myapex",
9071 key: "myapex.key",
9072 bootclasspath_fragments: ["mybootclasspathfragment"],
9073 min_sdk_version: "30",
9074 updatable: false,
9075 }
9076
9077 apex_key {
9078 name: "myapex.key",
9079 public_key: "testkey.avbpubkey",
9080 private_key: "testkey.pem",
9081 }
9082
9083 bootclasspath_fragment {
9084 name: "mybootclasspathfragment",
9085 contents: ["mybootclasspathlib"],
9086 apex_available: ["myapex"],
9087 }
9088
9089 java_sdk_library {
9090 name: "mybootclasspathlib",
9091 srcs: ["mybootclasspathlib.java"],
9092 apex_available: ["myapex"],
9093 compile_dex: true,
9094 unsafe_ignore_missing_latest_api: true,
9095 }
9096 `)
9097 })
9098
9099 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9100 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9101 RunTestWithBp(t, `
9102 apex {
9103 name: "myapex",
9104 key: "myapex.key",
9105 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9106 min_sdk_version: "30",
9107 updatable: false,
9108 }
9109
9110 apex_key {
9111 name: "myapex.key",
9112 public_key: "testkey.avbpubkey",
9113 private_key: "testkey.pem",
9114 }
9115
9116 systemserverclasspath_fragment {
9117 name: "mysystemserverclasspathfragment",
9118 contents: ["mysystemserverclasspathlib"],
9119 apex_available: ["myapex"],
9120 }
9121
9122 java_sdk_library {
9123 name: "mysystemserverclasspathlib",
9124 srcs: ["mysystemserverclasspathlib.java"],
9125 apex_available: ["myapex"],
9126 compile_dex: true,
9127 unsafe_ignore_missing_latest_api: true,
9128 }
9129 `)
9130 })
9131}
9132
Jiakai Zhang6decef92022-01-12 17:56:19 +00009133// Verifies that the APEX depends on all the Make modules in the list.
9134func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9135 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9136 for _, dep := range deps {
9137 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9138 }
9139}
9140
9141// Verifies that the APEX does not depend on any of the Make modules in the list.
9142func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9143 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9144 for _, dep := range deps {
9145 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9146 }
9147}
9148
Spandan Das66773252022-01-15 00:23:18 +00009149func TestApexStrictUpdtabilityLint(t *testing.T) {
9150 bpTemplate := `
9151 apex {
9152 name: "myapex",
9153 key: "myapex.key",
9154 java_libs: ["myjavalib"],
9155 updatable: %v,
9156 min_sdk_version: "29",
9157 }
9158 apex_key {
9159 name: "myapex.key",
9160 }
9161 java_library {
9162 name: "myjavalib",
9163 srcs: ["MyClass.java"],
9164 apex_available: [ "myapex" ],
9165 lint: {
9166 strict_updatability_linting: %v,
9167 },
9168 sdk_version: "current",
9169 min_sdk_version: "29",
9170 }
9171 `
9172 fs := android.MockFS{
9173 "lint-baseline.xml": nil,
9174 }
9175
9176 testCases := []struct {
9177 testCaseName string
9178 apexUpdatable bool
9179 javaStrictUpdtabilityLint bool
9180 lintFileExists bool
9181 disallowedFlagExpected bool
9182 }{
9183 {
9184 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9185 apexUpdatable: true,
9186 javaStrictUpdtabilityLint: true,
9187 lintFileExists: false,
9188 disallowedFlagExpected: false,
9189 },
9190 {
9191 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9192 apexUpdatable: false,
9193 javaStrictUpdtabilityLint: false,
9194 lintFileExists: true,
9195 disallowedFlagExpected: false,
9196 },
9197 {
9198 testCaseName: "non-updatable apex respects strict updatability of javalib",
9199 apexUpdatable: false,
9200 javaStrictUpdtabilityLint: true,
9201 lintFileExists: true,
9202 disallowedFlagExpected: true,
9203 },
9204 {
9205 testCaseName: "updatable apex sets strict updatability of javalib to true",
9206 apexUpdatable: true,
9207 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9208 lintFileExists: true,
9209 disallowedFlagExpected: true,
9210 },
9211 }
9212
9213 for _, testCase := range testCases {
9214 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9215 fixtures := []android.FixturePreparer{}
9216 if testCase.lintFileExists {
9217 fixtures = append(fixtures, fs.AddToFixture())
9218 }
9219
9220 result := testApex(t, bp, fixtures...)
9221 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9222 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9223 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9224
9225 if disallowedFlagActual != testCase.disallowedFlagExpected {
9226 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9227 }
9228 }
9229}
9230
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009231func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9232 bp := `
9233 apex {
9234 name: "myapex",
9235 key: "myapex.key",
9236 java_libs: ["myjavalib"],
9237 updatable: true,
9238 min_sdk_version: "29",
9239 }
9240 apex_key {
9241 name: "myapex.key",
9242 }
9243 java_library {
9244 name: "myjavalib",
9245 srcs: ["MyClass.java"],
9246 apex_available: [ "myapex" ],
9247 sdk_version: "current",
9248 min_sdk_version: "29",
9249 }
9250 `
9251
9252 testCases := []struct {
9253 testCaseName string
9254 moduleDirectory string
9255 disallowedFlagExpected bool
9256 }{
9257 {
9258 testCaseName: "lintable module defined outside libcore",
9259 moduleDirectory: "",
9260 disallowedFlagExpected: true,
9261 },
9262 {
9263 testCaseName: "lintable module defined in libcore root directory",
9264 moduleDirectory: "libcore/",
9265 disallowedFlagExpected: false,
9266 },
9267 {
9268 testCaseName: "lintable module defined in libcore child directory",
9269 moduleDirectory: "libcore/childdir/",
9270 disallowedFlagExpected: true,
9271 },
9272 }
9273
9274 for _, testCase := range testCases {
9275 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9276 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9277 result := testApex(t, "", lintFileCreator, bpFileCreator)
9278 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9279 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9280 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9281 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9282
9283 if disallowedFlagActual != testCase.disallowedFlagExpected {
9284 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9285 }
9286 }
9287}
9288
Spandan Das66773252022-01-15 00:23:18 +00009289// checks transtive deps of an apex coming from bootclasspath_fragment
9290func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9291 bp := `
9292 apex {
9293 name: "myapex",
9294 key: "myapex.key",
9295 bootclasspath_fragments: ["mybootclasspathfragment"],
9296 updatable: true,
9297 min_sdk_version: "29",
9298 }
9299 apex_key {
9300 name: "myapex.key",
9301 }
9302 bootclasspath_fragment {
9303 name: "mybootclasspathfragment",
9304 contents: ["myjavalib"],
9305 apex_available: ["myapex"],
9306 }
9307 java_library {
9308 name: "myjavalib",
9309 srcs: ["MyClass.java"],
9310 apex_available: [ "myapex" ],
9311 sdk_version: "current",
9312 min_sdk_version: "29",
9313 compile_dex: true,
9314 }
9315 `
9316 fs := android.MockFS{
9317 "lint-baseline.xml": nil,
9318 }
9319
9320 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9321 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9322 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9323 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9324 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9325 }
9326}
9327
Spandan Das42e89502022-05-06 22:12:55 +00009328// updatable apexes should propagate updatable=true to its apps
9329func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9330 bp := `
9331 apex {
9332 name: "myapex",
9333 key: "myapex.key",
9334 updatable: %v,
9335 apps: [
9336 "myapp",
9337 ],
9338 min_sdk_version: "30",
9339 }
9340 apex_key {
9341 name: "myapex.key",
9342 }
9343 android_app {
9344 name: "myapp",
9345 updatable: %v,
9346 apex_available: [
9347 "myapex",
9348 ],
9349 sdk_version: "current",
9350 min_sdk_version: "30",
9351 }
9352 `
9353 testCases := []struct {
9354 name string
9355 apex_is_updatable_bp bool
9356 app_is_updatable_bp bool
9357 app_is_updatable_expected bool
9358 }{
9359 {
9360 name: "Non-updatable apex respects updatable property of non-updatable app",
9361 apex_is_updatable_bp: false,
9362 app_is_updatable_bp: false,
9363 app_is_updatable_expected: false,
9364 },
9365 {
9366 name: "Non-updatable apex respects updatable property of updatable app",
9367 apex_is_updatable_bp: false,
9368 app_is_updatable_bp: true,
9369 app_is_updatable_expected: true,
9370 },
9371 {
9372 name: "Updatable apex respects updatable property of updatable app",
9373 apex_is_updatable_bp: true,
9374 app_is_updatable_bp: true,
9375 app_is_updatable_expected: true,
9376 },
9377 {
9378 name: "Updatable apex sets updatable=true on non-updatable app",
9379 apex_is_updatable_bp: true,
9380 app_is_updatable_bp: false,
9381 app_is_updatable_expected: true,
9382 },
9383 }
9384 for _, testCase := range testCases {
9385 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9386 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9387 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9388 }
9389}
9390
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009391func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009392 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009393}