blob: 6abd8ffa665ac27cd3c42b89c2aa48787d5b483e [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jiyong Park25fc6a92018-11-18 18:02:45 +090019 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Paul Duffin37856732021-02-26 14:24:15 +000021 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070022 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010023 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
29 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Paul Duffin40b62572021-03-20 11:39:01 +000051func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090052 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010053 android.GroupFixturePreparers(
54 prepareForApexTest,
55 android.GroupFixturePreparers(preparers...),
56 ).
Paul Duffine05480a2021-03-08 15:07:14 +000057 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000058 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090059}
60
Paul Duffin40b62572021-03-20 11:39:01 +000061func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090062 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010063
64 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000065 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010066 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000067 }
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 result := android.GroupFixturePreparers(
70 prepareForApexTest,
71 android.GroupFixturePreparers(preparers...),
72 optionalBpPreparer,
73 ).RunTest(t)
74
Paul Duffine05480a2021-03-08 15:07:14 +000075 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Paul Duffin810f33d2021-03-09 14:12:32 +000078func withFiles(files android.MockFS) android.FixturePreparer {
79 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090080}
81
Paul Duffin810f33d2021-03-09 14:12:32 +000082func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
83 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090084 for k, v := range targets {
85 config.Targets[k] = v
86 }
Paul Duffin810f33d2021-03-09 14:12:32 +000087 })
Jooyung Han344d5432019-08-23 11:17:39 +090088}
89
Jooyung Han35155c42020-02-06 17:33:20 +090090// withNativeBridgeTargets sets configuration with targets including:
91// - X86_64 (primary)
92// - X86 (secondary)
93// - Arm64 on X86_64 (native bridge)
94// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000095var withNativeBridgeEnabled = android.FixtureModifyConfig(
96 func(config android.Config) {
97 config.Targets[android.Android] = []android.Target{
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
106 }
107 },
108)
109
110func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
111 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
112 variables.ManifestPackageNameOverrides = specs
113 })
Jooyung Han35155c42020-02-06 17:33:20 +0900114}
115
Albert Martineefabcf2022-03-21 20:11:16 +0000116func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
117 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
118 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
119 })
120}
121
Paul Duffin810f33d2021-03-09 14:12:32 +0000122var withBinder32bit = android.FixtureModifyProductVariables(
123 func(variables android.FixtureProductVariables) {
124 variables.Binder32bit = proptools.BoolPtr(true)
125 },
126)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900127
Paul Duffin810f33d2021-03-09 14:12:32 +0000128var withUnbundledBuild = android.FixtureModifyProductVariables(
129 func(variables android.FixtureProductVariables) {
130 variables.Unbundled_build = proptools.BoolPtr(true)
131 },
132)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900133
Paul Duffin284165a2021-03-29 01:50:31 +0100134// Legacy preparer used for running tests within the apex package.
135//
136// This includes everything that was needed to run any test in the apex package prior to the
137// introduction of the test fixtures. Tests that are being converted to use fixtures directly
138// rather than through the testApex...() methods should avoid using this and instead use the
139// various preparers directly, using android.GroupFixturePreparers(...) to group them when
140// necessary.
141//
142// deprecated
143var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000144 // General preparers in alphabetical order as test infrastructure will enforce correct
145 // registration order.
146 android.PrepareForTestWithAndroidBuildComponents,
147 bpf.PrepareForTestWithBpf,
148 cc.PrepareForTestWithCcBuildComponents,
149 java.PrepareForTestWithJavaDefaultModules,
150 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
151 rust.PrepareForTestWithRustDefaultModules,
152 sh.PrepareForTestWithShBuildComponents,
153
154 PrepareForTestWithApexBuildComponents,
155
156 // Additional apex test specific preparers.
157 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
158 filegroup {
159 name: "myapex-file_contexts",
160 srcs: [
161 "apex/myapex-file_contexts",
162 ],
163 }
164 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000165 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000166 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000167 "a.java": nil,
168 "PrebuiltAppFoo.apk": nil,
169 "PrebuiltAppFooPriv.apk": nil,
170 "apex_manifest.json": nil,
171 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000172 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
173 "system/sepolicy/apex/myapex2-file_contexts": nil,
174 "system/sepolicy/apex/otherapex-file_contexts": nil,
175 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700177 "mylib.cpp": nil,
178 "mytest.cpp": nil,
179 "mytest1.cpp": nil,
180 "mytest2.cpp": nil,
181 "mytest3.cpp": nil,
182 "myprebuilt": nil,
183 "my_include": nil,
184 "foo/bar/MyClass.java": nil,
185 "prebuilt.jar": nil,
186 "prebuilt.so": nil,
187 "vendor/foo/devkeys/test.x509.pem": nil,
188 "vendor/foo/devkeys/test.pk8": nil,
189 "testkey.x509.pem": nil,
190 "testkey.pk8": nil,
191 "testkey.override.x509.pem": nil,
192 "testkey.override.pk8": nil,
193 "vendor/foo/devkeys/testkey.avbpubkey": nil,
194 "vendor/foo/devkeys/testkey.pem": nil,
195 "NOTICE": nil,
196 "custom_notice": nil,
197 "custom_notice_for_static_lib": nil,
198 "testkey2.avbpubkey": nil,
199 "testkey2.pem": nil,
200 "myapex-arm64.apex": nil,
201 "myapex-arm.apex": nil,
202 "myapex.apks": nil,
203 "frameworks/base/api/current.txt": nil,
204 "framework/aidl/a.aidl": nil,
205 "dummy.txt": nil,
206 "baz": nil,
207 "bar/baz": nil,
208 "testdata/baz": nil,
209 "AppSet.apks": nil,
210 "foo.rs": nil,
211 "libfoo.jar": nil,
212 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000213 },
214 ),
215
216 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
217 variables.DeviceVndkVersion = proptools.StringPtr("current")
218 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
219 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
220 variables.Platform_sdk_codename = proptools.StringPtr("Q")
221 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000222 // "Tiramisu" needs to be in the next line for compatibility with soong code,
223 // not because of these tests specifically (it's not used by the tests)
224 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900225 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000226 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000227 }),
228)
229
Paul Duffin52bfaa42021-03-23 23:40:12 +0000230var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
231 "system/sepolicy/apex/myapex-file_contexts": nil,
232})
233
Jooyung Han643adc42020-02-27 13:50:06 +0900234// ensure that 'result' equals 'expected'
235func ensureEquals(t *testing.T, result string, expected string) {
236 t.Helper()
237 if result != expected {
238 t.Errorf("%q != %q", expected, result)
239 }
240}
241
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242// ensure that 'result' contains 'expected'
243func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900244 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245 if !strings.Contains(result, expected) {
246 t.Errorf("%q is not found in %q", expected, result)
247 }
248}
249
Liz Kammer5bd365f2020-05-27 15:15:11 -0700250// ensure that 'result' contains 'expected' exactly one time
251func ensureContainsOnce(t *testing.T, result string, expected string) {
252 t.Helper()
253 count := strings.Count(result, expected)
254 if count != 1 {
255 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
256 }
257}
258
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259// ensures that 'result' does not contain 'notExpected'
260func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900261 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262 if strings.Contains(result, notExpected) {
263 t.Errorf("%q is found in %q", notExpected, result)
264 }
265}
266
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700267func ensureMatches(t *testing.T, result string, expectedRex string) {
268 ok, err := regexp.MatchString(expectedRex, result)
269 if err != nil {
270 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
271 return
272 }
273 if !ok {
274 t.Errorf("%s does not match regular expession %s", result, expectedRex)
275 }
276}
277
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900279 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if !android.InList(expected, result) {
281 t.Errorf("%q is not found in %v", expected, result)
282 }
283}
284
285func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900286 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287 if android.InList(notExpected, result) {
288 t.Errorf("%q is found in %v", notExpected, result)
289 }
290}
291
Jooyung Hane1633032019-08-01 17:41:43 +0900292func ensureListEmpty(t *testing.T, result []string) {
293 t.Helper()
294 if len(result) > 0 {
295 t.Errorf("%q is expected to be empty", result)
296 }
297}
298
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000299func ensureListNotEmpty(t *testing.T, result []string) {
300 t.Helper()
301 if len(result) == 0 {
302 t.Errorf("%q is expected to be not empty", result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// Minimal test
307func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800308 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900309 apex_defaults {
310 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900311 manifest: ":myapex.manifest",
312 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900314 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900315 native_shared_libs: [
316 "mylib",
317 "libfoo.ffi",
318 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900319 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800320 multilib: {
321 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900322 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800323 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900324 },
Jiyong Park77acec62020-06-01 21:39:15 +0900325 java_libs: [
326 "myjar",
327 "myjar_dex",
328 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000329 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 }
331
Jiyong Park30ca9372019-02-07 16:27:23 +0900332 apex {
333 name: "myapex",
334 defaults: ["myapex-defaults"],
335 }
336
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 apex_key {
338 name: "myapex.key",
339 public_key: "testkey.avbpubkey",
340 private_key: "testkey.pem",
341 }
342
Jiyong Park809bb722019-02-13 21:33:49 +0900343 filegroup {
344 name: "myapex.manifest",
345 srcs: ["apex_manifest.json"],
346 }
347
348 filegroup {
349 name: "myapex.androidmanifest",
350 srcs: ["AndroidManifest.xml"],
351 }
352
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 cc_library {
354 name: "mylib",
355 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900356 shared_libs: [
357 "mylib2",
358 "libbar.ffi",
359 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900360 system_shared_libs: [],
361 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000362 // TODO: remove //apex_available:platform
363 apex_available: [
364 "//apex_available:platform",
365 "myapex",
366 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900367 }
368
Alex Light3d673592019-01-18 14:37:31 -0800369 cc_binary {
370 name: "foo",
371 srcs: ["mylib.cpp"],
372 compile_multilib: "both",
373 multilib: {
374 lib32: {
375 suffix: "32",
376 },
377 lib64: {
378 suffix: "64",
379 },
380 },
381 symlinks: ["foo_link_"],
382 symlink_preferred_arch: true,
383 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800384 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700385 apex_available: [ "myapex", "com.android.gki.*" ],
386 }
387
Jiyong Park99644e92020-11-17 22:21:02 +0900388 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000389 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900390 srcs: ["foo.rs"],
391 rlibs: ["libfoo.rlib.rust"],
392 dylibs: ["libfoo.dylib.rust"],
393 apex_available: ["myapex"],
394 }
395
396 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000397 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900398 srcs: ["foo.rs"],
399 crate_name: "foo",
400 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900401 shared_libs: ["libfoo.shared_from_rust"],
402 }
403
404 cc_library_shared {
405 name: "libfoo.shared_from_rust",
406 srcs: ["mylib.cpp"],
407 system_shared_libs: [],
408 stl: "none",
409 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900410 }
411
412 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000413 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900414 srcs: ["foo.rs"],
415 crate_name: "foo",
416 apex_available: ["myapex"],
417 }
418
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900419 rust_ffi_shared {
420 name: "libfoo.ffi",
421 srcs: ["foo.rs"],
422 crate_name: "foo",
423 apex_available: ["myapex"],
424 }
425
426 rust_ffi_shared {
427 name: "libbar.ffi",
428 srcs: ["foo.rs"],
429 crate_name: "bar",
430 apex_available: ["myapex"],
431 }
432
Yifan Hongd22a84a2020-07-28 17:37:46 -0700433 apex {
434 name: "com.android.gki.fake",
435 binaries: ["foo"],
436 key: "myapex.key",
437 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000438 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900442 name: "mylib2",
443 srcs: ["mylib.cpp"],
444 system_shared_libs: [],
445 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900446 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900447 static_libs: ["libstatic"],
448 // TODO: remove //apex_available:platform
449 apex_available: [
450 "//apex_available:platform",
451 "myapex",
452 ],
453 }
454
Paul Duffindddd5462020-04-07 15:25:44 +0100455 cc_prebuilt_library_shared {
456 name: "mylib2",
457 srcs: ["prebuilt.so"],
458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
463 }
464
Jiyong Park9918e1a2020-03-17 19:16:40 +0900465 cc_library_static {
466 name: "libstatic",
467 srcs: ["mylib.cpp"],
468 system_shared_libs: [],
469 stl: "none",
470 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000471 // TODO: remove //apex_available:platform
472 apex_available: [
473 "//apex_available:platform",
474 "myapex",
475 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900476 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477
478 java_library {
479 name: "myjar",
480 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900481 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900482 sdk_version: "none",
483 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900485 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000486 // TODO: remove //apex_available:platform
487 apex_available: [
488 "//apex_available:platform",
489 "myapex",
490 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900491 }
492
Jiyong Park77acec62020-06-01 21:39:15 +0900493 dex_import {
494 name: "myjar_dex",
495 jars: ["prebuilt.jar"],
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
500 }
501
Jiyong Park7f7766d2019-07-25 22:02:35 +0900502 java_library {
503 name: "myotherjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900507 // TODO: remove //apex_available:platform
508 apex_available: [
509 "//apex_available:platform",
510 "myapex",
511 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900512 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900513
514 java_library {
515 name: "mysharedjar",
516 srcs: ["foo/bar/MyClass.java"],
517 sdk_version: "none",
518 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900519 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900520 `)
521
Paul Duffina71a67a2021-03-29 00:42:57 +0100522 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900523
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900524 // Make sure that Android.mk is created
525 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700526 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900527 var builder strings.Builder
528 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
529
530 androidMk := builder.String()
531 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
532 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
533
Jiyong Park42cca6c2019-04-01 11:15:50 +0900534 optFlags := apexRule.Args["opt_flags"]
535 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700536 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100537 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900538
Jiyong Park25fc6a92018-11-18 18:02:45 +0900539 copyCmds := apexRule.Args["copy_commands"]
540
541 // Ensure that main rule creates an output
542 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
543
544 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700545 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900550
551 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700552 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900558
559 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800560 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
561 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900563 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
566 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900567 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900568 // .. but not for java libs
569 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900570 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800571
Colin Cross7113d202019-11-20 16:39:12 -0800572 // Ensure that the platform variant ends with _shared or _common
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
574 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
576 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900577 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
578
579 // Ensure that dynamic dependency to java libs are not included
580 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800581
582 // Ensure that all symlinks are present.
583 found_foo_link_64 := false
584 found_foo := false
585 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900586 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800587 if strings.HasSuffix(cmd, "bin/foo") {
588 found_foo = true
589 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
590 found_foo_link_64 = true
591 }
592 }
593 }
594 good := found_foo && found_foo_link_64
595 if !good {
596 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
597 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900598
Artur Satayeva8bd1132020-04-27 18:07:06 +0100599 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100601 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
602 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
603 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100604
605 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100606 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100607 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
608 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
609 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800610}
611
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800613 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900614 apex_defaults {
615 name: "myapex-defaults",
616 key: "myapex.key",
617 prebuilts: ["myetc"],
618 native_shared_libs: ["mylib"],
619 java_libs: ["myjar"],
620 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900621 rros: ["rro"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800622 bpfs: ["bpf", "netd_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000623 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900624 }
625
626 prebuilt_etc {
627 name: "myetc",
628 src: "myprebuilt",
629 }
630
631 apex {
632 name: "myapex",
633 defaults: ["myapex-defaults"],
634 }
635
636 apex_key {
637 name: "myapex.key",
638 public_key: "testkey.avbpubkey",
639 private_key: "testkey.pem",
640 }
641
642 cc_library {
643 name: "mylib",
644 system_shared_libs: [],
645 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000646 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900647 }
648
649 java_library {
650 name: "myjar",
651 srcs: ["foo/bar/MyClass.java"],
652 sdk_version: "none",
653 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000654 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900655 }
656
657 android_app {
658 name: "AppFoo",
659 srcs: ["foo/bar/MyClass.java"],
660 sdk_version: "none",
661 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000662 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900663 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900664
665 runtime_resource_overlay {
666 name: "rro",
667 theme: "blue",
668 }
669
markchien2f59ec92020-09-02 16:23:38 +0800670 bpf {
671 name: "bpf",
672 srcs: ["bpf.c", "bpf2.c"],
673 }
674
Ken Chenfad7f9d2021-11-10 22:02:57 +0800675 bpf {
676 name: "netd_test",
677 srcs: ["netd_test.c"],
678 sub_dir: "netd",
679 }
680
Jooyung Hanf21c7972019-12-16 22:32:06 +0900681 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000682 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900683 "etc/myetc",
684 "javalib/myjar.jar",
685 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000686 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900687 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800688 "etc/bpf/bpf.o",
689 "etc/bpf/bpf2.o",
Ken Chenfad7f9d2021-11-10 22:02:57 +0800690 "etc/bpf/netd/netd_test.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900691 })
692}
693
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800695 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900696 apex {
697 name: "myapex",
698 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000699 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900700 }
701
702 apex_key {
703 name: "myapex.key",
704 public_key: "testkey.avbpubkey",
705 private_key: "testkey.pem",
706 }
707 `)
708
709 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900710 args := module.Rule("apexRule").Args
711 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
712 t.Error("manifest should be apex_manifest.pb, but " + manifest)
713 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900714}
715
Liz Kammer4854a7d2021-05-27 14:28:27 -0400716func TestApexManifestMinSdkVersion(t *testing.T) {
717 ctx := testApex(t, `
718 apex_defaults {
719 name: "my_defaults",
720 key: "myapex.key",
721 product_specific: true,
722 file_contexts: ":my-file-contexts",
723 updatable: false,
724 }
725 apex {
726 name: "myapex_30",
727 min_sdk_version: "30",
728 defaults: ["my_defaults"],
729 }
730
731 apex {
732 name: "myapex_current",
733 min_sdk_version: "current",
734 defaults: ["my_defaults"],
735 }
736
737 apex {
738 name: "myapex_none",
739 defaults: ["my_defaults"],
740 }
741
742 apex_key {
743 name: "myapex.key",
744 public_key: "testkey.avbpubkey",
745 private_key: "testkey.pem",
746 }
747
748 filegroup {
749 name: "my-file-contexts",
750 srcs: ["product_specific_file_contexts"],
751 }
752 `, withFiles(map[string][]byte{
753 "product_specific_file_contexts": nil,
754 }), android.FixtureModifyProductVariables(
755 func(variables android.FixtureProductVariables) {
756 variables.Unbundled_build = proptools.BoolPtr(true)
757 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
758 }), android.FixtureMergeEnv(map[string]string{
759 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
760 }))
761
762 testCases := []struct {
763 module string
764 minSdkVersion string
765 }{
766 {
767 module: "myapex_30",
768 minSdkVersion: "30",
769 },
770 {
771 module: "myapex_current",
772 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
773 },
774 {
775 module: "myapex_none",
776 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
777 },
778 }
779 for _, tc := range testCases {
780 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
781 args := module.Rule("apexRule").Args
782 optFlags := args["opt_flags"]
783 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
784 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
785 }
786 }
787}
788
Alex Light5098a612018-11-29 17:12:15 -0800789func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800790 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800791 apex {
792 name: "myapex",
793 key: "myapex.key",
794 payload_type: "zip",
795 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000796 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800797 }
798
799 apex_key {
800 name: "myapex.key",
801 public_key: "testkey.avbpubkey",
802 private_key: "testkey.pem",
803 }
804
805 cc_library {
806 name: "mylib",
807 srcs: ["mylib.cpp"],
808 shared_libs: ["mylib2"],
809 system_shared_libs: [],
810 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000811 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800812 }
813
814 cc_library {
815 name: "mylib2",
816 srcs: ["mylib.cpp"],
817 system_shared_libs: [],
818 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000819 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800820 }
821 `)
822
Sundong Ahnabb64432019-10-22 13:58:29 +0900823 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800824 copyCmds := zipApexRule.Args["copy_commands"]
825
826 // Ensure that main rule creates an output
827 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
828
829 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800831
832 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700833 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800834
835 // Ensure that both direct and indirect deps are copied into apex
836 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
837 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900838}
839
840func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800841 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900842 apex {
843 name: "myapex",
844 key: "myapex.key",
845 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900846 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000847 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900848 }
849
850 apex_key {
851 name: "myapex.key",
852 public_key: "testkey.avbpubkey",
853 private_key: "testkey.pem",
854 }
855
856 cc_library {
857 name: "mylib",
858 srcs: ["mylib.cpp"],
859 shared_libs: ["mylib2", "mylib3"],
860 system_shared_libs: [],
861 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000862 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900863 }
864
865 cc_library {
866 name: "mylib2",
867 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900868 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900869 system_shared_libs: [],
870 stl: "none",
871 stubs: {
872 versions: ["1", "2", "3"],
873 },
874 }
875
876 cc_library {
877 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900878 srcs: ["mylib.cpp"],
879 shared_libs: ["mylib4"],
880 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900881 stl: "none",
882 stubs: {
883 versions: ["10", "11", "12"],
884 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000885 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900886 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900887
888 cc_library {
889 name: "mylib4",
890 srcs: ["mylib.cpp"],
891 system_shared_libs: [],
892 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000893 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900894 }
Jiyong Park105dc322021-06-11 17:22:09 +0900895
896 rust_binary {
897 name: "foo.rust",
898 srcs: ["foo.rs"],
899 shared_libs: ["libfoo.shared_from_rust"],
900 prefer_rlib: true,
901 apex_available: ["myapex"],
902 }
903
904 cc_library_shared {
905 name: "libfoo.shared_from_rust",
906 srcs: ["mylib.cpp"],
907 system_shared_libs: [],
908 stl: "none",
909 stubs: {
910 versions: ["10", "11", "12"],
911 },
912 }
913
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914 `)
915
Sundong Ahnabb64432019-10-22 13:58:29 +0900916 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900917 copyCmds := apexRule.Args["copy_commands"]
918
919 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800920 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921
922 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800923 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924
925 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800926 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927
Colin Crossaede88c2020-08-11 12:17:01 -0700928 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900929
930 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900931 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900933 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900934
935 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700936 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900937 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700938 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900939
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700940 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
941 // is replaced by sharing of "cFlags" in cc/builder.go.
942 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
943 // module variable representing "cflags". So it was not detected by ensureNotContains.
944 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
945 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
946 // including the original cflags's "-include mylib.h".
947 //
Jiyong Park64379952018-12-13 18:37:29 +0900948 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700949 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
950 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900951
Jiyong Park85cc35a2022-07-17 11:30:47 +0900952 // Ensure that genstub for platform-provided lib is invoked with --systemapi
953 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
954 // Ensure that genstub for apex-provided lib is invoked with --apex
955 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900956
Jooyung Hana57af4a2020-01-23 05:36:59 +0000957 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900958 "lib64/mylib.so",
959 "lib64/mylib3.so",
960 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900961 "bin/foo.rust",
962 "lib64/libc++.so", // by the implicit dependency from foo.rust
963 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900964 })
Jiyong Park105dc322021-06-11 17:22:09 +0900965
966 // Ensure that stub dependency from a rust module is not included
967 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
968 // The rust module is linked to the stub cc library
969 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
970 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
971 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900972
973 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
974 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900975}
976
Jiyong Park1bc84122021-06-22 20:23:05 +0900977func TestApexCanUsePrivateApis(t *testing.T) {
978 ctx := testApex(t, `
979 apex {
980 name: "myapex",
981 key: "myapex.key",
982 native_shared_libs: ["mylib"],
983 binaries: ["foo.rust"],
984 updatable: false,
985 platform_apis: true,
986 }
987
988 apex_key {
989 name: "myapex.key",
990 public_key: "testkey.avbpubkey",
991 private_key: "testkey.pem",
992 }
993
994 cc_library {
995 name: "mylib",
996 srcs: ["mylib.cpp"],
997 shared_libs: ["mylib2"],
998 system_shared_libs: [],
999 stl: "none",
1000 apex_available: [ "myapex" ],
1001 }
1002
1003 cc_library {
1004 name: "mylib2",
1005 srcs: ["mylib.cpp"],
1006 cflags: ["-include mylib.h"],
1007 system_shared_libs: [],
1008 stl: "none",
1009 stubs: {
1010 versions: ["1", "2", "3"],
1011 },
1012 }
1013
1014 rust_binary {
1015 name: "foo.rust",
1016 srcs: ["foo.rs"],
1017 shared_libs: ["libfoo.shared_from_rust"],
1018 prefer_rlib: true,
1019 apex_available: ["myapex"],
1020 }
1021
1022 cc_library_shared {
1023 name: "libfoo.shared_from_rust",
1024 srcs: ["mylib.cpp"],
1025 system_shared_libs: [],
1026 stl: "none",
1027 stubs: {
1028 versions: ["10", "11", "12"],
1029 },
1030 }
1031 `)
1032
1033 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1034 copyCmds := apexRule.Args["copy_commands"]
1035
1036 // Ensure that indirect stubs dep is not included
1037 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1038 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1039
1040 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1041 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001042 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001043 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1044 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001045 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001046 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1047 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1048}
1049
Colin Cross7812fd32020-09-25 12:35:10 -07001050func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1051 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001052 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001053 apex {
1054 name: "myapex",
1055 key: "myapex.key",
1056 native_shared_libs: ["mylib", "mylib3"],
1057 min_sdk_version: "29",
1058 }
1059
1060 apex_key {
1061 name: "myapex.key",
1062 public_key: "testkey.avbpubkey",
1063 private_key: "testkey.pem",
1064 }
1065
1066 cc_library {
1067 name: "mylib",
1068 srcs: ["mylib.cpp"],
1069 shared_libs: ["mylib2", "mylib3"],
1070 system_shared_libs: [],
1071 stl: "none",
1072 apex_available: [ "myapex" ],
1073 min_sdk_version: "28",
1074 }
1075
1076 cc_library {
1077 name: "mylib2",
1078 srcs: ["mylib.cpp"],
1079 cflags: ["-include mylib.h"],
1080 system_shared_libs: [],
1081 stl: "none",
1082 stubs: {
1083 versions: ["28", "29", "30", "current"],
1084 },
1085 min_sdk_version: "28",
1086 }
1087
1088 cc_library {
1089 name: "mylib3",
1090 srcs: ["mylib.cpp"],
1091 shared_libs: ["mylib4"],
1092 system_shared_libs: [],
1093 stl: "none",
1094 stubs: {
1095 versions: ["28", "29", "30", "current"],
1096 },
1097 apex_available: [ "myapex" ],
1098 min_sdk_version: "28",
1099 }
1100
1101 cc_library {
1102 name: "mylib4",
1103 srcs: ["mylib.cpp"],
1104 system_shared_libs: [],
1105 stl: "none",
1106 apex_available: [ "myapex" ],
1107 min_sdk_version: "28",
1108 }
1109 `)
1110
1111 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1112 copyCmds := apexRule.Args["copy_commands"]
1113
1114 // Ensure that direct non-stubs dep is always included
1115 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1116
1117 // Ensure that indirect stubs dep is not included
1118 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1119
1120 // Ensure that direct stubs dep is included
1121 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1122
1123 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1124
Jiyong Park55549df2021-02-26 23:57:23 +09001125 // Ensure that mylib is linking with the latest version of stub for mylib2
1126 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001127 // ... and not linking to the non-stub (impl) variant of mylib2
1128 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1129
1130 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1131 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1132 // .. and not linking to the stubs variant of mylib3
1133 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1134
1135 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001136 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001137 ensureNotContains(t, mylib2Cflags, "-include ")
1138
Jiyong Park85cc35a2022-07-17 11:30:47 +09001139 // Ensure that genstub is invoked with --systemapi
1140 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001141
1142 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1143 "lib64/mylib.so",
1144 "lib64/mylib3.so",
1145 "lib64/mylib4.so",
1146 })
1147}
1148
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001149func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1150 t.Parallel()
1151 // myapex (Z)
1152 // mylib -----------------.
1153 // |
1154 // otherapex (29) |
1155 // libstub's versions: 29 Z current
1156 // |
1157 // <platform> |
1158 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001159 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001160 apex {
1161 name: "myapex",
1162 key: "myapex.key",
1163 native_shared_libs: ["mylib"],
1164 min_sdk_version: "Z", // non-final
1165 }
1166
1167 cc_library {
1168 name: "mylib",
1169 srcs: ["mylib.cpp"],
1170 shared_libs: ["libstub"],
1171 apex_available: ["myapex"],
1172 min_sdk_version: "Z",
1173 }
1174
1175 apex_key {
1176 name: "myapex.key",
1177 public_key: "testkey.avbpubkey",
1178 private_key: "testkey.pem",
1179 }
1180
1181 apex {
1182 name: "otherapex",
1183 key: "myapex.key",
1184 native_shared_libs: ["libstub"],
1185 min_sdk_version: "29",
1186 }
1187
1188 cc_library {
1189 name: "libstub",
1190 srcs: ["mylib.cpp"],
1191 stubs: {
1192 versions: ["29", "Z", "current"],
1193 },
1194 apex_available: ["otherapex"],
1195 min_sdk_version: "29",
1196 }
1197
1198 // platform module depending on libstub from otherapex should use the latest stub("current")
1199 cc_library {
1200 name: "libplatform",
1201 srcs: ["mylib.cpp"],
1202 shared_libs: ["libstub"],
1203 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001204 `,
1205 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1206 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1207 variables.Platform_sdk_final = proptools.BoolPtr(false)
1208 variables.Platform_version_active_codenames = []string{"Z"}
1209 }),
1210 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001211
Jiyong Park55549df2021-02-26 23:57:23 +09001212 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001213 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001214 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001215 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001216 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001217
1218 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1219 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1220 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1221 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1222 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1223}
1224
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001225func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001226 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001227 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001228 name: "myapex2",
1229 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001231 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001232 }
1233
1234 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001235 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001236 public_key: "testkey.avbpubkey",
1237 private_key: "testkey.pem",
1238 }
1239
1240 cc_library {
1241 name: "mylib",
1242 srcs: ["mylib.cpp"],
1243 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001244 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001245 system_shared_libs: [],
1246 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001247 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001248 }
1249
1250 cc_library {
1251 name: "libfoo",
1252 srcs: ["mylib.cpp"],
1253 shared_libs: ["libbar"],
1254 system_shared_libs: [],
1255 stl: "none",
1256 stubs: {
1257 versions: ["10", "20", "30"],
1258 },
1259 }
1260
1261 cc_library {
1262 name: "libbar",
1263 srcs: ["mylib.cpp"],
1264 system_shared_libs: [],
1265 stl: "none",
1266 }
1267
Jiyong Park678c8812020-02-07 17:25:49 +09001268 cc_library_static {
1269 name: "libbaz",
1270 srcs: ["mylib.cpp"],
1271 system_shared_libs: [],
1272 stl: "none",
1273 apex_available: [ "myapex2" ],
1274 }
1275
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001276 `)
1277
Jiyong Park83dc74b2020-01-14 18:38:44 +09001278 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001279 copyCmds := apexRule.Args["copy_commands"]
1280
1281 // Ensure that direct non-stubs dep is always included
1282 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1283
1284 // Ensure that indirect stubs dep is not included
1285 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1286
1287 // Ensure that dependency of stubs is not included
1288 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1289
Colin Crossaede88c2020-08-11 12:17:01 -07001290 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001291
1292 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001293 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001294 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001295 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001296
Jiyong Park3ff16992019-12-27 14:11:47 +09001297 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001298
1299 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1300 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001301
Artur Satayeva8bd1132020-04-27 18:07:06 +01001302 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001303 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001304
Artur Satayeva8bd1132020-04-27 18:07:06 +01001305 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001306 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001307}
1308
Jooyung Hand3639552019-08-09 12:57:43 +09001309func TestApexWithRuntimeLibsDependency(t *testing.T) {
1310 /*
1311 myapex
1312 |
1313 v (runtime_libs)
1314 mylib ------+------> libfoo [provides stub]
1315 |
1316 `------> libbar
1317 */
Colin Cross1c460562021-02-16 17:55:47 -08001318 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001319 apex {
1320 name: "myapex",
1321 key: "myapex.key",
1322 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001323 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001324 }
1325
1326 apex_key {
1327 name: "myapex.key",
1328 public_key: "testkey.avbpubkey",
1329 private_key: "testkey.pem",
1330 }
1331
1332 cc_library {
1333 name: "mylib",
1334 srcs: ["mylib.cpp"],
1335 runtime_libs: ["libfoo", "libbar"],
1336 system_shared_libs: [],
1337 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001338 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001339 }
1340
1341 cc_library {
1342 name: "libfoo",
1343 srcs: ["mylib.cpp"],
1344 system_shared_libs: [],
1345 stl: "none",
1346 stubs: {
1347 versions: ["10", "20", "30"],
1348 },
1349 }
1350
1351 cc_library {
1352 name: "libbar",
1353 srcs: ["mylib.cpp"],
1354 system_shared_libs: [],
1355 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001356 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001357 }
1358
1359 `)
1360
Sundong Ahnabb64432019-10-22 13:58:29 +09001361 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001362 copyCmds := apexRule.Args["copy_commands"]
1363
1364 // Ensure that direct non-stubs dep is always included
1365 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1366
1367 // Ensure that indirect stubs dep is not included
1368 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1369
1370 // Ensure that runtime_libs dep in included
1371 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1372
Sundong Ahnabb64432019-10-22 13:58:29 +09001373 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001374 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1375 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001376
1377}
1378
Paul Duffina02cae32021-03-09 01:44:06 +00001379var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1380 cc.PrepareForTestWithCcBuildComponents,
1381 PrepareForTestWithApexBuildComponents,
1382 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001383 apex {
1384 name: "com.android.runtime",
1385 key: "com.android.runtime.key",
1386 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001387 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001388 }
1389
1390 apex_key {
1391 name: "com.android.runtime.key",
1392 public_key: "testkey.avbpubkey",
1393 private_key: "testkey.pem",
1394 }
Paul Duffina02cae32021-03-09 01:44:06 +00001395 `),
1396 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1397)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001398
Paul Duffina02cae32021-03-09 01:44:06 +00001399func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001400 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001401 cc_library {
1402 name: "libc",
1403 no_libcrt: true,
1404 nocrt: true,
1405 stl: "none",
1406 system_shared_libs: [],
1407 stubs: { versions: ["1"] },
1408 apex_available: ["com.android.runtime"],
1409
1410 sanitize: {
1411 hwaddress: true,
1412 }
1413 }
1414
1415 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001416 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001417 no_libcrt: true,
1418 nocrt: true,
1419 stl: "none",
1420 system_shared_libs: [],
1421 srcs: [""],
1422 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001423 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001424
1425 sanitize: {
1426 never: true,
1427 },
Paul Duffina02cae32021-03-09 01:44:06 +00001428 } `)
1429 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001430
1431 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1432 "lib64/bionic/libc.so",
1433 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1434 })
1435
Colin Cross4c4c1be2022-02-10 11:41:18 -08001436 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001437
1438 installed := hwasan.Description("install libclang_rt.hwasan")
1439 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1440
1441 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1442 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1443 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1444}
1445
1446func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001447 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001448 prepareForTestOfRuntimeApexWithHwasan,
1449 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1450 variables.SanitizeDevice = []string{"hwaddress"}
1451 }),
1452 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001453 cc_library {
1454 name: "libc",
1455 no_libcrt: true,
1456 nocrt: true,
1457 stl: "none",
1458 system_shared_libs: [],
1459 stubs: { versions: ["1"] },
1460 apex_available: ["com.android.runtime"],
1461 }
1462
1463 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001464 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001465 no_libcrt: true,
1466 nocrt: true,
1467 stl: "none",
1468 system_shared_libs: [],
1469 srcs: [""],
1470 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001471 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001472
1473 sanitize: {
1474 never: true,
1475 },
1476 }
Paul Duffina02cae32021-03-09 01:44:06 +00001477 `)
1478 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001479
1480 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1481 "lib64/bionic/libc.so",
1482 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1483 })
1484
Colin Cross4c4c1be2022-02-10 11:41:18 -08001485 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001486
1487 installed := hwasan.Description("install libclang_rt.hwasan")
1488 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1489
1490 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1491 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1492 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1493}
1494
Jooyung Han61b66e92020-03-21 14:21:46 +00001495func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1496 testcases := []struct {
1497 name string
1498 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001499 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001500 shouldLink string
1501 shouldNotLink []string
1502 }{
1503 {
Jiyong Park55549df2021-02-26 23:57:23 +09001504 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001505 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001506 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001507 shouldLink: "current",
1508 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001509 },
1510 {
Jiyong Park55549df2021-02-26 23:57:23 +09001511 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001512 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001513 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001514 shouldLink: "current",
1515 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001516 },
1517 }
1518 for _, tc := range testcases {
1519 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001520 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001521 apex {
1522 name: "myapex",
1523 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001524 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001525 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001526 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001527 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001528
Jooyung Han61b66e92020-03-21 14:21:46 +00001529 apex_key {
1530 name: "myapex.key",
1531 public_key: "testkey.avbpubkey",
1532 private_key: "testkey.pem",
1533 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001534
Jooyung Han61b66e92020-03-21 14:21:46 +00001535 cc_library {
1536 name: "mylib",
1537 srcs: ["mylib.cpp"],
1538 vendor_available: true,
1539 shared_libs: ["libbar"],
1540 system_shared_libs: [],
1541 stl: "none",
1542 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001543 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001545
Jooyung Han61b66e92020-03-21 14:21:46 +00001546 cc_library {
1547 name: "libbar",
1548 srcs: ["mylib.cpp"],
1549 system_shared_libs: [],
1550 stl: "none",
1551 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001552 llndk: {
1553 symbol_file: "libbar.map.txt",
1554 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001555 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001556 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001557 withUnbundledBuild,
1558 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001559
Jooyung Han61b66e92020-03-21 14:21:46 +00001560 // Ensure that LLNDK dep is not included
1561 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1562 "lib64/mylib.so",
1563 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001564
Jooyung Han61b66e92020-03-21 14:21:46 +00001565 // Ensure that LLNDK dep is required
1566 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1567 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1568 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001569
Steven Moreland2c4000c2021-04-27 02:08:49 +00001570 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1571 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001573 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001574 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001575
Steven Moreland2c4000c2021-04-27 02:08:49 +00001576 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001577 ver := tc.shouldLink
1578 if tc.shouldLink == "current" {
1579 ver = strconv.Itoa(android.FutureApiLevelInt)
1580 }
1581 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001582 })
1583 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001584}
1585
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001587 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001588 apex {
1589 name: "myapex",
1590 key: "myapex.key",
1591 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001592 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001593 }
1594
1595 apex_key {
1596 name: "myapex.key",
1597 public_key: "testkey.avbpubkey",
1598 private_key: "testkey.pem",
1599 }
1600
1601 cc_library {
1602 name: "mylib",
1603 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001604 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001605 shared_libs: ["libdl#27"],
1606 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001607 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001608 }
1609
1610 cc_library_shared {
1611 name: "mylib_shared",
1612 srcs: ["mylib.cpp"],
1613 shared_libs: ["libdl#27"],
1614 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001615 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001616 }
1617
1618 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001619 name: "libBootstrap",
1620 srcs: ["mylib.cpp"],
1621 stl: "none",
1622 bootstrap: true,
1623 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001624 `)
1625
Sundong Ahnabb64432019-10-22 13:58:29 +09001626 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001627 copyCmds := apexRule.Args["copy_commands"]
1628
1629 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001630 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001631 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1632 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001633
1634 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001635 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001636
Colin Crossaede88c2020-08-11 12:17:01 -07001637 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1638 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1639 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001640
1641 // For dependency to libc
1642 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001643 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001645 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001646 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001647 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1648 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001649
1650 // For dependency to libm
1651 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001652 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001653 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001654 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001655 // ... and is not compiling with the stub
1656 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1657 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1658
1659 // For dependency to libdl
1660 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001661 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001662 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001663 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1664 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001666 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001667 // ... Cflags from stub is correctly exported to mylib
1668 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1669 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001670
1671 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001672 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1673 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1674 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1675 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001676}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001677
Jooyung Han749dc692020-04-15 11:03:39 +09001678func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001679 // there are three links between liba --> libz.
1680 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001681 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001682 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001683 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001684 apex {
1685 name: "myapex",
1686 key: "myapex.key",
1687 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001688 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001689 }
1690
1691 apex {
1692 name: "otherapex",
1693 key: "myapex.key",
1694 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001695 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001696 }
1697
1698 apex_key {
1699 name: "myapex.key",
1700 public_key: "testkey.avbpubkey",
1701 private_key: "testkey.pem",
1702 }
1703
1704 cc_library {
1705 name: "libx",
1706 shared_libs: ["liba"],
1707 system_shared_libs: [],
1708 stl: "none",
1709 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001710 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001711 }
1712
1713 cc_library {
1714 name: "liby",
1715 shared_libs: ["liba"],
1716 system_shared_libs: [],
1717 stl: "none",
1718 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001719 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001720 }
1721
1722 cc_library {
1723 name: "liba",
1724 shared_libs: ["libz"],
1725 system_shared_libs: [],
1726 stl: "none",
1727 apex_available: [
1728 "//apex_available:anyapex",
1729 "//apex_available:platform",
1730 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001731 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001732 }
1733
1734 cc_library {
1735 name: "libz",
1736 system_shared_libs: [],
1737 stl: "none",
1738 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001739 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001740 },
1741 }
Jooyung Han749dc692020-04-15 11:03:39 +09001742 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001743
1744 expectLink := func(from, from_variant, to, to_variant string) {
1745 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1746 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1747 }
1748 expectNoLink := func(from, from_variant, to, to_variant string) {
1749 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1750 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1751 }
1752 // platform liba is linked to non-stub version
1753 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001754 // liba in myapex is linked to current
1755 expectLink("liba", "shared_apex29", "libz", "shared_current")
1756 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001757 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001758 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001759 // liba in otherapex is linked to current
1760 expectLink("liba", "shared_apex30", "libz", "shared_current")
1761 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001762 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1763 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001764}
1765
Jooyung Hanaed150d2020-04-02 01:41:41 +09001766func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001767 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001768 apex {
1769 name: "myapex",
1770 key: "myapex.key",
1771 native_shared_libs: ["libx"],
1772 min_sdk_version: "R",
1773 }
1774
1775 apex_key {
1776 name: "myapex.key",
1777 public_key: "testkey.avbpubkey",
1778 private_key: "testkey.pem",
1779 }
1780
1781 cc_library {
1782 name: "libx",
1783 shared_libs: ["libz"],
1784 system_shared_libs: [],
1785 stl: "none",
1786 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001787 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001788 }
1789
1790 cc_library {
1791 name: "libz",
1792 system_shared_libs: [],
1793 stl: "none",
1794 stubs: {
1795 versions: ["29", "R"],
1796 },
1797 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001798 `,
1799 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1800 variables.Platform_version_active_codenames = []string{"R"}
1801 }),
1802 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001803
1804 expectLink := func(from, from_variant, to, to_variant string) {
1805 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1806 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1807 }
1808 expectNoLink := func(from, from_variant, to, to_variant string) {
1809 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1810 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1811 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001812 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1813 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001814 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1815 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001816}
1817
Jooyung Han4c4da062021-06-23 10:23:16 +09001818func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1819 testApex(t, `
1820 apex {
1821 name: "myapex",
1822 key: "myapex.key",
1823 java_libs: ["libx"],
1824 min_sdk_version: "S",
1825 }
1826
1827 apex_key {
1828 name: "myapex.key",
1829 public_key: "testkey.avbpubkey",
1830 private_key: "testkey.pem",
1831 }
1832
1833 java_library {
1834 name: "libx",
1835 srcs: ["a.java"],
1836 apex_available: [ "myapex" ],
1837 sdk_version: "current",
1838 min_sdk_version: "S", // should be okay
1839 }
1840 `,
1841 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1842 variables.Platform_version_active_codenames = []string{"S"}
1843 variables.Platform_sdk_codename = proptools.StringPtr("S")
1844 }),
1845 )
1846}
1847
Jooyung Han749dc692020-04-15 11:03:39 +09001848func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001849 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001850 apex {
1851 name: "myapex",
1852 key: "myapex.key",
1853 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001854 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001855 }
1856
1857 apex_key {
1858 name: "myapex.key",
1859 public_key: "testkey.avbpubkey",
1860 private_key: "testkey.pem",
1861 }
1862
1863 cc_library {
1864 name: "libx",
1865 shared_libs: ["libz"],
1866 system_shared_libs: [],
1867 stl: "none",
1868 apex_available: [ "myapex" ],
1869 }
1870
1871 cc_library {
1872 name: "libz",
1873 system_shared_libs: [],
1874 stl: "none",
1875 stubs: {
1876 versions: ["1", "2"],
1877 },
1878 }
1879 `)
1880
1881 expectLink := func(from, from_variant, to, to_variant string) {
1882 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1883 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1884 }
1885 expectNoLink := func(from, from_variant, to, to_variant string) {
1886 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1887 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1888 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001889 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001890 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001891 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001892 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001893}
1894
Jiyong Park5df7bd32021-08-25 16:18:46 +09001895func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1896 ctx := testApex(t, `
1897 apex {
1898 name: "myapex",
1899 key: "myapex.key",
1900 native_shared_libs: ["mylib"],
1901 updatable: false,
1902 vendor: true,
1903 min_sdk_version: "29",
1904 }
1905
1906 apex_key {
1907 name: "myapex.key",
1908 public_key: "testkey.avbpubkey",
1909 private_key: "testkey.pem",
1910 }
1911
1912 cc_library {
1913 name: "mylib",
1914 vendor_available: true,
1915 system_shared_libs: [],
1916 stl: "none",
1917 apex_available: [ "myapex" ],
1918 min_sdk_version: "29",
1919 }
1920 `)
1921
1922 vendorVariant := "android_vendor.29_arm64_armv8-a"
1923
1924 // First check that the correct variant of crtbegin_so is used.
1925 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1926 crtBegin := names(ldRule.Args["crtBegin"])
1927 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1928
1929 // Ensure that the crtbegin_so used by the APEX is targeting 29
1930 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1931 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1932}
1933
Jooyung Han03b51852020-02-26 22:45:42 +09001934func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001935 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001936 apex {
1937 name: "myapex",
1938 key: "myapex.key",
1939 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001940 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001941 }
1942
1943 apex_key {
1944 name: "myapex.key",
1945 public_key: "testkey.avbpubkey",
1946 private_key: "testkey.pem",
1947 }
1948
1949 cc_library {
1950 name: "libx",
1951 system_shared_libs: [],
1952 stl: "none",
1953 apex_available: [ "myapex" ],
1954 stubs: {
1955 versions: ["1", "2"],
1956 },
1957 }
1958
1959 cc_library {
1960 name: "libz",
1961 shared_libs: ["libx"],
1962 system_shared_libs: [],
1963 stl: "none",
1964 }
1965 `)
1966
1967 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001968 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001969 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1970 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1971 }
1972 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001973 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001974 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1975 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1976 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001977 expectLink("libz", "shared", "libx", "shared_current")
1978 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001979 expectNoLink("libz", "shared", "libz", "shared_1")
1980 expectNoLink("libz", "shared", "libz", "shared")
1981}
1982
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001983var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1984 func(variables android.FixtureProductVariables) {
1985 variables.SanitizeDevice = []string{"hwaddress"}
1986 },
1987)
1988
Jooyung Han75568392020-03-20 04:29:24 +09001989func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001990 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001991 apex {
1992 name: "myapex",
1993 key: "myapex.key",
1994 native_shared_libs: ["libx"],
1995 min_sdk_version: "29",
1996 }
1997
1998 apex_key {
1999 name: "myapex.key",
2000 public_key: "testkey.avbpubkey",
2001 private_key: "testkey.pem",
2002 }
2003
2004 cc_library {
2005 name: "libx",
2006 shared_libs: ["libbar"],
2007 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002008 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002009 }
2010
2011 cc_library {
2012 name: "libbar",
2013 stubs: {
2014 versions: ["29", "30"],
2015 },
2016 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002017 `,
2018 prepareForTestWithSantitizeHwaddress,
2019 )
Jooyung Han03b51852020-02-26 22:45:42 +09002020 expectLink := func(from, from_variant, to, to_variant string) {
2021 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2022 libFlags := ld.Args["libFlags"]
2023 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2024 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002025 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002026}
2027
Jooyung Han75568392020-03-20 04:29:24 +09002028func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002029 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002030 apex {
2031 name: "myapex",
2032 key: "myapex.key",
2033 native_shared_libs: ["libx"],
2034 min_sdk_version: "29",
2035 }
2036
2037 apex_key {
2038 name: "myapex.key",
2039 public_key: "testkey.avbpubkey",
2040 private_key: "testkey.pem",
2041 }
2042
2043 cc_library {
2044 name: "libx",
2045 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002046 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002047 }
Jooyung Han75568392020-03-20 04:29:24 +09002048 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002049
2050 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002051 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002052 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002053 // note that platform variant is not.
2054 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002055 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002056}
2057
Jooyung Han749dc692020-04-15 11:03:39 +09002058func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2059 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002060 apex {
2061 name: "myapex",
2062 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002063 native_shared_libs: ["mylib"],
2064 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002065 }
2066
2067 apex_key {
2068 name: "myapex.key",
2069 public_key: "testkey.avbpubkey",
2070 private_key: "testkey.pem",
2071 }
Jooyung Han749dc692020-04-15 11:03:39 +09002072
2073 cc_library {
2074 name: "mylib",
2075 srcs: ["mylib.cpp"],
2076 system_shared_libs: [],
2077 stl: "none",
2078 apex_available: [
2079 "myapex",
2080 ],
2081 min_sdk_version: "30",
2082 }
2083 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002084
2085 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2086 apex {
2087 name: "myapex",
2088 key: "myapex.key",
2089 native_shared_libs: ["libfoo.ffi"],
2090 min_sdk_version: "29",
2091 }
2092
2093 apex_key {
2094 name: "myapex.key",
2095 public_key: "testkey.avbpubkey",
2096 private_key: "testkey.pem",
2097 }
2098
2099 rust_ffi_shared {
2100 name: "libfoo.ffi",
2101 srcs: ["foo.rs"],
2102 crate_name: "foo",
2103 apex_available: [
2104 "myapex",
2105 ],
2106 min_sdk_version: "30",
2107 }
2108 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002109
2110 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2111 apex {
2112 name: "myapex",
2113 key: "myapex.key",
2114 java_libs: ["libfoo"],
2115 min_sdk_version: "29",
2116 }
2117
2118 apex_key {
2119 name: "myapex.key",
2120 public_key: "testkey.avbpubkey",
2121 private_key: "testkey.pem",
2122 }
2123
2124 java_import {
2125 name: "libfoo",
2126 jars: ["libfoo.jar"],
2127 apex_available: [
2128 "myapex",
2129 ],
2130 min_sdk_version: "30",
2131 }
2132 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002133}
2134
2135func TestApexMinSdkVersion_Okay(t *testing.T) {
2136 testApex(t, `
2137 apex {
2138 name: "myapex",
2139 key: "myapex.key",
2140 native_shared_libs: ["libfoo"],
2141 java_libs: ["libbar"],
2142 min_sdk_version: "29",
2143 }
2144
2145 apex_key {
2146 name: "myapex.key",
2147 public_key: "testkey.avbpubkey",
2148 private_key: "testkey.pem",
2149 }
2150
2151 cc_library {
2152 name: "libfoo",
2153 srcs: ["mylib.cpp"],
2154 shared_libs: ["libfoo_dep"],
2155 apex_available: ["myapex"],
2156 min_sdk_version: "29",
2157 }
2158
2159 cc_library {
2160 name: "libfoo_dep",
2161 srcs: ["mylib.cpp"],
2162 apex_available: ["myapex"],
2163 min_sdk_version: "29",
2164 }
2165
2166 java_library {
2167 name: "libbar",
2168 sdk_version: "current",
2169 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002170 static_libs: [
2171 "libbar_dep",
2172 "libbar_import_dep",
2173 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002174 apex_available: ["myapex"],
2175 min_sdk_version: "29",
2176 }
2177
2178 java_library {
2179 name: "libbar_dep",
2180 sdk_version: "current",
2181 srcs: ["a.java"],
2182 apex_available: ["myapex"],
2183 min_sdk_version: "29",
2184 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002185
2186 java_import {
2187 name: "libbar_import_dep",
2188 jars: ["libbar.jar"],
2189 apex_available: ["myapex"],
2190 min_sdk_version: "29",
2191 }
Jooyung Han03b51852020-02-26 22:45:42 +09002192 `)
2193}
2194
Artur Satayev8cf899a2020-04-15 17:29:42 +01002195func TestJavaStableSdkVersion(t *testing.T) {
2196 testCases := []struct {
2197 name string
2198 expectedError string
2199 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002200 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002201 }{
2202 {
2203 name: "Non-updatable apex with non-stable dep",
2204 bp: `
2205 apex {
2206 name: "myapex",
2207 java_libs: ["myjar"],
2208 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002209 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002210 }
2211 apex_key {
2212 name: "myapex.key",
2213 public_key: "testkey.avbpubkey",
2214 private_key: "testkey.pem",
2215 }
2216 java_library {
2217 name: "myjar",
2218 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002219 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002220 apex_available: ["myapex"],
2221 }
2222 `,
2223 },
2224 {
2225 name: "Updatable apex with stable dep",
2226 bp: `
2227 apex {
2228 name: "myapex",
2229 java_libs: ["myjar"],
2230 key: "myapex.key",
2231 updatable: true,
2232 min_sdk_version: "29",
2233 }
2234 apex_key {
2235 name: "myapex.key",
2236 public_key: "testkey.avbpubkey",
2237 private_key: "testkey.pem",
2238 }
2239 java_library {
2240 name: "myjar",
2241 srcs: ["foo/bar/MyClass.java"],
2242 sdk_version: "current",
2243 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002244 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002245 }
2246 `,
2247 },
2248 {
2249 name: "Updatable apex with non-stable dep",
2250 expectedError: "cannot depend on \"myjar\"",
2251 bp: `
2252 apex {
2253 name: "myapex",
2254 java_libs: ["myjar"],
2255 key: "myapex.key",
2256 updatable: true,
2257 }
2258 apex_key {
2259 name: "myapex.key",
2260 public_key: "testkey.avbpubkey",
2261 private_key: "testkey.pem",
2262 }
2263 java_library {
2264 name: "myjar",
2265 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002266 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002267 apex_available: ["myapex"],
2268 }
2269 `,
2270 },
2271 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002272 name: "Updatable apex with non-stable legacy core platform dep",
2273 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2274 bp: `
2275 apex {
2276 name: "myapex",
2277 java_libs: ["myjar-uses-legacy"],
2278 key: "myapex.key",
2279 updatable: true,
2280 }
2281 apex_key {
2282 name: "myapex.key",
2283 public_key: "testkey.avbpubkey",
2284 private_key: "testkey.pem",
2285 }
2286 java_library {
2287 name: "myjar-uses-legacy",
2288 srcs: ["foo/bar/MyClass.java"],
2289 sdk_version: "core_platform",
2290 apex_available: ["myapex"],
2291 }
2292 `,
2293 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2294 },
2295 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002296 name: "Updatable apex with non-stable transitive dep",
2297 // This is not actually detecting that the transitive dependency is unstable, rather it is
2298 // detecting that the transitive dependency is building against a wider API surface than the
2299 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002300 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002301 bp: `
2302 apex {
2303 name: "myapex",
2304 java_libs: ["myjar"],
2305 key: "myapex.key",
2306 updatable: true,
2307 }
2308 apex_key {
2309 name: "myapex.key",
2310 public_key: "testkey.avbpubkey",
2311 private_key: "testkey.pem",
2312 }
2313 java_library {
2314 name: "myjar",
2315 srcs: ["foo/bar/MyClass.java"],
2316 sdk_version: "current",
2317 apex_available: ["myapex"],
2318 static_libs: ["transitive-jar"],
2319 }
2320 java_library {
2321 name: "transitive-jar",
2322 srcs: ["foo/bar/MyClass.java"],
2323 sdk_version: "core_platform",
2324 apex_available: ["myapex"],
2325 }
2326 `,
2327 },
2328 }
2329
2330 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002331 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2332 continue
2333 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002334 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002335 errorHandler := android.FixtureExpectsNoErrors
2336 if test.expectedError != "" {
2337 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002338 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002339 android.GroupFixturePreparers(
2340 java.PrepareForTestWithJavaDefaultModules,
2341 PrepareForTestWithApexBuildComponents,
2342 prepareForTestWithMyapex,
2343 android.OptionalFixturePreparer(test.preparer),
2344 ).
2345 ExtendWithErrorHandler(errorHandler).
2346 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002347 })
2348 }
2349}
2350
Jooyung Han749dc692020-04-15 11:03:39 +09002351func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2352 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2353 apex {
2354 name: "myapex",
2355 key: "myapex.key",
2356 native_shared_libs: ["mylib"],
2357 min_sdk_version: "29",
2358 }
2359
2360 apex_key {
2361 name: "myapex.key",
2362 public_key: "testkey.avbpubkey",
2363 private_key: "testkey.pem",
2364 }
2365
2366 cc_library {
2367 name: "mylib",
2368 srcs: ["mylib.cpp"],
2369 shared_libs: ["mylib2"],
2370 system_shared_libs: [],
2371 stl: "none",
2372 apex_available: [
2373 "myapex",
2374 ],
2375 min_sdk_version: "29",
2376 }
2377
2378 // indirect part of the apex
2379 cc_library {
2380 name: "mylib2",
2381 srcs: ["mylib.cpp"],
2382 system_shared_libs: [],
2383 stl: "none",
2384 apex_available: [
2385 "myapex",
2386 ],
2387 min_sdk_version: "30",
2388 }
2389 `)
2390}
2391
2392func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2393 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2394 apex {
2395 name: "myapex",
2396 key: "myapex.key",
2397 apps: ["AppFoo"],
2398 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002399 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002400 }
2401
2402 apex_key {
2403 name: "myapex.key",
2404 public_key: "testkey.avbpubkey",
2405 private_key: "testkey.pem",
2406 }
2407
2408 android_app {
2409 name: "AppFoo",
2410 srcs: ["foo/bar/MyClass.java"],
2411 sdk_version: "current",
2412 min_sdk_version: "29",
2413 system_modules: "none",
2414 stl: "none",
2415 static_libs: ["bar"],
2416 apex_available: [ "myapex" ],
2417 }
2418
2419 java_library {
2420 name: "bar",
2421 sdk_version: "current",
2422 srcs: ["a.java"],
2423 apex_available: [ "myapex" ],
2424 }
2425 `)
2426}
2427
2428func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002429 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002430 apex {
2431 name: "myapex",
2432 key: "myapex.key",
2433 native_shared_libs: ["mylib"],
2434 min_sdk_version: "29",
2435 }
2436
2437 apex_key {
2438 name: "myapex.key",
2439 public_key: "testkey.avbpubkey",
2440 private_key: "testkey.pem",
2441 }
2442
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002443 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002444 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2445 cc_library {
2446 name: "mylib",
2447 srcs: ["mylib.cpp"],
2448 shared_libs: ["mylib2"],
2449 system_shared_libs: [],
2450 stl: "none",
2451 apex_available: ["myapex", "otherapex"],
2452 min_sdk_version: "29",
2453 }
2454
2455 cc_library {
2456 name: "mylib2",
2457 srcs: ["mylib.cpp"],
2458 system_shared_libs: [],
2459 stl: "none",
2460 apex_available: ["otherapex"],
2461 stubs: { versions: ["29", "30"] },
2462 min_sdk_version: "30",
2463 }
2464
2465 apex {
2466 name: "otherapex",
2467 key: "myapex.key",
2468 native_shared_libs: ["mylib", "mylib2"],
2469 min_sdk_version: "30",
2470 }
2471 `)
2472 expectLink := func(from, from_variant, to, to_variant string) {
2473 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2474 libFlags := ld.Args["libFlags"]
2475 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2476 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002477 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002478 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002479}
2480
Jooyung Haned124c32021-01-26 11:43:46 +09002481func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002482 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2483 func(variables android.FixtureProductVariables) {
2484 variables.Platform_sdk_codename = proptools.StringPtr("S")
2485 variables.Platform_version_active_codenames = []string{"S"}
2486 },
2487 )
Jooyung Haned124c32021-01-26 11:43:46 +09002488 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2489 apex {
2490 name: "myapex",
2491 key: "myapex.key",
2492 native_shared_libs: ["libfoo"],
2493 min_sdk_version: "S",
2494 }
2495 apex_key {
2496 name: "myapex.key",
2497 public_key: "testkey.avbpubkey",
2498 private_key: "testkey.pem",
2499 }
2500 cc_library {
2501 name: "libfoo",
2502 shared_libs: ["libbar"],
2503 apex_available: ["myapex"],
2504 min_sdk_version: "29",
2505 }
2506 cc_library {
2507 name: "libbar",
2508 apex_available: ["myapex"],
2509 }
2510 `, withSAsActiveCodeNames)
2511}
2512
2513func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002514 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2515 variables.Platform_sdk_codename = proptools.StringPtr("S")
2516 variables.Platform_version_active_codenames = []string{"S", "T"}
2517 })
Colin Cross1c460562021-02-16 17:55:47 -08002518 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002519 apex {
2520 name: "myapex",
2521 key: "myapex.key",
2522 native_shared_libs: ["libfoo"],
2523 min_sdk_version: "S",
2524 }
2525 apex_key {
2526 name: "myapex.key",
2527 public_key: "testkey.avbpubkey",
2528 private_key: "testkey.pem",
2529 }
2530 cc_library {
2531 name: "libfoo",
2532 shared_libs: ["libbar"],
2533 apex_available: ["myapex"],
2534 min_sdk_version: "S",
2535 }
2536 cc_library {
2537 name: "libbar",
2538 stubs: {
2539 symbol_file: "libbar.map.txt",
2540 versions: ["30", "S", "T"],
2541 },
2542 }
2543 `, withSAsActiveCodeNames)
2544
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002545 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002546 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2547 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002548 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002549}
2550
Jiyong Park7c2ee712018-12-07 00:42:25 +09002551func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002552 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002553 apex {
2554 name: "myapex",
2555 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002556 native_shared_libs: ["mylib"],
2557 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002558 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002559 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002560 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002561 }
2562
2563 apex_key {
2564 name: "myapex.key",
2565 public_key: "testkey.avbpubkey",
2566 private_key: "testkey.pem",
2567 }
2568
2569 prebuilt_etc {
2570 name: "myetc",
2571 src: "myprebuilt",
2572 sub_dir: "foo/bar",
2573 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002574
2575 cc_library {
2576 name: "mylib",
2577 srcs: ["mylib.cpp"],
2578 relative_install_path: "foo/bar",
2579 system_shared_libs: [],
2580 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002581 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002582 }
2583
2584 cc_binary {
2585 name: "mybin",
2586 srcs: ["mylib.cpp"],
2587 relative_install_path: "foo/bar",
2588 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002589 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002590 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002591 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002592 `)
2593
Sundong Ahnabb64432019-10-22 13:58:29 +09002594 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002595 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002596
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002597 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002598 ensureContains(t, cmd, "/etc ")
2599 ensureContains(t, cmd, "/etc/foo ")
2600 ensureContains(t, cmd, "/etc/foo/bar ")
2601 ensureContains(t, cmd, "/lib64 ")
2602 ensureContains(t, cmd, "/lib64/foo ")
2603 ensureContains(t, cmd, "/lib64/foo/bar ")
2604 ensureContains(t, cmd, "/lib ")
2605 ensureContains(t, cmd, "/lib/foo ")
2606 ensureContains(t, cmd, "/lib/foo/bar ")
2607 ensureContains(t, cmd, "/bin ")
2608 ensureContains(t, cmd, "/bin/foo ")
2609 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002610}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002611
Jooyung Han35155c42020-02-06 17:33:20 +09002612func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002613 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002614 apex {
2615 name: "myapex",
2616 key: "myapex.key",
2617 multilib: {
2618 both: {
2619 native_shared_libs: ["mylib"],
2620 binaries: ["mybin"],
2621 },
2622 },
2623 compile_multilib: "both",
2624 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002625 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002626 }
2627
2628 apex_key {
2629 name: "myapex.key",
2630 public_key: "testkey.avbpubkey",
2631 private_key: "testkey.pem",
2632 }
2633
2634 cc_library {
2635 name: "mylib",
2636 relative_install_path: "foo/bar",
2637 system_shared_libs: [],
2638 stl: "none",
2639 apex_available: [ "myapex" ],
2640 native_bridge_supported: true,
2641 }
2642
2643 cc_binary {
2644 name: "mybin",
2645 relative_install_path: "foo/bar",
2646 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002647 stl: "none",
2648 apex_available: [ "myapex" ],
2649 native_bridge_supported: true,
2650 compile_multilib: "both", // default is "first" for binary
2651 multilib: {
2652 lib64: {
2653 suffix: "64",
2654 },
2655 },
2656 }
2657 `, withNativeBridgeEnabled)
2658 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2659 "bin/foo/bar/mybin",
2660 "bin/foo/bar/mybin64",
2661 "bin/arm/foo/bar/mybin",
2662 "bin/arm64/foo/bar/mybin64",
2663 "lib/foo/bar/mylib.so",
2664 "lib/arm/foo/bar/mylib.so",
2665 "lib64/foo/bar/mylib.so",
2666 "lib64/arm64/foo/bar/mylib.so",
2667 })
2668}
2669
Jooyung Han85d61762020-06-24 23:50:26 +09002670func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002671 result := android.GroupFixturePreparers(
2672 prepareForApexTest,
2673 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2674 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002675 apex {
2676 name: "myapex",
2677 key: "myapex.key",
2678 binaries: ["mybin"],
2679 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002680 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002681 }
2682 apex_key {
2683 name: "myapex.key",
2684 public_key: "testkey.avbpubkey",
2685 private_key: "testkey.pem",
2686 }
2687 cc_binary {
2688 name: "mybin",
2689 vendor: true,
2690 shared_libs: ["libfoo"],
2691 }
2692 cc_library {
2693 name: "libfoo",
2694 proprietary: true,
2695 }
2696 `)
2697
Colin Crossc68db4b2021-11-11 18:59:15 -08002698 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002699 "bin/mybin",
2700 "lib64/libfoo.so",
2701 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2702 "lib64/libc++.so",
2703 })
2704
Colin Crossc68db4b2021-11-11 18:59:15 -08002705 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2706 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002707 name := apexBundle.BaseModuleName()
2708 prefix := "TARGET_"
2709 var builder strings.Builder
2710 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002711 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002712 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002713 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002714
Colin Crossc68db4b2021-11-11 18:59:15 -08002715 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002716 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2717 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002718}
2719
Jooyung Hanc5a96762022-02-04 11:54:50 +09002720func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2721 testApexError(t, `Trying to include a VNDK library`, `
2722 apex {
2723 name: "myapex",
2724 key: "myapex.key",
2725 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2726 vendor: true,
2727 use_vndk_as_stable: true,
2728 updatable: false,
2729 }
2730 apex_key {
2731 name: "myapex.key",
2732 public_key: "testkey.avbpubkey",
2733 private_key: "testkey.pem",
2734 }`)
2735}
2736
Jooyung Handf78e212020-07-22 15:54:47 +09002737func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002738 // myapex myapex2
2739 // | |
2740 // mybin ------. mybin2
2741 // \ \ / |
2742 // (stable) .---\--------` |
2743 // \ / \ |
2744 // \ / \ /
2745 // libvndk libvendor
2746 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002747 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002748 apex {
2749 name: "myapex",
2750 key: "myapex.key",
2751 binaries: ["mybin"],
2752 vendor: true,
2753 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002754 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002755 }
2756 apex_key {
2757 name: "myapex.key",
2758 public_key: "testkey.avbpubkey",
2759 private_key: "testkey.pem",
2760 }
2761 cc_binary {
2762 name: "mybin",
2763 vendor: true,
2764 shared_libs: ["libvndk", "libvendor"],
2765 }
2766 cc_library {
2767 name: "libvndk",
2768 vndk: {
2769 enabled: true,
2770 },
2771 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002772 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002773 }
2774 cc_library {
2775 name: "libvendor",
2776 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002777 stl: "none",
2778 }
2779 apex {
2780 name: "myapex2",
2781 key: "myapex.key",
2782 binaries: ["mybin2"],
2783 vendor: true,
2784 use_vndk_as_stable: false,
2785 updatable: false,
2786 }
2787 cc_binary {
2788 name: "mybin2",
2789 vendor: true,
2790 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002791 }
2792 `)
2793
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002794 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002795
Jooyung Han91f92032022-02-04 12:36:33 +09002796 for _, tc := range []struct {
2797 name string
2798 apexName string
2799 moduleName string
2800 moduleVariant string
2801 libs []string
2802 contents []string
2803 requireVndkNamespace bool
2804 }{
2805 {
2806 name: "use_vndk_as_stable",
2807 apexName: "myapex",
2808 moduleName: "mybin",
2809 moduleVariant: vendorVariant + "_apex10000",
2810 libs: []string{
2811 // should link with vendor variants of VNDK libs(libvndk/libc++)
2812 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2813 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2814 // unstable Vendor libs as APEX variant
2815 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2816 },
2817 contents: []string{
2818 "bin/mybin",
2819 "lib64/libvendor.so",
2820 // VNDK libs (libvndk/libc++) are not included
2821 },
2822 requireVndkNamespace: true,
2823 },
2824 {
2825 name: "!use_vndk_as_stable",
2826 apexName: "myapex2",
2827 moduleName: "mybin2",
2828 moduleVariant: vendorVariant + "_myapex2",
2829 libs: []string{
2830 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2831 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2832 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2833 // unstable vendor libs have "merged" APEX variants
2834 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2835 },
2836 contents: []string{
2837 "bin/mybin2",
2838 "lib64/libvendor.so",
2839 // VNDK libs are included as well
2840 "lib64/libvndk.so",
2841 "lib64/libc++.so",
2842 },
2843 requireVndkNamespace: false,
2844 },
2845 } {
2846 t.Run(tc.name, func(t *testing.T) {
2847 // Check linked libs
2848 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2849 libs := names(ldRule.Args["libFlags"])
2850 for _, lib := range tc.libs {
2851 ensureListContains(t, libs, lib)
2852 }
2853 // Check apex contents
2854 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002855
Jooyung Han91f92032022-02-04 12:36:33 +09002856 // Check "requireNativeLibs"
2857 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2858 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2859 if tc.requireVndkNamespace {
2860 ensureListContains(t, requireNativeLibs, ":vndk")
2861 } else {
2862 ensureListNotContains(t, requireNativeLibs, ":vndk")
2863 }
2864 })
2865 }
Jooyung Handf78e212020-07-22 15:54:47 +09002866}
2867
Justin Yun13decfb2021-03-08 19:25:55 +09002868func TestProductVariant(t *testing.T) {
2869 ctx := testApex(t, `
2870 apex {
2871 name: "myapex",
2872 key: "myapex.key",
2873 updatable: false,
2874 product_specific: true,
2875 binaries: ["foo"],
2876 }
2877
2878 apex_key {
2879 name: "myapex.key",
2880 public_key: "testkey.avbpubkey",
2881 private_key: "testkey.pem",
2882 }
2883
2884 cc_binary {
2885 name: "foo",
2886 product_available: true,
2887 apex_available: ["myapex"],
2888 srcs: ["foo.cpp"],
2889 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002890 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2891 variables.ProductVndkVersion = proptools.StringPtr("current")
2892 }),
2893 )
Justin Yun13decfb2021-03-08 19:25:55 +09002894
2895 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002896 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002897 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2898 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2899 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2900 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2901}
2902
Jooyung Han8e5685d2020-09-21 11:02:57 +09002903func TestApex_withPrebuiltFirmware(t *testing.T) {
2904 testCases := []struct {
2905 name string
2906 additionalProp string
2907 }{
2908 {"system apex with prebuilt_firmware", ""},
2909 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2910 }
2911 for _, tc := range testCases {
2912 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002913 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002914 apex {
2915 name: "myapex",
2916 key: "myapex.key",
2917 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002918 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002919 `+tc.additionalProp+`
2920 }
2921 apex_key {
2922 name: "myapex.key",
2923 public_key: "testkey.avbpubkey",
2924 private_key: "testkey.pem",
2925 }
2926 prebuilt_firmware {
2927 name: "myfirmware",
2928 src: "myfirmware.bin",
2929 filename_from_src: true,
2930 `+tc.additionalProp+`
2931 }
2932 `)
2933 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2934 "etc/firmware/myfirmware.bin",
2935 })
2936 })
2937 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002938}
2939
Jooyung Hanefb184e2020-06-25 17:14:25 +09002940func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002941 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002942 apex {
2943 name: "myapex",
2944 key: "myapex.key",
2945 vendor: true,
2946 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002947 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002948 }
2949
2950 apex_key {
2951 name: "myapex.key",
2952 public_key: "testkey.avbpubkey",
2953 private_key: "testkey.pem",
2954 }
2955
2956 cc_library {
2957 name: "mylib",
2958 vendor_available: true,
2959 }
2960 `)
2961
2962 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002963 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002964 name := apexBundle.BaseModuleName()
2965 prefix := "TARGET_"
2966 var builder strings.Builder
2967 data.Custom(&builder, name, prefix, "", data)
2968 androidMk := builder.String()
2969 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2970}
2971
Jooyung Han2ed99d02020-06-24 23:26:26 +09002972func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002973 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002974 apex {
2975 name: "myapex",
2976 key: "myapex.key",
2977 vintf_fragments: ["fragment.xml"],
2978 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002979 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002980 }
2981 apex_key {
2982 name: "myapex.key",
2983 public_key: "testkey.avbpubkey",
2984 private_key: "testkey.pem",
2985 }
2986 cc_binary {
2987 name: "mybin",
2988 }
2989 `)
2990
2991 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002992 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002993 name := apexBundle.BaseModuleName()
2994 prefix := "TARGET_"
2995 var builder strings.Builder
2996 data.Custom(&builder, name, prefix, "", data)
2997 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002998 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002999 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003000}
3001
Jiyong Park16e91a02018-12-20 18:18:08 +09003002func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003003 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003004 apex {
3005 name: "myapex",
3006 key: "myapex.key",
3007 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003008 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003009 }
3010
3011 apex_key {
3012 name: "myapex.key",
3013 public_key: "testkey.avbpubkey",
3014 private_key: "testkey.pem",
3015 }
3016
3017 cc_library {
3018 name: "mylib",
3019 srcs: ["mylib.cpp"],
3020 system_shared_libs: [],
3021 stl: "none",
3022 stubs: {
3023 versions: ["1", "2", "3"],
3024 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003025 apex_available: [
3026 "//apex_available:platform",
3027 "myapex",
3028 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003029 }
3030
3031 cc_binary {
3032 name: "not_in_apex",
3033 srcs: ["mylib.cpp"],
3034 static_libs: ["mylib"],
3035 static_executable: true,
3036 system_shared_libs: [],
3037 stl: "none",
3038 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003039 `)
3040
Colin Cross7113d202019-11-20 16:39:12 -08003041 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003042
3043 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003044 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003045}
Jiyong Park9335a262018-12-24 11:31:58 +09003046
3047func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003048 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003049 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003050 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003051 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003052 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003053 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003054 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003055 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003056 }
3057
3058 cc_library {
3059 name: "mylib",
3060 srcs: ["mylib.cpp"],
3061 system_shared_libs: [],
3062 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003063 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003064 }
3065
3066 apex_key {
3067 name: "myapex.key",
3068 public_key: "testkey.avbpubkey",
3069 private_key: "testkey.pem",
3070 }
3071
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003072 android_app_certificate {
3073 name: "myapex.certificate",
3074 certificate: "testkey",
3075 }
3076
3077 android_app_certificate {
3078 name: "myapex.certificate.override",
3079 certificate: "testkey.override",
3080 }
3081
Jiyong Park9335a262018-12-24 11:31:58 +09003082 `)
3083
3084 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003085 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003086
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003087 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3088 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003089 "vendor/foo/devkeys/testkey.avbpubkey")
3090 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003091 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3092 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003093 "vendor/foo/devkeys/testkey.pem")
3094 }
3095
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003096 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003097 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003098 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003099 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003100 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003101 }
3102}
Jiyong Park58e364a2019-01-19 19:24:06 +09003103
Jooyung Hanf121a652019-12-17 14:30:11 +09003104func TestCertificate(t *testing.T) {
3105 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003106 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003107 apex {
3108 name: "myapex",
3109 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003110 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003111 }
3112 apex_key {
3113 name: "myapex.key",
3114 public_key: "testkey.avbpubkey",
3115 private_key: "testkey.pem",
3116 }`)
3117 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3118 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3119 if actual := rule.Args["certificates"]; actual != expected {
3120 t.Errorf("certificates should be %q, not %q", expected, actual)
3121 }
3122 })
3123 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003124 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003125 apex {
3126 name: "myapex_keytest",
3127 key: "myapex.key",
3128 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003129 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003130 }
3131 apex_key {
3132 name: "myapex.key",
3133 public_key: "testkey.avbpubkey",
3134 private_key: "testkey.pem",
3135 }
3136 android_app_certificate {
3137 name: "myapex.certificate.override",
3138 certificate: "testkey.override",
3139 }`)
3140 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3141 expected := "testkey.override.x509.pem testkey.override.pk8"
3142 if actual := rule.Args["certificates"]; actual != expected {
3143 t.Errorf("certificates should be %q, not %q", expected, actual)
3144 }
3145 })
3146 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003147 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003148 apex {
3149 name: "myapex",
3150 key: "myapex.key",
3151 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003152 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003153 }
3154 apex_key {
3155 name: "myapex.key",
3156 public_key: "testkey.avbpubkey",
3157 private_key: "testkey.pem",
3158 }
3159 android_app_certificate {
3160 name: "myapex.certificate",
3161 certificate: "testkey",
3162 }`)
3163 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3164 expected := "testkey.x509.pem testkey.pk8"
3165 if actual := rule.Args["certificates"]; actual != expected {
3166 t.Errorf("certificates should be %q, not %q", expected, actual)
3167 }
3168 })
3169 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003170 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003171 apex {
3172 name: "myapex_keytest",
3173 key: "myapex.key",
3174 file_contexts: ":myapex-file_contexts",
3175 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003176 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003177 }
3178 apex_key {
3179 name: "myapex.key",
3180 public_key: "testkey.avbpubkey",
3181 private_key: "testkey.pem",
3182 }
3183 android_app_certificate {
3184 name: "myapex.certificate.override",
3185 certificate: "testkey.override",
3186 }`)
3187 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3188 expected := "testkey.override.x509.pem testkey.override.pk8"
3189 if actual := rule.Args["certificates"]; actual != expected {
3190 t.Errorf("certificates should be %q, not %q", expected, actual)
3191 }
3192 })
3193 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003194 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003195 apex {
3196 name: "myapex",
3197 key: "myapex.key",
3198 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003199 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003200 }
3201 apex_key {
3202 name: "myapex.key",
3203 public_key: "testkey.avbpubkey",
3204 private_key: "testkey.pem",
3205 }`)
3206 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3207 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3208 if actual := rule.Args["certificates"]; actual != expected {
3209 t.Errorf("certificates should be %q, not %q", expected, actual)
3210 }
3211 })
3212 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003213 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003214 apex {
3215 name: "myapex_keytest",
3216 key: "myapex.key",
3217 file_contexts: ":myapex-file_contexts",
3218 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003219 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003220 }
3221 apex_key {
3222 name: "myapex.key",
3223 public_key: "testkey.avbpubkey",
3224 private_key: "testkey.pem",
3225 }
3226 android_app_certificate {
3227 name: "myapex.certificate.override",
3228 certificate: "testkey.override",
3229 }`)
3230 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3231 expected := "testkey.override.x509.pem testkey.override.pk8"
3232 if actual := rule.Args["certificates"]; actual != expected {
3233 t.Errorf("certificates should be %q, not %q", expected, actual)
3234 }
3235 })
3236}
3237
Jiyong Park58e364a2019-01-19 19:24:06 +09003238func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003239 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003240 apex {
3241 name: "myapex",
3242 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003243 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003244 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003245 }
3246
3247 apex {
3248 name: "otherapex",
3249 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003250 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003251 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003252 }
3253
3254 apex_key {
3255 name: "myapex.key",
3256 public_key: "testkey.avbpubkey",
3257 private_key: "testkey.pem",
3258 }
3259
3260 cc_library {
3261 name: "mylib",
3262 srcs: ["mylib.cpp"],
3263 system_shared_libs: [],
3264 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003265 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003266 "myapex",
3267 "otherapex",
3268 ],
Jooyung Han24282772020-03-21 23:20:55 +09003269 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003270 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003271 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003272 cc_library {
3273 name: "mylib2",
3274 srcs: ["mylib.cpp"],
3275 system_shared_libs: [],
3276 stl: "none",
3277 apex_available: [
3278 "myapex",
3279 "otherapex",
3280 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003281 static_libs: ["mylib3"],
3282 recovery_available: true,
3283 min_sdk_version: "29",
3284 }
3285 cc_library {
3286 name: "mylib3",
3287 srcs: ["mylib.cpp"],
3288 system_shared_libs: [],
3289 stl: "none",
3290 apex_available: [
3291 "myapex",
3292 "otherapex",
3293 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003294 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003295 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003296 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003297 `)
3298
Jooyung Hanc87a0592020-03-02 17:44:33 +09003299 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003300 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003301 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003302 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003303
Jooyung Hanccce2f22020-03-07 03:45:53 +09003304 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003305 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003306 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003307 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003308
Jooyung Hanccce2f22020-03-07 03:45:53 +09003309 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003310 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003311 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003312 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003313
Colin Crossaede88c2020-08-11 12:17:01 -07003314 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3315 // each variant defines additional macros to distinguish which apex variant it is built for
3316
3317 // non-APEX variant does not have __ANDROID_APEX__ defined
3318 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3319 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3320
Dan Albertb19953d2020-11-17 15:29:36 -08003321 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003322 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3323 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003324 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003325
Jooyung Hanc87a0592020-03-02 17:44:33 +09003326 // non-APEX variant does not have __ANDROID_APEX__ defined
3327 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3328 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3329
Dan Albertb19953d2020-11-17 15:29:36 -08003330 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003331 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003332 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003333 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003334}
Jiyong Park7e636d02019-01-28 16:16:54 +09003335
3336func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003337 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003338 apex {
3339 name: "myapex",
3340 key: "myapex.key",
3341 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003342 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003343 }
3344
3345 apex_key {
3346 name: "myapex.key",
3347 public_key: "testkey.avbpubkey",
3348 private_key: "testkey.pem",
3349 }
3350
3351 cc_library_headers {
3352 name: "mylib_headers",
3353 export_include_dirs: ["my_include"],
3354 system_shared_libs: [],
3355 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003356 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003357 }
3358
3359 cc_library {
3360 name: "mylib",
3361 srcs: ["mylib.cpp"],
3362 system_shared_libs: [],
3363 stl: "none",
3364 header_libs: ["mylib_headers"],
3365 export_header_lib_headers: ["mylib_headers"],
3366 stubs: {
3367 versions: ["1", "2", "3"],
3368 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003369 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003370 }
3371
3372 cc_library {
3373 name: "otherlib",
3374 srcs: ["mylib.cpp"],
3375 system_shared_libs: [],
3376 stl: "none",
3377 shared_libs: ["mylib"],
3378 }
3379 `)
3380
Colin Cross7113d202019-11-20 16:39:12 -08003381 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003382
3383 // Ensure that the include path of the header lib is exported to 'otherlib'
3384 ensureContains(t, cFlags, "-Imy_include")
3385}
Alex Light9670d332019-01-29 18:07:33 -08003386
Jiyong Park7cd10e32020-01-14 09:22:18 +09003387type fileInApex struct {
3388 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003389 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003390 isLink bool
3391}
3392
Jooyung Hana57af4a2020-01-23 05:36:59 +00003393func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003394 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003395 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003396 copyCmds := apexRule.Args["copy_commands"]
3397 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003398 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003399 for _, cmd := range strings.Split(copyCmds, "&&") {
3400 cmd = strings.TrimSpace(cmd)
3401 if cmd == "" {
3402 continue
3403 }
3404 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003405 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003406 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003407 switch terms[0] {
3408 case "mkdir":
3409 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003410 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003411 t.Fatal("copyCmds contains invalid cp command", cmd)
3412 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003413 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003414 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003415 isLink = false
3416 case "ln":
3417 if len(terms) != 3 && len(terms) != 4 {
3418 // ln LINK TARGET or ln -s LINK TARGET
3419 t.Fatal("copyCmds contains invalid ln command", cmd)
3420 }
3421 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003422 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003423 isLink = true
3424 default:
3425 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3426 }
3427 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003428 index := strings.Index(dst, imageApexDir)
3429 if index == -1 {
3430 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3431 }
3432 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003433 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003434 }
3435 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003436 return ret
3437}
3438
Jooyung Hana57af4a2020-01-23 05:36:59 +00003439func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3440 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003441 var failed bool
3442 var surplus []string
3443 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003444 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003445 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003446 for _, expected := range files {
3447 if matched, _ := path.Match(expected, file.path); matched {
3448 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003449 mactchFound = true
3450 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003451 }
3452 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003453 if !mactchFound {
3454 surplus = append(surplus, file.path)
3455 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003456 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003457
Jooyung Han31c470b2019-10-18 16:26:59 +09003458 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003459 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003460 t.Log("surplus files", surplus)
3461 failed = true
3462 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003463
3464 if len(files) > len(filesMatched) {
3465 var missing []string
3466 for _, expected := range files {
3467 if !filesMatched[expected] {
3468 missing = append(missing, expected)
3469 }
3470 }
3471 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003472 t.Log("missing files", missing)
3473 failed = true
3474 }
3475 if failed {
3476 t.Fail()
3477 }
3478}
3479
Jooyung Han344d5432019-08-23 11:17:39 +09003480func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003481 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003482 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003483 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003484 "etc/llndk.libraries.29.txt",
3485 "etc/vndkcore.libraries.29.txt",
3486 "etc/vndksp.libraries.29.txt",
3487 "etc/vndkprivate.libraries.29.txt",
3488 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003489 }
3490 testCases := []struct {
3491 vndkVersion string
3492 expectedFiles []string
3493 }{
3494 {
3495 vndkVersion: "current",
3496 expectedFiles: append(commonFiles,
3497 "lib/libvndk.so",
3498 "lib/libvndksp.so",
3499 "lib64/libvndk.so",
3500 "lib64/libvndksp.so"),
3501 },
3502 {
3503 vndkVersion: "",
3504 expectedFiles: append(commonFiles,
3505 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3506 "lib/libvndksp.so",
3507 "lib64/libvndksp.so"),
3508 },
3509 }
3510 for _, tc := range testCases {
3511 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3512 ctx := testApex(t, `
3513 apex_vndk {
3514 name: "com.android.vndk.current",
3515 key: "com.android.vndk.current.key",
3516 updatable: false,
3517 }
3518
3519 apex_key {
3520 name: "com.android.vndk.current.key",
3521 public_key: "testkey.avbpubkey",
3522 private_key: "testkey.pem",
3523 }
3524
3525 cc_library {
3526 name: "libvndk",
3527 srcs: ["mylib.cpp"],
3528 vendor_available: true,
3529 product_available: true,
3530 vndk: {
3531 enabled: true,
3532 },
3533 system_shared_libs: [],
3534 stl: "none",
3535 apex_available: [ "com.android.vndk.current" ],
3536 }
3537
3538 cc_library {
3539 name: "libvndksp",
3540 srcs: ["mylib.cpp"],
3541 vendor_available: true,
3542 product_available: true,
3543 vndk: {
3544 enabled: true,
3545 support_system_process: true,
3546 },
3547 system_shared_libs: [],
3548 stl: "none",
3549 apex_available: [ "com.android.vndk.current" ],
3550 }
3551
3552 // VNDK-Ext should not cause any problems
3553
3554 cc_library {
3555 name: "libvndk.ext",
3556 srcs: ["mylib2.cpp"],
3557 vendor: true,
3558 vndk: {
3559 enabled: true,
3560 extends: "libvndk",
3561 },
3562 system_shared_libs: [],
3563 stl: "none",
3564 }
3565
3566 cc_library {
3567 name: "libvndksp.ext",
3568 srcs: ["mylib2.cpp"],
3569 vendor: true,
3570 vndk: {
3571 enabled: true,
3572 support_system_process: true,
3573 extends: "libvndksp",
3574 },
3575 system_shared_libs: [],
3576 stl: "none",
3577 }
3578 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3579 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3580 }))
3581 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3582 })
3583 }
Jooyung Han344d5432019-08-23 11:17:39 +09003584}
3585
3586func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003587 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003588 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003589 name: "com.android.vndk.current",
3590 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003591 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003592 }
3593
3594 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003595 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003596 public_key: "testkey.avbpubkey",
3597 private_key: "testkey.pem",
3598 }
3599
3600 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003601 name: "libvndk",
3602 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003603 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003604 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003605 vndk: {
3606 enabled: true,
3607 },
3608 system_shared_libs: [],
3609 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003610 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003611 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003612
3613 cc_prebuilt_library_shared {
3614 name: "libvndk.arm",
3615 srcs: ["libvndk.arm.so"],
3616 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003617 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003618 vndk: {
3619 enabled: true,
3620 },
3621 enabled: false,
3622 arch: {
3623 arm: {
3624 enabled: true,
3625 },
3626 },
3627 system_shared_libs: [],
3628 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003629 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003630 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003631 `+vndkLibrariesTxtFiles("current"),
3632 withFiles(map[string][]byte{
3633 "libvndk.so": nil,
3634 "libvndk.arm.so": nil,
3635 }))
Colin Cross2807f002021-03-02 10:15:29 -08003636 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003637 "lib/libvndk.so",
3638 "lib/libvndk.arm.so",
3639 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003640 "lib/libc++.so",
3641 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003642 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003643 })
Jooyung Han344d5432019-08-23 11:17:39 +09003644}
3645
Jooyung Han39edb6c2019-11-06 16:53:07 +09003646func vndkLibrariesTxtFiles(vers ...string) (result string) {
3647 for _, v := range vers {
3648 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003649 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003650 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003651 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003652 name: "` + txt + `.libraries.txt",
3653 }
3654 `
3655 }
3656 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003657 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003658 result += `
3659 prebuilt_etc {
3660 name: "` + txt + `.libraries.` + v + `.txt",
3661 src: "dummy.txt",
3662 }
3663 `
3664 }
3665 }
3666 }
3667 return
3668}
3669
Jooyung Han344d5432019-08-23 11:17:39 +09003670func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003671 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003672 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003673 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003674 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003675 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003676 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003677 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003678 }
3679
3680 apex_key {
3681 name: "myapex.key",
3682 public_key: "testkey.avbpubkey",
3683 private_key: "testkey.pem",
3684 }
3685
Jooyung Han31c470b2019-10-18 16:26:59 +09003686 vndk_prebuilt_shared {
3687 name: "libvndk27",
3688 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003689 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003690 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003691 vndk: {
3692 enabled: true,
3693 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003694 target_arch: "arm64",
3695 arch: {
3696 arm: {
3697 srcs: ["libvndk27_arm.so"],
3698 },
3699 arm64: {
3700 srcs: ["libvndk27_arm64.so"],
3701 },
3702 },
Colin Cross2807f002021-03-02 10:15:29 -08003703 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003704 }
3705
3706 vndk_prebuilt_shared {
3707 name: "libvndk27",
3708 version: "27",
3709 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003710 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003711 vndk: {
3712 enabled: true,
3713 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003714 target_arch: "x86_64",
3715 arch: {
3716 x86: {
3717 srcs: ["libvndk27_x86.so"],
3718 },
3719 x86_64: {
3720 srcs: ["libvndk27_x86_64.so"],
3721 },
3722 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003723 }
3724 `+vndkLibrariesTxtFiles("27"),
3725 withFiles(map[string][]byte{
3726 "libvndk27_arm.so": nil,
3727 "libvndk27_arm64.so": nil,
3728 "libvndk27_x86.so": nil,
3729 "libvndk27_x86_64.so": nil,
3730 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003731
Colin Cross2807f002021-03-02 10:15:29 -08003732 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003733 "lib/libvndk27_arm.so",
3734 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003735 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003736 })
Jooyung Han344d5432019-08-23 11:17:39 +09003737}
3738
Jooyung Han90eee022019-10-01 20:02:42 +09003739func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003740 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003741 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003742 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003743 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003744 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003745 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003746 }
3747 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003748 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003749 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003750 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003751 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003752 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003753 }
3754 apex_key {
3755 name: "myapex.key",
3756 public_key: "testkey.avbpubkey",
3757 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003758 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003759
3760 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003761 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003762 actual := proptools.String(bundle.properties.Apex_name)
3763 if !reflect.DeepEqual(actual, expected) {
3764 t.Errorf("Got '%v', expected '%v'", actual, expected)
3765 }
3766 }
3767
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003768 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003769 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003770}
3771
Jooyung Han344d5432019-08-23 11:17:39 +09003772func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003773 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003774 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003775 name: "com.android.vndk.current",
3776 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003777 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003778 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003779 }
3780
3781 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003782 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003783 public_key: "testkey.avbpubkey",
3784 private_key: "testkey.pem",
3785 }
3786
3787 cc_library {
3788 name: "libvndk",
3789 srcs: ["mylib.cpp"],
3790 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003791 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003792 native_bridge_supported: true,
3793 host_supported: true,
3794 vndk: {
3795 enabled: true,
3796 },
3797 system_shared_libs: [],
3798 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003799 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003800 }
Colin Cross2807f002021-03-02 10:15:29 -08003801 `+vndkLibrariesTxtFiles("current"),
3802 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003803
Colin Cross2807f002021-03-02 10:15:29 -08003804 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003805 "lib/libvndk.so",
3806 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003807 "lib/libc++.so",
3808 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003809 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003810 })
Jooyung Han344d5432019-08-23 11:17:39 +09003811}
3812
3813func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003814 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003815 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003816 name: "com.android.vndk.current",
3817 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003818 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003819 native_bridge_supported: true,
3820 }
3821
3822 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003823 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003824 public_key: "testkey.avbpubkey",
3825 private_key: "testkey.pem",
3826 }
3827
3828 cc_library {
3829 name: "libvndk",
3830 srcs: ["mylib.cpp"],
3831 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003832 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003833 native_bridge_supported: true,
3834 host_supported: true,
3835 vndk: {
3836 enabled: true,
3837 },
3838 system_shared_libs: [],
3839 stl: "none",
3840 }
3841 `)
3842}
3843
Jooyung Han31c470b2019-10-18 16:26:59 +09003844func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003845 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003846 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003847 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003848 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003849 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003850 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003851 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003852 }
3853
3854 apex_key {
3855 name: "myapex.key",
3856 public_key: "testkey.avbpubkey",
3857 private_key: "testkey.pem",
3858 }
3859
3860 vndk_prebuilt_shared {
3861 name: "libvndk27",
3862 version: "27",
3863 target_arch: "arm",
3864 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003865 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003866 vndk: {
3867 enabled: true,
3868 },
3869 arch: {
3870 arm: {
3871 srcs: ["libvndk27.so"],
3872 }
3873 },
3874 }
3875
3876 vndk_prebuilt_shared {
3877 name: "libvndk27",
3878 version: "27",
3879 target_arch: "arm",
3880 binder32bit: true,
3881 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003882 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003883 vndk: {
3884 enabled: true,
3885 },
3886 arch: {
3887 arm: {
3888 srcs: ["libvndk27binder32.so"],
3889 }
3890 },
Colin Cross2807f002021-03-02 10:15:29 -08003891 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003892 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003893 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003894 withFiles(map[string][]byte{
3895 "libvndk27.so": nil,
3896 "libvndk27binder32.so": nil,
3897 }),
3898 withBinder32bit,
3899 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003900 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003901 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3902 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003903 },
3904 }),
3905 )
3906
Colin Cross2807f002021-03-02 10:15:29 -08003907 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003908 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003909 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003910 })
3911}
3912
Jooyung Han45a96772020-06-15 14:59:42 +09003913func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003914 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003915 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003916 name: "com.android.vndk.current",
3917 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003918 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003919 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003920 }
3921
3922 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003923 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003924 public_key: "testkey.avbpubkey",
3925 private_key: "testkey.pem",
3926 }
3927
3928 cc_library {
3929 name: "libz",
3930 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003931 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003932 vndk: {
3933 enabled: true,
3934 },
3935 stubs: {
3936 symbol_file: "libz.map.txt",
3937 versions: ["30"],
3938 }
3939 }
3940 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3941 "libz.map.txt": nil,
3942 }))
3943
Colin Cross2807f002021-03-02 10:15:29 -08003944 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003945 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3946 ensureListEmpty(t, provideNativeLibs)
3947}
3948
Jooyung Hane1633032019-08-01 17:41:43 +09003949func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003950 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003951 apex {
3952 name: "myapex_nodep",
3953 key: "myapex.key",
3954 native_shared_libs: ["lib_nodep"],
3955 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003956 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003957 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003958 }
3959
3960 apex {
3961 name: "myapex_dep",
3962 key: "myapex.key",
3963 native_shared_libs: ["lib_dep"],
3964 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003965 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003966 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003967 }
3968
3969 apex {
3970 name: "myapex_provider",
3971 key: "myapex.key",
3972 native_shared_libs: ["libfoo"],
3973 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003974 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003975 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003976 }
3977
3978 apex {
3979 name: "myapex_selfcontained",
3980 key: "myapex.key",
3981 native_shared_libs: ["lib_dep", "libfoo"],
3982 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003983 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003984 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003985 }
3986
3987 apex_key {
3988 name: "myapex.key",
3989 public_key: "testkey.avbpubkey",
3990 private_key: "testkey.pem",
3991 }
3992
3993 cc_library {
3994 name: "lib_nodep",
3995 srcs: ["mylib.cpp"],
3996 system_shared_libs: [],
3997 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003998 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003999 }
4000
4001 cc_library {
4002 name: "lib_dep",
4003 srcs: ["mylib.cpp"],
4004 shared_libs: ["libfoo"],
4005 system_shared_libs: [],
4006 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004007 apex_available: [
4008 "myapex_dep",
4009 "myapex_provider",
4010 "myapex_selfcontained",
4011 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004012 }
4013
4014 cc_library {
4015 name: "libfoo",
4016 srcs: ["mytest.cpp"],
4017 stubs: {
4018 versions: ["1"],
4019 },
4020 system_shared_libs: [],
4021 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004022 apex_available: [
4023 "myapex_provider",
4024 "myapex_selfcontained",
4025 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004026 }
4027 `)
4028
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004029 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004030 var provideNativeLibs, requireNativeLibs []string
4031
Sundong Ahnabb64432019-10-22 13:58:29 +09004032 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004033 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4034 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004035 ensureListEmpty(t, provideNativeLibs)
4036 ensureListEmpty(t, requireNativeLibs)
4037
Sundong Ahnabb64432019-10-22 13:58:29 +09004038 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004039 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4040 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004041 ensureListEmpty(t, provideNativeLibs)
4042 ensureListContains(t, requireNativeLibs, "libfoo.so")
4043
Sundong Ahnabb64432019-10-22 13:58:29 +09004044 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004045 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4046 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004047 ensureListContains(t, provideNativeLibs, "libfoo.so")
4048 ensureListEmpty(t, requireNativeLibs)
4049
Sundong Ahnabb64432019-10-22 13:58:29 +09004050 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004051 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4052 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004053 ensureListContains(t, provideNativeLibs, "libfoo.so")
4054 ensureListEmpty(t, requireNativeLibs)
4055}
4056
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004057func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004058 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004059 apex {
4060 name: "myapex",
4061 key: "myapex.key",
4062 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004063 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004064 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004065 }
4066
4067 apex_key {
4068 name: "myapex.key",
4069 public_key: "testkey.avbpubkey",
4070 private_key: "testkey.pem",
4071 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004072
4073 cc_library {
4074 name: "mylib",
4075 srcs: ["mylib.cpp"],
4076 system_shared_libs: [],
4077 stl: "none",
4078 apex_available: [
4079 "//apex_available:platform",
4080 "myapex",
4081 ],
4082 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004083 `)
4084
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004085 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004086 apexManifestRule := module.Rule("apexManifestRule")
4087 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4088 apexRule := module.Rule("apexRule")
4089 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004090
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004091 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004092 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004093 name := apexBundle.BaseModuleName()
4094 prefix := "TARGET_"
4095 var builder strings.Builder
4096 data.Custom(&builder, name, prefix, "", data)
4097 androidMk := builder.String()
4098 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4099 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004100}
4101
Alex Light0851b882019-02-07 13:20:53 -08004102func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004103 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004104 apex {
4105 name: "myapex",
4106 key: "myapex.key",
4107 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004108 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004109 }
4110
4111 apex_key {
4112 name: "myapex.key",
4113 public_key: "testkey.avbpubkey",
4114 private_key: "testkey.pem",
4115 }
4116
4117 cc_library {
4118 name: "mylib_common",
4119 srcs: ["mylib.cpp"],
4120 system_shared_libs: [],
4121 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004122 apex_available: [
4123 "//apex_available:platform",
4124 "myapex",
4125 ],
Alex Light0851b882019-02-07 13:20:53 -08004126 }
4127 `)
4128
Sundong Ahnabb64432019-10-22 13:58:29 +09004129 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004130 apexRule := module.Rule("apexRule")
4131 copyCmds := apexRule.Args["copy_commands"]
4132
4133 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4134 t.Log("Apex was a test apex!")
4135 t.Fail()
4136 }
4137 // Ensure that main rule creates an output
4138 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4139
4140 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004141 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004142
4143 // Ensure that both direct and indirect deps are copied into apex
4144 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4145
Colin Cross7113d202019-11-20 16:39:12 -08004146 // Ensure that the platform variant ends with _shared
4147 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004148
Colin Cross56a83212020-09-15 18:30:11 -07004149 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004150 t.Log("Found mylib_common not in any apex!")
4151 t.Fail()
4152 }
4153}
4154
4155func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004156 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004157 apex_test {
4158 name: "myapex",
4159 key: "myapex.key",
4160 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004161 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004162 }
4163
4164 apex_key {
4165 name: "myapex.key",
4166 public_key: "testkey.avbpubkey",
4167 private_key: "testkey.pem",
4168 }
4169
4170 cc_library {
4171 name: "mylib_common_test",
4172 srcs: ["mylib.cpp"],
4173 system_shared_libs: [],
4174 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004175 // TODO: remove //apex_available:platform
4176 apex_available: [
4177 "//apex_available:platform",
4178 "myapex",
4179 ],
Alex Light0851b882019-02-07 13:20:53 -08004180 }
4181 `)
4182
Sundong Ahnabb64432019-10-22 13:58:29 +09004183 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004184 apexRule := module.Rule("apexRule")
4185 copyCmds := apexRule.Args["copy_commands"]
4186
4187 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4188 t.Log("Apex was not a test apex!")
4189 t.Fail()
4190 }
4191 // Ensure that main rule creates an output
4192 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4193
4194 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004195 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004196
4197 // Ensure that both direct and indirect deps are copied into apex
4198 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4199
Colin Cross7113d202019-11-20 16:39:12 -08004200 // Ensure that the platform variant ends with _shared
4201 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004202}
4203
Alex Light9670d332019-01-29 18:07:33 -08004204func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004205 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004206 apex {
4207 name: "myapex",
4208 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004209 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004210 multilib: {
4211 first: {
4212 native_shared_libs: ["mylib_common"],
4213 }
4214 },
4215 target: {
4216 android: {
4217 multilib: {
4218 first: {
4219 native_shared_libs: ["mylib"],
4220 }
4221 }
4222 },
4223 host: {
4224 multilib: {
4225 first: {
4226 native_shared_libs: ["mylib2"],
4227 }
4228 }
4229 }
4230 }
4231 }
4232
4233 apex_key {
4234 name: "myapex.key",
4235 public_key: "testkey.avbpubkey",
4236 private_key: "testkey.pem",
4237 }
4238
4239 cc_library {
4240 name: "mylib",
4241 srcs: ["mylib.cpp"],
4242 system_shared_libs: [],
4243 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004244 // TODO: remove //apex_available:platform
4245 apex_available: [
4246 "//apex_available:platform",
4247 "myapex",
4248 ],
Alex Light9670d332019-01-29 18:07:33 -08004249 }
4250
4251 cc_library {
4252 name: "mylib_common",
4253 srcs: ["mylib.cpp"],
4254 system_shared_libs: [],
4255 stl: "none",
4256 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004257 // TODO: remove //apex_available:platform
4258 apex_available: [
4259 "//apex_available:platform",
4260 "myapex",
4261 ],
Alex Light9670d332019-01-29 18:07:33 -08004262 }
4263
4264 cc_library {
4265 name: "mylib2",
4266 srcs: ["mylib.cpp"],
4267 system_shared_libs: [],
4268 stl: "none",
4269 compile_multilib: "first",
4270 }
4271 `)
4272
Sundong Ahnabb64432019-10-22 13:58:29 +09004273 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004274 copyCmds := apexRule.Args["copy_commands"]
4275
4276 // Ensure that main rule creates an output
4277 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4278
4279 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004280 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4281 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4282 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004283
4284 // Ensure that both direct and indirect deps are copied into apex
4285 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4286 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4287 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4288
Colin Cross7113d202019-11-20 16:39:12 -08004289 // Ensure that the platform variant ends with _shared
4290 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4291 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4292 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004293}
Jiyong Park04480cf2019-02-06 00:16:29 +09004294
Jiyong Park59140302020-12-14 18:44:04 +09004295func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004296 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004297 apex {
4298 name: "myapex",
4299 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004300 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004301 arch: {
4302 arm64: {
4303 native_shared_libs: ["mylib.arm64"],
4304 },
4305 x86_64: {
4306 native_shared_libs: ["mylib.x64"],
4307 },
4308 }
4309 }
4310
4311 apex_key {
4312 name: "myapex.key",
4313 public_key: "testkey.avbpubkey",
4314 private_key: "testkey.pem",
4315 }
4316
4317 cc_library {
4318 name: "mylib.arm64",
4319 srcs: ["mylib.cpp"],
4320 system_shared_libs: [],
4321 stl: "none",
4322 // TODO: remove //apex_available:platform
4323 apex_available: [
4324 "//apex_available:platform",
4325 "myapex",
4326 ],
4327 }
4328
4329 cc_library {
4330 name: "mylib.x64",
4331 srcs: ["mylib.cpp"],
4332 system_shared_libs: [],
4333 stl: "none",
4334 // TODO: remove //apex_available:platform
4335 apex_available: [
4336 "//apex_available:platform",
4337 "myapex",
4338 ],
4339 }
4340 `)
4341
4342 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4343 copyCmds := apexRule.Args["copy_commands"]
4344
4345 // Ensure that apex variant is created for the direct dep
4346 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4347 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4348
4349 // Ensure that both direct and indirect deps are copied into apex
4350 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4351 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4352}
4353
Jiyong Park04480cf2019-02-06 00:16:29 +09004354func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004355 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004356 apex {
4357 name: "myapex",
4358 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004359 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004360 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004361 }
4362
4363 apex_key {
4364 name: "myapex.key",
4365 public_key: "testkey.avbpubkey",
4366 private_key: "testkey.pem",
4367 }
4368
4369 sh_binary {
4370 name: "myscript",
4371 src: "mylib.cpp",
4372 filename: "myscript.sh",
4373 sub_dir: "script",
4374 }
4375 `)
4376
Sundong Ahnabb64432019-10-22 13:58:29 +09004377 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004378 copyCmds := apexRule.Args["copy_commands"]
4379
4380 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4381}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004382
Jooyung Han91df2082019-11-20 01:49:42 +09004383func TestApexInVariousPartition(t *testing.T) {
4384 testcases := []struct {
4385 propName, parition, flattenedPartition string
4386 }{
4387 {"", "system", "system_ext"},
4388 {"product_specific: true", "product", "product"},
4389 {"soc_specific: true", "vendor", "vendor"},
4390 {"proprietary: true", "vendor", "vendor"},
4391 {"vendor: true", "vendor", "vendor"},
4392 {"system_ext_specific: true", "system_ext", "system_ext"},
4393 }
4394 for _, tc := range testcases {
4395 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004396 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004397 apex {
4398 name: "myapex",
4399 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004400 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004401 `+tc.propName+`
4402 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004403
Jooyung Han91df2082019-11-20 01:49:42 +09004404 apex_key {
4405 name: "myapex.key",
4406 public_key: "testkey.avbpubkey",
4407 private_key: "testkey.pem",
4408 }
4409 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004410
Jooyung Han91df2082019-11-20 01:49:42 +09004411 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004412 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4413 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004414 if actual != expected {
4415 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4416 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004417
Jooyung Han91df2082019-11-20 01:49:42 +09004418 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004419 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4420 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004421 if actual != expected {
4422 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4423 }
4424 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004425 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004426}
Jiyong Park67882562019-03-21 01:11:21 +09004427
Jooyung Han580eb4f2020-06-24 19:33:06 +09004428func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004429 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004430 apex {
4431 name: "myapex",
4432 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004433 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004434 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004435
Jooyung Han580eb4f2020-06-24 19:33:06 +09004436 apex_key {
4437 name: "myapex.key",
4438 public_key: "testkey.avbpubkey",
4439 private_key: "testkey.pem",
4440 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004441 `)
4442 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004443 rule := module.Output("file_contexts")
4444 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4445}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004446
Jooyung Han580eb4f2020-06-24 19:33:06 +09004447func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004448 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004449 apex {
4450 name: "myapex",
4451 key: "myapex.key",
4452 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004453 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004454 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004455
Jooyung Han580eb4f2020-06-24 19:33:06 +09004456 apex_key {
4457 name: "myapex.key",
4458 public_key: "testkey.avbpubkey",
4459 private_key: "testkey.pem",
4460 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004461 `, withFiles(map[string][]byte{
4462 "my_own_file_contexts": nil,
4463 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004464}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004465
Jooyung Han580eb4f2020-06-24 19:33:06 +09004466func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004467 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004468 apex {
4469 name: "myapex",
4470 key: "myapex.key",
4471 product_specific: true,
4472 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004473 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004474 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004475
Jooyung Han580eb4f2020-06-24 19:33:06 +09004476 apex_key {
4477 name: "myapex.key",
4478 public_key: "testkey.avbpubkey",
4479 private_key: "testkey.pem",
4480 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004481 `)
4482
Colin Cross1c460562021-02-16 17:55:47 -08004483 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004484 apex {
4485 name: "myapex",
4486 key: "myapex.key",
4487 product_specific: true,
4488 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004489 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004490 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004491
Jooyung Han580eb4f2020-06-24 19:33:06 +09004492 apex_key {
4493 name: "myapex.key",
4494 public_key: "testkey.avbpubkey",
4495 private_key: "testkey.pem",
4496 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004497 `, withFiles(map[string][]byte{
4498 "product_specific_file_contexts": nil,
4499 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004500 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4501 rule := module.Output("file_contexts")
4502 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4503}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004504
Jooyung Han580eb4f2020-06-24 19:33:06 +09004505func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004506 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004507 apex {
4508 name: "myapex",
4509 key: "myapex.key",
4510 product_specific: true,
4511 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004512 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004513 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004514
Jooyung Han580eb4f2020-06-24 19:33:06 +09004515 apex_key {
4516 name: "myapex.key",
4517 public_key: "testkey.avbpubkey",
4518 private_key: "testkey.pem",
4519 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004520
Jooyung Han580eb4f2020-06-24 19:33:06 +09004521 filegroup {
4522 name: "my-file-contexts",
4523 srcs: ["product_specific_file_contexts"],
4524 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004525 `, withFiles(map[string][]byte{
4526 "product_specific_file_contexts": nil,
4527 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004528 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4529 rule := module.Output("file_contexts")
4530 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004531}
4532
Jiyong Park67882562019-03-21 01:11:21 +09004533func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004534 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004535 apex_key {
4536 name: "myapex.key",
4537 public_key: ":my.avbpubkey",
4538 private_key: ":my.pem",
4539 product_specific: true,
4540 }
4541
4542 filegroup {
4543 name: "my.avbpubkey",
4544 srcs: ["testkey2.avbpubkey"],
4545 }
4546
4547 filegroup {
4548 name: "my.pem",
4549 srcs: ["testkey2.pem"],
4550 }
4551 `)
4552
4553 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4554 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004555 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004556 if actual_pubkey != expected_pubkey {
4557 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4558 }
4559 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004560 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004561 if actual_privkey != expected_privkey {
4562 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4563 }
4564}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004565
4566func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004567 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004568 prebuilt_apex {
4569 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004570 arch: {
4571 arm64: {
4572 src: "myapex-arm64.apex",
4573 },
4574 arm: {
4575 src: "myapex-arm.apex",
4576 },
4577 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004578 }
4579 `)
4580
Wei Li340ee8e2022-03-18 17:33:24 -07004581 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4582 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004583
Jiyong Parkc95714e2019-03-29 14:23:10 +09004584 expectedInput := "myapex-arm64.apex"
4585 if prebuilt.inputApex.String() != expectedInput {
4586 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4587 }
Wei Li340ee8e2022-03-18 17:33:24 -07004588 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4589 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4590 rule := testingModule.Rule("genProvenanceMetaData")
4591 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4592 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4593 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4594 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004595}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004596
Paul Duffinc0609c62021-03-01 17:27:16 +00004597func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004598 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004599 prebuilt_apex {
4600 name: "myapex",
4601 }
4602 `)
4603}
4604
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004605func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004606 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004607 prebuilt_apex {
4608 name: "myapex",
4609 src: "myapex-arm.apex",
4610 filename: "notmyapex.apex",
4611 }
4612 `)
4613
Wei Li340ee8e2022-03-18 17:33:24 -07004614 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4615 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004616
4617 expected := "notmyapex.apex"
4618 if p.installFilename != expected {
4619 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4620 }
Wei Li340ee8e2022-03-18 17:33:24 -07004621 rule := testingModule.Rule("genProvenanceMetaData")
4622 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4623 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4624 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4625 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004626}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004627
Samiul Islam7c02e262021-09-08 17:48:28 +01004628func TestApexSetFilenameOverride(t *testing.T) {
4629 testApex(t, `
4630 apex_set {
4631 name: "com.company.android.myapex",
4632 apex_name: "com.android.myapex",
4633 set: "company-myapex.apks",
4634 filename: "com.company.android.myapex.apex"
4635 }
4636 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4637
4638 testApex(t, `
4639 apex_set {
4640 name: "com.company.android.myapex",
4641 apex_name: "com.android.myapex",
4642 set: "company-myapex.apks",
4643 filename: "com.company.android.myapex.capex"
4644 }
4645 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4646
4647 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4648 apex_set {
4649 name: "com.company.android.myapex",
4650 apex_name: "com.android.myapex",
4651 set: "company-myapex.apks",
4652 filename: "some-random-suffix"
4653 }
4654 `)
4655}
4656
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004657func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004658 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004659 prebuilt_apex {
4660 name: "myapex.prebuilt",
4661 src: "myapex-arm.apex",
4662 overrides: [
4663 "myapex",
4664 ],
4665 }
4666 `)
4667
Wei Li340ee8e2022-03-18 17:33:24 -07004668 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4669 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004670
4671 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004672 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004673 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004674 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004675 }
Wei Li340ee8e2022-03-18 17:33:24 -07004676 rule := testingModule.Rule("genProvenanceMetaData")
4677 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4678 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4679 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4680 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004681}
4682
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004683func TestPrebuiltApexName(t *testing.T) {
4684 testApex(t, `
4685 prebuilt_apex {
4686 name: "com.company.android.myapex",
4687 apex_name: "com.android.myapex",
4688 src: "company-myapex-arm.apex",
4689 }
4690 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4691
4692 testApex(t, `
4693 apex_set {
4694 name: "com.company.android.myapex",
4695 apex_name: "com.android.myapex",
4696 set: "company-myapex.apks",
4697 }
4698 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4699}
4700
4701func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4702 _ = android.GroupFixturePreparers(
4703 java.PrepareForTestWithJavaDefaultModules,
4704 PrepareForTestWithApexBuildComponents,
4705 android.FixtureWithRootAndroidBp(`
4706 platform_bootclasspath {
4707 name: "platform-bootclasspath",
4708 fragments: [
4709 {
4710 apex: "com.android.art",
4711 module: "art-bootclasspath-fragment",
4712 },
4713 ],
4714 }
4715
4716 prebuilt_apex {
4717 name: "com.company.android.art",
4718 apex_name: "com.android.art",
4719 src: "com.company.android.art-arm.apex",
4720 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4721 }
4722
4723 prebuilt_bootclasspath_fragment {
4724 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004725 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004726 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004727 hidden_api: {
4728 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4729 metadata: "my-bootclasspath-fragment/metadata.csv",
4730 index: "my-bootclasspath-fragment/index.csv",
4731 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4732 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4733 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004734 }
4735
4736 java_import {
4737 name: "core-oj",
4738 jars: ["prebuilt.jar"],
4739 }
4740 `),
4741 ).RunTest(t)
4742}
4743
Paul Duffin092153d2021-01-26 11:42:39 +00004744// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4745// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004746func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004747 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004748
Paul Duffin89886cb2021-02-05 16:44:03 +00004749 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004750 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004751 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004752 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004753 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004754 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004755 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4756 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4757 android.NormalizePathForTesting(dexJarBuildPath))
4758 }
4759
4760 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004761 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004762 // Make sure the import has been given the correct path to the dex jar.
4763 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4764 dexJarBuildPath := p.DexJarInstallPath()
4765 stem := android.RemoveOptionalPrebuiltPrefix(name)
4766 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4767 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4768 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004769 }
4770
Paul Duffin39853512021-02-26 11:09:39 +00004771 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004772 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004773 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004774 android.AssertArrayString(t, "Check if there is no source variant",
4775 []string{"android_common"},
4776 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004777 }
4778
4779 t.Run("prebuilt only", func(t *testing.T) {
4780 bp := `
4781 prebuilt_apex {
4782 name: "myapex",
4783 arch: {
4784 arm64: {
4785 src: "myapex-arm64.apex",
4786 },
4787 arm: {
4788 src: "myapex-arm.apex",
4789 },
4790 },
Paul Duffin39853512021-02-26 11:09:39 +00004791 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004792 }
4793
4794 java_import {
4795 name: "libfoo",
4796 jars: ["libfoo.jar"],
4797 }
Paul Duffin39853512021-02-26 11:09:39 +00004798
4799 java_sdk_library_import {
4800 name: "libbar",
4801 public: {
4802 jars: ["libbar.jar"],
4803 },
4804 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004805 `
4806
4807 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4808 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4809
Martin Stjernholm44825602021-09-17 01:44:12 +01004810 deapexerName := deapexerModuleName("myapex")
4811 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4812
Paul Duffinf6932af2021-02-26 18:21:56 +00004813 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004814 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004815 rule := deapexer.Rule("deapexer")
4816 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4817 t.Errorf("expected: %q, found: %q", expected, actual)
4818 }
4819
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004820 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004821 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004822 rule = prebuiltApex.Rule("android/soong/android.Cp")
4823 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4824 t.Errorf("expected: %q, found: %q", expected, actual)
4825 }
4826
Paul Duffin89886cb2021-02-05 16:44:03 +00004827 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004828 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004829
4830 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004831 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004832 })
4833
4834 t.Run("prebuilt with source preferred", func(t *testing.T) {
4835
4836 bp := `
4837 prebuilt_apex {
4838 name: "myapex",
4839 arch: {
4840 arm64: {
4841 src: "myapex-arm64.apex",
4842 },
4843 arm: {
4844 src: "myapex-arm.apex",
4845 },
4846 },
Paul Duffin39853512021-02-26 11:09:39 +00004847 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004848 }
4849
4850 java_import {
4851 name: "libfoo",
4852 jars: ["libfoo.jar"],
4853 }
4854
4855 java_library {
4856 name: "libfoo",
4857 }
Paul Duffin39853512021-02-26 11:09:39 +00004858
4859 java_sdk_library_import {
4860 name: "libbar",
4861 public: {
4862 jars: ["libbar.jar"],
4863 },
4864 }
4865
4866 java_sdk_library {
4867 name: "libbar",
4868 srcs: ["foo/bar/MyClass.java"],
4869 unsafe_ignore_missing_latest_api: true,
4870 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004871 `
4872
4873 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4874 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4875
Paul Duffin89886cb2021-02-05 16:44:03 +00004876 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004877 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004878 ensureNoSourceVariant(t, ctx, "libfoo")
4879
4880 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004881 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004882 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004883 })
4884
4885 t.Run("prebuilt preferred with source", func(t *testing.T) {
4886 bp := `
4887 prebuilt_apex {
4888 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004889 arch: {
4890 arm64: {
4891 src: "myapex-arm64.apex",
4892 },
4893 arm: {
4894 src: "myapex-arm.apex",
4895 },
4896 },
Paul Duffin39853512021-02-26 11:09:39 +00004897 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004898 }
4899
4900 java_import {
4901 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004902 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004903 jars: ["libfoo.jar"],
4904 }
4905
4906 java_library {
4907 name: "libfoo",
4908 }
Paul Duffin39853512021-02-26 11:09:39 +00004909
4910 java_sdk_library_import {
4911 name: "libbar",
4912 prefer: true,
4913 public: {
4914 jars: ["libbar.jar"],
4915 },
4916 }
4917
4918 java_sdk_library {
4919 name: "libbar",
4920 srcs: ["foo/bar/MyClass.java"],
4921 unsafe_ignore_missing_latest_api: true,
4922 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004923 `
4924
4925 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4926 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4927
Paul Duffin89886cb2021-02-05 16:44:03 +00004928 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004929 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004930 ensureNoSourceVariant(t, ctx, "libfoo")
4931
4932 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004933 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004934 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004935 })
4936}
4937
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004938func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004939 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004940 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004941 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4942 // is disabled.
4943 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4944 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004945
Paul Duffin37856732021-02-26 14:24:15 +00004946 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4947 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004948 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004949 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004950 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004951 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004952 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004953 foundLibfooJar = true
4954 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004955 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004956 }
4957 }
4958 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004959 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 +00004960 }
4961 }
4962
Paul Duffin40a3f652021-07-19 13:11:24 +01004963 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004964 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004965 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004966 var rule android.TestingBuildParams
4967
4968 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4969 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004970 }
4971
Paul Duffin40a3f652021-07-19 13:11:24 +01004972 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4973 t.Helper()
4974 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4975 var rule android.TestingBuildParams
4976
4977 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4978 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4979 }
4980
Paul Duffin89f570a2021-06-16 01:42:33 +01004981 fragment := java.ApexVariantReference{
4982 Apex: proptools.StringPtr("myapex"),
4983 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4984 }
4985
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004986 t.Run("prebuilt only", func(t *testing.T) {
4987 bp := `
4988 prebuilt_apex {
4989 name: "myapex",
4990 arch: {
4991 arm64: {
4992 src: "myapex-arm64.apex",
4993 },
4994 arm: {
4995 src: "myapex-arm.apex",
4996 },
4997 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004998 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4999 }
5000
5001 prebuilt_bootclasspath_fragment {
5002 name: "my-bootclasspath-fragment",
5003 contents: ["libfoo", "libbar"],
5004 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005005 hidden_api: {
5006 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5007 metadata: "my-bootclasspath-fragment/metadata.csv",
5008 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005009 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5010 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5011 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005012 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005013 }
5014
5015 java_import {
5016 name: "libfoo",
5017 jars: ["libfoo.jar"],
5018 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005019 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005020 }
Paul Duffin37856732021-02-26 14:24:15 +00005021
5022 java_sdk_library_import {
5023 name: "libbar",
5024 public: {
5025 jars: ["libbar.jar"],
5026 },
5027 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005028 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005029 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005030 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005031 `
5032
Paul Duffin89f570a2021-06-16 01:42:33 +01005033 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005034 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5035 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005036
Paul Duffin537ea3d2021-05-14 10:38:00 +01005037 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005038 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005039 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005040 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005041 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5042 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005043 })
5044
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005045 t.Run("apex_set only", func(t *testing.T) {
5046 bp := `
5047 apex_set {
5048 name: "myapex",
5049 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005050 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5051 }
5052
5053 prebuilt_bootclasspath_fragment {
5054 name: "my-bootclasspath-fragment",
5055 contents: ["libfoo", "libbar"],
5056 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005057 hidden_api: {
5058 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5059 metadata: "my-bootclasspath-fragment/metadata.csv",
5060 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005061 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5062 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5063 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005064 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005065 }
5066
5067 java_import {
5068 name: "libfoo",
5069 jars: ["libfoo.jar"],
5070 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005071 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005072 }
5073
5074 java_sdk_library_import {
5075 name: "libbar",
5076 public: {
5077 jars: ["libbar.jar"],
5078 },
5079 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005080 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005081 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005082 }
5083 `
5084
Paul Duffin89f570a2021-06-16 01:42:33 +01005085 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005086 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5087 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5088
Paul Duffin537ea3d2021-05-14 10:38:00 +01005089 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005090 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005091 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005092 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005093 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5094 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005095 })
5096
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005097 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5098 bp := `
5099 prebuilt_apex {
5100 name: "myapex",
5101 arch: {
5102 arm64: {
5103 src: "myapex-arm64.apex",
5104 },
5105 arm: {
5106 src: "myapex-arm.apex",
5107 },
5108 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005109 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5110 }
5111
5112 prebuilt_bootclasspath_fragment {
5113 name: "my-bootclasspath-fragment",
5114 contents: ["libfoo", "libbar"],
5115 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005116 hidden_api: {
5117 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5118 metadata: "my-bootclasspath-fragment/metadata.csv",
5119 index: "my-bootclasspath-fragment/index.csv",
5120 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5121 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5122 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005123 }
5124
5125 java_import {
5126 name: "libfoo",
5127 jars: ["libfoo.jar"],
5128 apex_available: ["myapex"],
5129 }
5130
5131 java_library {
5132 name: "libfoo",
5133 srcs: ["foo/bar/MyClass.java"],
5134 apex_available: ["myapex"],
5135 }
Paul Duffin37856732021-02-26 14:24:15 +00005136
5137 java_sdk_library_import {
5138 name: "libbar",
5139 public: {
5140 jars: ["libbar.jar"],
5141 },
5142 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005143 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005144 }
5145
5146 java_sdk_library {
5147 name: "libbar",
5148 srcs: ["foo/bar/MyClass.java"],
5149 unsafe_ignore_missing_latest_api: true,
5150 apex_available: ["myapex"],
5151 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005152 `
5153
5154 // In this test the source (java_library) libfoo is active since the
5155 // prebuilt (java_import) defaults to prefer:false. However the
5156 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5157 // find the dex boot jar in it. We either need to disable the source libfoo
5158 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005159 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005160 // dexbootjar check is skipped if AllowMissingDependencies is true
5161 preparerAllowMissingDeps := android.GroupFixturePreparers(
5162 preparer,
5163 android.PrepareForTestWithAllowMissingDependencies,
5164 )
5165 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005166 })
5167
5168 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5169 bp := `
5170 prebuilt_apex {
5171 name: "myapex",
5172 arch: {
5173 arm64: {
5174 src: "myapex-arm64.apex",
5175 },
5176 arm: {
5177 src: "myapex-arm.apex",
5178 },
5179 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005180 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5181 }
5182
5183 prebuilt_bootclasspath_fragment {
5184 name: "my-bootclasspath-fragment",
5185 contents: ["libfoo", "libbar"],
5186 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005187 hidden_api: {
5188 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5189 metadata: "my-bootclasspath-fragment/metadata.csv",
5190 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005191 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5192 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5193 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005194 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005195 }
5196
5197 java_import {
5198 name: "libfoo",
5199 prefer: true,
5200 jars: ["libfoo.jar"],
5201 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005202 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005203 }
5204
5205 java_library {
5206 name: "libfoo",
5207 srcs: ["foo/bar/MyClass.java"],
5208 apex_available: ["myapex"],
5209 }
Paul Duffin37856732021-02-26 14:24:15 +00005210
5211 java_sdk_library_import {
5212 name: "libbar",
5213 prefer: true,
5214 public: {
5215 jars: ["libbar.jar"],
5216 },
5217 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005218 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005219 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005220 }
5221
5222 java_sdk_library {
5223 name: "libbar",
5224 srcs: ["foo/bar/MyClass.java"],
5225 unsafe_ignore_missing_latest_api: true,
5226 apex_available: ["myapex"],
5227 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005228 `
5229
Paul Duffin89f570a2021-06-16 01:42:33 +01005230 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005231 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5232 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005233
Paul Duffin537ea3d2021-05-14 10:38:00 +01005234 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005235 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005236 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005237 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005238 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5239 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005240 })
5241
5242 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5243 bp := `
5244 apex {
5245 name: "myapex",
5246 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005247 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005248 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005249 }
5250
5251 apex_key {
5252 name: "myapex.key",
5253 public_key: "testkey.avbpubkey",
5254 private_key: "testkey.pem",
5255 }
5256
5257 prebuilt_apex {
5258 name: "myapex",
5259 arch: {
5260 arm64: {
5261 src: "myapex-arm64.apex",
5262 },
5263 arm: {
5264 src: "myapex-arm.apex",
5265 },
5266 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005267 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5268 }
5269
5270 prebuilt_bootclasspath_fragment {
5271 name: "my-bootclasspath-fragment",
5272 contents: ["libfoo", "libbar"],
5273 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005274 hidden_api: {
5275 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5276 metadata: "my-bootclasspath-fragment/metadata.csv",
5277 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005278 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5279 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5280 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005281 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005282 }
5283
5284 java_import {
5285 name: "libfoo",
5286 jars: ["libfoo.jar"],
5287 apex_available: ["myapex"],
5288 }
5289
5290 java_library {
5291 name: "libfoo",
5292 srcs: ["foo/bar/MyClass.java"],
5293 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005294 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005295 }
Paul Duffin37856732021-02-26 14:24:15 +00005296
5297 java_sdk_library_import {
5298 name: "libbar",
5299 public: {
5300 jars: ["libbar.jar"],
5301 },
5302 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005303 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005304 }
5305
5306 java_sdk_library {
5307 name: "libbar",
5308 srcs: ["foo/bar/MyClass.java"],
5309 unsafe_ignore_missing_latest_api: true,
5310 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005311 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005312 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005313 `
5314
Paul Duffin89f570a2021-06-16 01:42:33 +01005315 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005316 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5317 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005318
Paul Duffin537ea3d2021-05-14 10:38:00 +01005319 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005320 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005321 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005322 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005323 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5324 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005325 })
5326
5327 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5328 bp := `
5329 apex {
5330 name: "myapex",
5331 enabled: false,
5332 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005333 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005334 }
5335
5336 apex_key {
5337 name: "myapex.key",
5338 public_key: "testkey.avbpubkey",
5339 private_key: "testkey.pem",
5340 }
5341
5342 prebuilt_apex {
5343 name: "myapex",
5344 arch: {
5345 arm64: {
5346 src: "myapex-arm64.apex",
5347 },
5348 arm: {
5349 src: "myapex-arm.apex",
5350 },
5351 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005352 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5353 }
5354
5355 prebuilt_bootclasspath_fragment {
5356 name: "my-bootclasspath-fragment",
5357 contents: ["libfoo", "libbar"],
5358 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005359 hidden_api: {
5360 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5361 metadata: "my-bootclasspath-fragment/metadata.csv",
5362 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005363 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5364 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5365 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005366 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005367 }
5368
5369 java_import {
5370 name: "libfoo",
5371 prefer: true,
5372 jars: ["libfoo.jar"],
5373 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005374 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005375 }
5376
5377 java_library {
5378 name: "libfoo",
5379 srcs: ["foo/bar/MyClass.java"],
5380 apex_available: ["myapex"],
5381 }
Paul Duffin37856732021-02-26 14:24:15 +00005382
5383 java_sdk_library_import {
5384 name: "libbar",
5385 prefer: true,
5386 public: {
5387 jars: ["libbar.jar"],
5388 },
5389 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005390 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005391 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005392 }
5393
5394 java_sdk_library {
5395 name: "libbar",
5396 srcs: ["foo/bar/MyClass.java"],
5397 unsafe_ignore_missing_latest_api: true,
5398 apex_available: ["myapex"],
5399 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005400 `
5401
Paul Duffin89f570a2021-06-16 01:42:33 +01005402 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005403 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5404 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005405
Paul Duffin537ea3d2021-05-14 10:38:00 +01005406 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005407 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005408 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005409 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005410 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5411 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005412 })
5413}
5414
Roland Levillain630846d2019-06-26 12:48:34 +01005415func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005416 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005417 apex_test {
5418 name: "myapex",
5419 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005420 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005421 tests: [
5422 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005423 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005424 ],
5425 }
5426
5427 apex_key {
5428 name: "myapex.key",
5429 public_key: "testkey.avbpubkey",
5430 private_key: "testkey.pem",
5431 }
5432
Liz Kammer1c14a212020-05-12 15:26:55 -07005433 filegroup {
5434 name: "fg",
5435 srcs: [
5436 "baz",
5437 "bar/baz"
5438 ],
5439 }
5440
Roland Levillain630846d2019-06-26 12:48:34 +01005441 cc_test {
5442 name: "mytest",
5443 gtest: false,
5444 srcs: ["mytest.cpp"],
5445 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005446 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005447 system_shared_libs: [],
5448 static_executable: true,
5449 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005450 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005451 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005452
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005453 cc_library {
5454 name: "mylib",
5455 srcs: ["mylib.cpp"],
5456 system_shared_libs: [],
5457 stl: "none",
5458 }
5459
Liz Kammer5bd365f2020-05-27 15:15:11 -07005460 filegroup {
5461 name: "fg2",
5462 srcs: [
5463 "testdata/baz"
5464 ],
5465 }
5466
Roland Levillain9b5fde92019-06-28 15:41:19 +01005467 cc_test {
5468 name: "mytests",
5469 gtest: false,
5470 srcs: [
5471 "mytest1.cpp",
5472 "mytest2.cpp",
5473 "mytest3.cpp",
5474 ],
5475 test_per_src: true,
5476 relative_install_path: "test",
5477 system_shared_libs: [],
5478 static_executable: true,
5479 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005480 data: [
5481 ":fg",
5482 ":fg2",
5483 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005484 }
Roland Levillain630846d2019-06-26 12:48:34 +01005485 `)
5486
Sundong Ahnabb64432019-10-22 13:58:29 +09005487 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005488 copyCmds := apexRule.Args["copy_commands"]
5489
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005490 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005491 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005492 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005493
Liz Kammer1c14a212020-05-12 15:26:55 -07005494 //Ensure that test data are copied into apex.
5495 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5496 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5497
Roland Levillain9b5fde92019-06-28 15:41:19 +01005498 // Ensure that test deps built with `test_per_src` are copied into apex.
5499 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5500 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5501 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005502
5503 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005504 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005505 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005506 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005507 prefix := "TARGET_"
5508 var builder strings.Builder
5509 data.Custom(&builder, name, prefix, "", data)
5510 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005511 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5512 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5513 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5514 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005515 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005516 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005517 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005518
5519 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005520 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005521 data.Custom(&builder, name, prefix, "", data)
5522 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005523 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5524 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005525}
5526
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005527func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005528 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005529 apex {
5530 name: "myapex",
5531 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005532 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005533 }
5534 apex_key {
5535 name: "myapex.key",
5536 public_key: "testkey.avbpubkey",
5537 private_key: "testkey.pem",
5538 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005539 `,
5540 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5541 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5542 }),
5543 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005544 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005545 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005546 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005547 var builder strings.Builder
5548 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5549 androidMk := builder.String()
5550 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5551}
5552
Jooyung Hand48f3c32019-08-23 11:18:57 +09005553func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5554 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5555 apex {
5556 name: "myapex",
5557 key: "myapex.key",
5558 native_shared_libs: ["libfoo"],
5559 }
5560
5561 apex_key {
5562 name: "myapex.key",
5563 public_key: "testkey.avbpubkey",
5564 private_key: "testkey.pem",
5565 }
5566
5567 cc_library {
5568 name: "libfoo",
5569 stl: "none",
5570 system_shared_libs: [],
5571 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005572 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005573 }
5574 `)
5575 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5576 apex {
5577 name: "myapex",
5578 key: "myapex.key",
5579 java_libs: ["myjar"],
5580 }
5581
5582 apex_key {
5583 name: "myapex.key",
5584 public_key: "testkey.avbpubkey",
5585 private_key: "testkey.pem",
5586 }
5587
5588 java_library {
5589 name: "myjar",
5590 srcs: ["foo/bar/MyClass.java"],
5591 sdk_version: "none",
5592 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005593 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005594 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005595 }
5596 `)
5597}
5598
Bill Peckhama41a6962021-01-11 10:58:54 -08005599func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005600 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005601 apex {
5602 name: "myapex",
5603 key: "myapex.key",
5604 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005605 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005606 }
5607
5608 apex_key {
5609 name: "myapex.key",
5610 public_key: "testkey.avbpubkey",
5611 private_key: "testkey.pem",
5612 }
5613
5614 java_import {
5615 name: "myjavaimport",
5616 apex_available: ["myapex"],
5617 jars: ["my.jar"],
5618 compile_dex: true,
5619 }
5620 `)
5621
5622 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5623 apexRule := module.Rule("apexRule")
5624 copyCmds := apexRule.Args["copy_commands"]
5625 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5626}
5627
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005628func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005629 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005630 apex {
5631 name: "myapex",
5632 key: "myapex.key",
5633 apps: [
5634 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005635 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005636 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005637 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005638 }
5639
5640 apex_key {
5641 name: "myapex.key",
5642 public_key: "testkey.avbpubkey",
5643 private_key: "testkey.pem",
5644 }
5645
5646 android_app {
5647 name: "AppFoo",
5648 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005649 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005650 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005651 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005652 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005653 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005654 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005655
5656 android_app {
5657 name: "AppFooPriv",
5658 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005659 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005660 system_modules: "none",
5661 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005662 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005663 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005664 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005665
5666 cc_library_shared {
5667 name: "libjni",
5668 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005669 shared_libs: ["libfoo"],
5670 stl: "none",
5671 system_shared_libs: [],
5672 apex_available: [ "myapex" ],
5673 sdk_version: "current",
5674 }
5675
5676 cc_library_shared {
5677 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005678 stl: "none",
5679 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005680 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005681 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005682 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005683 `)
5684
Sundong Ahnabb64432019-10-22 13:58:29 +09005685 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005686 apexRule := module.Rule("apexRule")
5687 copyCmds := apexRule.Args["copy_commands"]
5688
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005689 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5690 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005691
Colin Crossaede88c2020-08-11 12:17:01 -07005692 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005693 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005694 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005695 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005696 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005697 // JNI libraries including transitive deps are
5698 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005699 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005700 // ... embedded inside APK (jnilibs.zip)
5701 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5702 // ... and not directly inside the APEX
5703 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5704 }
Dario Frenicde2a032019-10-27 00:29:22 +01005705}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005706
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005707func TestApexWithAppImportBuildId(t *testing.T) {
5708 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5709 for _, id := range invalidBuildIds {
5710 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5711 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5712 variables.BuildId = proptools.StringPtr(id)
5713 })
5714 testApexError(t, message, `apex {
5715 name: "myapex",
5716 key: "myapex.key",
5717 apps: ["AppFooPrebuilt"],
5718 updatable: false,
5719 }
5720
5721 apex_key {
5722 name: "myapex.key",
5723 public_key: "testkey.avbpubkey",
5724 private_key: "testkey.pem",
5725 }
5726
5727 android_app_import {
5728 name: "AppFooPrebuilt",
5729 apk: "PrebuiltAppFoo.apk",
5730 presigned: true,
5731 apex_available: ["myapex"],
5732 }
5733 `, fixture)
5734 }
5735}
5736
Dario Frenicde2a032019-10-27 00:29:22 +01005737func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005738 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005739 apex {
5740 name: "myapex",
5741 key: "myapex.key",
5742 apps: [
5743 "AppFooPrebuilt",
5744 "AppFooPrivPrebuilt",
5745 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005746 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005747 }
5748
5749 apex_key {
5750 name: "myapex.key",
5751 public_key: "testkey.avbpubkey",
5752 private_key: "testkey.pem",
5753 }
5754
5755 android_app_import {
5756 name: "AppFooPrebuilt",
5757 apk: "PrebuiltAppFoo.apk",
5758 presigned: true,
5759 dex_preopt: {
5760 enabled: false,
5761 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005762 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005763 }
5764
5765 android_app_import {
5766 name: "AppFooPrivPrebuilt",
5767 apk: "PrebuiltAppFooPriv.apk",
5768 privileged: true,
5769 presigned: true,
5770 dex_preopt: {
5771 enabled: false,
5772 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005773 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005774 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005775 }
5776 `)
5777
Sundong Ahnabb64432019-10-22 13:58:29 +09005778 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005779 apexRule := module.Rule("apexRule")
5780 copyCmds := apexRule.Args["copy_commands"]
5781
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005782 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5783 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005784}
5785
5786func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005787 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005788 apex {
5789 name: "myapex",
5790 key: "myapex.key",
5791 apps: [
5792 "AppFoo",
5793 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005794 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005795 }
5796
5797 apex_key {
5798 name: "myapex.key",
5799 public_key: "testkey.avbpubkey",
5800 private_key: "testkey.pem",
5801 }
5802
5803 android_app {
5804 name: "AppFoo",
5805 srcs: ["foo/bar/MyClass.java"],
5806 sdk_version: "none",
5807 system_modules: "none",
5808 apex_available: [ "myapex" ],
5809 }
5810
5811 android_app_import {
5812 name: "AppFoo",
5813 apk: "AppFooPrebuilt.apk",
5814 filename: "AppFooPrebuilt.apk",
5815 presigned: true,
5816 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005817 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005818 }
5819 `, withFiles(map[string][]byte{
5820 "AppFooPrebuilt.apk": nil,
5821 }))
5822
5823 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005824 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005825 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005826}
5827
Dario Freni6f3937c2019-12-20 22:58:03 +00005828func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005829 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005830 apex {
5831 name: "myapex",
5832 key: "myapex.key",
5833 apps: [
5834 "TesterHelpAppFoo",
5835 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005836 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005837 }
5838
5839 apex_key {
5840 name: "myapex.key",
5841 public_key: "testkey.avbpubkey",
5842 private_key: "testkey.pem",
5843 }
5844
5845 android_test_helper_app {
5846 name: "TesterHelpAppFoo",
5847 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005848 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005849 }
5850
5851 `)
5852
5853 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5854 apexRule := module.Rule("apexRule")
5855 copyCmds := apexRule.Args["copy_commands"]
5856
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005857 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005858}
5859
Jooyung Han18020ea2019-11-13 10:50:48 +09005860func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5861 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005862 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005863 apex {
5864 name: "myapex",
5865 key: "myapex.key",
5866 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005867 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005868 }
5869
5870 apex_key {
5871 name: "myapex.key",
5872 public_key: "testkey.avbpubkey",
5873 private_key: "testkey.pem",
5874 }
5875
5876 apex {
5877 name: "otherapex",
5878 key: "myapex.key",
5879 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005880 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005881 }
5882
5883 cc_defaults {
5884 name: "libfoo-defaults",
5885 apex_available: ["otherapex"],
5886 }
5887
5888 cc_library {
5889 name: "libfoo",
5890 defaults: ["libfoo-defaults"],
5891 stl: "none",
5892 system_shared_libs: [],
5893 }`)
5894}
5895
Paul Duffine52e66f2020-03-30 17:54:29 +01005896func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005897 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005898 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005899 apex {
5900 name: "myapex",
5901 key: "myapex.key",
5902 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005903 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005904 }
5905
5906 apex_key {
5907 name: "myapex.key",
5908 public_key: "testkey.avbpubkey",
5909 private_key: "testkey.pem",
5910 }
5911
5912 apex {
5913 name: "otherapex",
5914 key: "otherapex.key",
5915 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005916 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005917 }
5918
5919 apex_key {
5920 name: "otherapex.key",
5921 public_key: "testkey.avbpubkey",
5922 private_key: "testkey.pem",
5923 }
5924
5925 cc_library {
5926 name: "libfoo",
5927 stl: "none",
5928 system_shared_libs: [],
5929 apex_available: ["otherapex"],
5930 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005931}
Jiyong Park127b40b2019-09-30 16:04:35 +09005932
Paul Duffine52e66f2020-03-30 17:54:29 +01005933func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005934 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005935 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00005936.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01005937.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005938.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005939.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005940.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005941.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005942 apex {
5943 name: "myapex",
5944 key: "myapex.key",
5945 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005946 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005947 }
5948
5949 apex_key {
5950 name: "myapex.key",
5951 public_key: "testkey.avbpubkey",
5952 private_key: "testkey.pem",
5953 }
5954
Jiyong Park127b40b2019-09-30 16:04:35 +09005955 cc_library {
5956 name: "libfoo",
5957 stl: "none",
5958 shared_libs: ["libbar"],
5959 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005960 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005961 }
5962
5963 cc_library {
5964 name: "libbar",
5965 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005966 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005967 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005968 apex_available: ["myapex"],
5969 }
5970
5971 cc_library {
5972 name: "libbaz",
5973 stl: "none",
5974 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005975 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005976}
Jiyong Park127b40b2019-09-30 16:04:35 +09005977
Paul Duffine52e66f2020-03-30 17:54:29 +01005978func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005979 testApexError(t, "\"otherapex\" is not a valid module name", `
5980 apex {
5981 name: "myapex",
5982 key: "myapex.key",
5983 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005984 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005985 }
5986
5987 apex_key {
5988 name: "myapex.key",
5989 public_key: "testkey.avbpubkey",
5990 private_key: "testkey.pem",
5991 }
5992
5993 cc_library {
5994 name: "libfoo",
5995 stl: "none",
5996 system_shared_libs: [],
5997 apex_available: ["otherapex"],
5998 }`)
5999
Paul Duffine52e66f2020-03-30 17:54:29 +01006000 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006001 apex {
6002 name: "myapex",
6003 key: "myapex.key",
6004 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006005 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006006 }
6007
6008 apex_key {
6009 name: "myapex.key",
6010 public_key: "testkey.avbpubkey",
6011 private_key: "testkey.pem",
6012 }
6013
6014 cc_library {
6015 name: "libfoo",
6016 stl: "none",
6017 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006018 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006019 apex_available: ["myapex"],
6020 }
6021
6022 cc_library {
6023 name: "libbar",
6024 stl: "none",
6025 system_shared_libs: [],
6026 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006027 }
6028
6029 cc_library {
6030 name: "libbaz",
6031 stl: "none",
6032 system_shared_libs: [],
6033 stubs: {
6034 versions: ["10", "20", "30"],
6035 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006036 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006037}
Jiyong Park127b40b2019-09-30 16:04:35 +09006038
Jiyong Park89e850a2020-04-07 16:37:39 +09006039func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006040 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006041 apex {
6042 name: "myapex",
6043 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006044 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006045 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006046 }
6047
6048 apex_key {
6049 name: "myapex.key",
6050 public_key: "testkey.avbpubkey",
6051 private_key: "testkey.pem",
6052 }
6053
6054 cc_library {
6055 name: "libfoo",
6056 stl: "none",
6057 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006058 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006059 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006060 }
6061
6062 cc_library {
6063 name: "libfoo2",
6064 stl: "none",
6065 system_shared_libs: [],
6066 shared_libs: ["libbaz"],
6067 apex_available: ["//apex_available:platform"],
6068 }
6069
6070 cc_library {
6071 name: "libbar",
6072 stl: "none",
6073 system_shared_libs: [],
6074 apex_available: ["myapex"],
6075 }
6076
6077 cc_library {
6078 name: "libbaz",
6079 stl: "none",
6080 system_shared_libs: [],
6081 apex_available: ["myapex"],
6082 stubs: {
6083 versions: ["1"],
6084 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006085 }`)
6086
Jiyong Park89e850a2020-04-07 16:37:39 +09006087 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6088 // because it depends on libbar which isn't available to platform
6089 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6090 if libfoo.NotAvailableForPlatform() != true {
6091 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6092 }
6093
6094 // libfoo2 however can be available to platform because it depends on libbaz which provides
6095 // stubs
6096 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6097 if libfoo2.NotAvailableForPlatform() == true {
6098 t.Errorf("%q should be available to platform", libfoo2.String())
6099 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006100}
Jiyong Parka90ca002019-10-07 15:47:24 +09006101
Paul Duffine52e66f2020-03-30 17:54:29 +01006102func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006103 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006104 apex {
6105 name: "myapex",
6106 key: "myapex.key",
6107 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006108 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006109 }
6110
6111 apex_key {
6112 name: "myapex.key",
6113 public_key: "testkey.avbpubkey",
6114 private_key: "testkey.pem",
6115 }
6116
6117 cc_library {
6118 name: "libfoo",
6119 stl: "none",
6120 system_shared_libs: [],
6121 apex_available: ["myapex"],
6122 static: {
6123 apex_available: ["//apex_available:platform"],
6124 },
6125 }`)
6126
Jiyong Park89e850a2020-04-07 16:37:39 +09006127 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6128 if libfooShared.NotAvailableForPlatform() != true {
6129 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6130 }
6131 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6132 if libfooStatic.NotAvailableForPlatform() != false {
6133 t.Errorf("%q should be available to platform", libfooStatic.String())
6134 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006135}
6136
Jiyong Park5d790c32019-11-15 18:40:32 +09006137func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006138 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006139 apex {
6140 name: "myapex",
6141 key: "myapex.key",
6142 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006143 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006144 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006145 bootclasspath_fragments: ["mybootclasspath_fragment"],
6146 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6147 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006148 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006149 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006150 }
6151
6152 override_apex {
6153 name: "override_myapex",
6154 base: "myapex",
6155 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08006156 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006157 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006158 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6159 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6160 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006161 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006162 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006163 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006164 key: "mynewapex.key",
6165 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006166 }
6167
6168 apex_key {
6169 name: "myapex.key",
6170 public_key: "testkey.avbpubkey",
6171 private_key: "testkey.pem",
6172 }
6173
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006174 apex_key {
6175 name: "mynewapex.key",
6176 public_key: "testkey2.avbpubkey",
6177 private_key: "testkey2.pem",
6178 }
6179
6180 android_app_certificate {
6181 name: "myapex.certificate",
6182 certificate: "testkey",
6183 }
6184
Jiyong Park5d790c32019-11-15 18:40:32 +09006185 android_app {
6186 name: "app",
6187 srcs: ["foo/bar/MyClass.java"],
6188 package_name: "foo",
6189 sdk_version: "none",
6190 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006191 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006192 }
6193
6194 override_android_app {
6195 name: "override_app",
6196 base: "app",
6197 package_name: "bar",
6198 }
markchien7c803b82021-08-26 22:10:06 +08006199
6200 bpf {
6201 name: "bpf",
6202 srcs: ["bpf.c"],
6203 }
6204
6205 bpf {
6206 name: "override_bpf",
6207 srcs: ["override_bpf.c"],
6208 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006209
6210 prebuilt_etc {
6211 name: "myetc",
6212 src: "myprebuilt",
6213 }
6214
6215 prebuilt_etc {
6216 name: "override_myetc",
6217 src: "override_myprebuilt",
6218 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006219
6220 java_library {
6221 name: "bcplib",
6222 srcs: ["a.java"],
6223 compile_dex: true,
6224 apex_available: ["myapex"],
6225 permitted_packages: ["bcp.lib"],
6226 }
6227
6228 bootclasspath_fragment {
6229 name: "mybootclasspath_fragment",
6230 contents: ["bcplib"],
6231 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006232 hidden_api: {
6233 split_packages: ["*"],
6234 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006235 }
6236
6237 java_library {
6238 name: "override_bcplib",
6239 srcs: ["a.java"],
6240 compile_dex: true,
6241 apex_available: ["myapex"],
6242 permitted_packages: ["override.bcp.lib"],
6243 }
6244
6245 bootclasspath_fragment {
6246 name: "override_bootclasspath_fragment",
6247 contents: ["override_bcplib"],
6248 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006249 hidden_api: {
6250 split_packages: ["*"],
6251 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006252 }
6253
6254 java_library {
6255 name: "systemserverlib",
6256 srcs: ["a.java"],
6257 apex_available: ["myapex"],
6258 }
6259
6260 systemserverclasspath_fragment {
6261 name: "mysystemserverclasspath_fragment",
6262 standalone_contents: ["systemserverlib"],
6263 apex_available: ["myapex"],
6264 }
6265
6266 java_library {
6267 name: "override_systemserverlib",
6268 srcs: ["a.java"],
6269 apex_available: ["myapex"],
6270 }
6271
6272 systemserverclasspath_fragment {
6273 name: "override_systemserverclasspath_fragment",
6274 standalone_contents: ["override_systemserverlib"],
6275 apex_available: ["myapex"],
6276 }
6277
6278 java_library {
6279 name: "myjava_library",
6280 srcs: ["a.java"],
6281 compile_dex: true,
6282 apex_available: ["myapex"],
6283 }
6284
6285 java_library {
6286 name: "override_java_library",
6287 srcs: ["a.java"],
6288 compile_dex: true,
6289 apex_available: ["myapex"],
6290 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006291 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006292
Jiyong Park317645e2019-12-05 13:20:58 +09006293 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6294 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6295 if originalVariant.GetOverriddenBy() != "" {
6296 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6297 }
6298 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6299 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6300 }
6301
Jiyong Park5d790c32019-11-15 18:40:32 +09006302 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6303 apexRule := module.Rule("apexRule")
6304 copyCmds := apexRule.Args["copy_commands"]
6305
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006306 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6307 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006308
markchien7c803b82021-08-26 22:10:06 +08006309 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6310 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6311
Daniel Norman5a3ce132021-08-26 15:44:43 -07006312 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6313 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6314
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006315 apexBundle := module.Module().(*apexBundle)
6316 name := apexBundle.Name()
6317 if name != "override_myapex" {
6318 t.Errorf("name should be \"override_myapex\", but was %q", name)
6319 }
6320
Baligh Uddin004d7172020-02-19 21:29:28 -08006321 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6322 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6323 }
6324
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006325 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6326 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6327 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6328 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6329 android.AssertArrayString(t, "Java_libs does not match",
6330 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6331
Jiyong Park20bacab2020-03-03 11:45:41 +09006332 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006333 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006334 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6335
6336 signApkRule := module.Rule("signapk")
6337 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006338
Colin Crossaa255532020-07-03 13:18:24 -07006339 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006340 var builder strings.Builder
6341 data.Custom(&builder, name, "TARGET_", "", data)
6342 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006343 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006344 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006345 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006346 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6347 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6348 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006349 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006350 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006351 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006352 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006353 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006354 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006355 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6356 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6357 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006358 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006359}
6360
Albert Martineefabcf2022-03-21 20:11:16 +00006361func TestMinSdkVersionOverride(t *testing.T) {
6362 // Override from 29 to 31
6363 minSdkOverride31 := "31"
6364 ctx := testApex(t, `
6365 apex {
6366 name: "myapex",
6367 key: "myapex.key",
6368 native_shared_libs: ["mylib"],
6369 updatable: true,
6370 min_sdk_version: "29"
6371 }
6372
6373 override_apex {
6374 name: "override_myapex",
6375 base: "myapex",
6376 logging_parent: "com.foo.bar",
6377 package_name: "test.overridden.package"
6378 }
6379
6380 apex_key {
6381 name: "myapex.key",
6382 public_key: "testkey.avbpubkey",
6383 private_key: "testkey.pem",
6384 }
6385
6386 cc_library {
6387 name: "mylib",
6388 srcs: ["mylib.cpp"],
6389 runtime_libs: ["libbar"],
6390 system_shared_libs: [],
6391 stl: "none",
6392 apex_available: [ "myapex" ],
6393 min_sdk_version: "apex_inherit"
6394 }
6395
6396 cc_library {
6397 name: "libbar",
6398 srcs: ["mylib.cpp"],
6399 system_shared_libs: [],
6400 stl: "none",
6401 apex_available: [ "myapex" ],
6402 min_sdk_version: "apex_inherit"
6403 }
6404
6405 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6406
6407 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6408 copyCmds := apexRule.Args["copy_commands"]
6409
6410 // Ensure that direct non-stubs dep is always included
6411 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6412
6413 // Ensure that runtime_libs dep in included
6414 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6415
6416 // Ensure libraries target overridden min_sdk_version value
6417 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6418}
6419
6420func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6421 // Attempt to override from 31 to 29, should be a NOOP
6422 minSdkOverride29 := "29"
6423 ctx := testApex(t, `
6424 apex {
6425 name: "myapex",
6426 key: "myapex.key",
6427 native_shared_libs: ["mylib"],
6428 updatable: true,
6429 min_sdk_version: "31"
6430 }
6431
6432 override_apex {
6433 name: "override_myapex",
6434 base: "myapex",
6435 logging_parent: "com.foo.bar",
6436 package_name: "test.overridden.package"
6437 }
6438
6439 apex_key {
6440 name: "myapex.key",
6441 public_key: "testkey.avbpubkey",
6442 private_key: "testkey.pem",
6443 }
6444
6445 cc_library {
6446 name: "mylib",
6447 srcs: ["mylib.cpp"],
6448 runtime_libs: ["libbar"],
6449 system_shared_libs: [],
6450 stl: "none",
6451 apex_available: [ "myapex" ],
6452 min_sdk_version: "apex_inherit"
6453 }
6454
6455 cc_library {
6456 name: "libbar",
6457 srcs: ["mylib.cpp"],
6458 system_shared_libs: [],
6459 stl: "none",
6460 apex_available: [ "myapex" ],
6461 min_sdk_version: "apex_inherit"
6462 }
6463
6464 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6465
6466 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6467 copyCmds := apexRule.Args["copy_commands"]
6468
6469 // Ensure that direct non-stubs dep is always included
6470 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6471
6472 // Ensure that runtime_libs dep in included
6473 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6474
6475 // Ensure libraries target the original min_sdk_version value rather than the overridden
6476 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6477}
6478
Jooyung Han214bf372019-11-12 13:03:50 +09006479func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006480 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006481 apex {
6482 name: "myapex",
6483 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006484 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006485 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006486 }
6487
6488 apex_key {
6489 name: "myapex.key",
6490 public_key: "testkey.avbpubkey",
6491 private_key: "testkey.pem",
6492 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006493
6494 cc_library {
6495 name: "mylib",
6496 srcs: ["mylib.cpp"],
6497 stl: "libc++",
6498 system_shared_libs: [],
6499 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006500 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006501 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006502 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006503
6504 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6505 args := module.Rule("apexRule").Args
6506 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006507 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006508
6509 // The copies of the libraries in the apex should have one more dependency than
6510 // the ones outside the apex, namely the unwinder. Ideally we should check
6511 // the dependency names directly here but for some reason the names are blank in
6512 // this test.
6513 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006514 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006515 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6516 if len(apexImplicits) != len(nonApexImplicits)+1 {
6517 t.Errorf("%q missing unwinder dep", lib)
6518 }
6519 }
Jooyung Han214bf372019-11-12 13:03:50 +09006520}
6521
Paul Duffine05480a2021-03-08 15:07:14 +00006522var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006523 "api/current.txt": nil,
6524 "api/removed.txt": nil,
6525 "api/system-current.txt": nil,
6526 "api/system-removed.txt": nil,
6527 "api/test-current.txt": nil,
6528 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006529
Anton Hanssondff2c782020-12-21 17:10:01 +00006530 "100/public/api/foo.txt": nil,
6531 "100/public/api/foo-removed.txt": nil,
6532 "100/system/api/foo.txt": nil,
6533 "100/system/api/foo-removed.txt": nil,
6534
Paul Duffineedc5d52020-06-12 17:46:39 +01006535 // For java_sdk_library_import
6536 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006537}
6538
Jooyung Han58f26ab2019-12-18 15:34:32 +09006539func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006540 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006541 apex {
6542 name: "myapex",
6543 key: "myapex.key",
6544 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006545 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006546 }
6547
6548 apex_key {
6549 name: "myapex.key",
6550 public_key: "testkey.avbpubkey",
6551 private_key: "testkey.pem",
6552 }
6553
6554 java_sdk_library {
6555 name: "foo",
6556 srcs: ["a.java"],
6557 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006558 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006559 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006560
6561 prebuilt_apis {
6562 name: "sdk",
6563 api_dirs: ["100"],
6564 }
Paul Duffin9b879592020-05-26 13:21:35 +01006565 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006566
6567 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006568 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006569 "javalib/foo.jar",
6570 "etc/permissions/foo.xml",
6571 })
6572 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006573 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006574 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 +09006575}
6576
Paul Duffin9b879592020-05-26 13:21:35 +01006577func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006578 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006579 apex {
6580 name: "myapex",
6581 key: "myapex.key",
6582 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006583 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006584 }
6585
6586 apex_key {
6587 name: "myapex.key",
6588 public_key: "testkey.avbpubkey",
6589 private_key: "testkey.pem",
6590 }
6591
6592 java_sdk_library {
6593 name: "foo",
6594 srcs: ["a.java"],
6595 api_packages: ["foo"],
6596 apex_available: ["myapex"],
6597 sdk_version: "none",
6598 system_modules: "none",
6599 }
6600
6601 java_library {
6602 name: "bar",
6603 srcs: ["a.java"],
6604 libs: ["foo"],
6605 apex_available: ["myapex"],
6606 sdk_version: "none",
6607 system_modules: "none",
6608 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006609
6610 prebuilt_apis {
6611 name: "sdk",
6612 api_dirs: ["100"],
6613 }
Paul Duffin9b879592020-05-26 13:21:35 +01006614 `, withFiles(filesForSdkLibrary))
6615
6616 // java_sdk_library installs both impl jar and permission XML
6617 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6618 "javalib/bar.jar",
6619 "javalib/foo.jar",
6620 "etc/permissions/foo.xml",
6621 })
6622
6623 // The bar library should depend on the implementation jar.
6624 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006625 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006626 t.Errorf("expected %q, found %#q", expected, actual)
6627 }
6628}
6629
6630func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006631 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006632 apex {
6633 name: "myapex",
6634 key: "myapex.key",
6635 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006636 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006637 }
6638
6639 apex_key {
6640 name: "myapex.key",
6641 public_key: "testkey.avbpubkey",
6642 private_key: "testkey.pem",
6643 }
6644
6645 java_sdk_library {
6646 name: "foo",
6647 srcs: ["a.java"],
6648 api_packages: ["foo"],
6649 apex_available: ["myapex"],
6650 sdk_version: "none",
6651 system_modules: "none",
6652 }
6653
6654 java_library {
6655 name: "bar",
6656 srcs: ["a.java"],
6657 libs: ["foo"],
6658 sdk_version: "none",
6659 system_modules: "none",
6660 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006661
6662 prebuilt_apis {
6663 name: "sdk",
6664 api_dirs: ["100"],
6665 }
Paul Duffin9b879592020-05-26 13:21:35 +01006666 `, withFiles(filesForSdkLibrary))
6667
6668 // java_sdk_library installs both impl jar and permission XML
6669 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6670 "javalib/foo.jar",
6671 "etc/permissions/foo.xml",
6672 })
6673
6674 // The bar library should depend on the stubs jar.
6675 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006676 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006677 t.Errorf("expected %q, found %#q", expected, actual)
6678 }
6679}
6680
Paul Duffineedc5d52020-06-12 17:46:39 +01006681func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006682 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006683 prebuilt_apis {
6684 name: "sdk",
6685 api_dirs: ["100"],
6686 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006687 withFiles(map[string][]byte{
6688 "apex/a.java": nil,
6689 "apex/apex_manifest.json": nil,
6690 "apex/Android.bp": []byte(`
6691 package {
6692 default_visibility: ["//visibility:private"],
6693 }
6694
6695 apex {
6696 name: "myapex",
6697 key: "myapex.key",
6698 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006699 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006700 }
6701
6702 apex_key {
6703 name: "myapex.key",
6704 public_key: "testkey.avbpubkey",
6705 private_key: "testkey.pem",
6706 }
6707
6708 java_library {
6709 name: "bar",
6710 srcs: ["a.java"],
6711 libs: ["foo"],
6712 apex_available: ["myapex"],
6713 sdk_version: "none",
6714 system_modules: "none",
6715 }
6716`),
6717 "source/a.java": nil,
6718 "source/api/current.txt": nil,
6719 "source/api/removed.txt": nil,
6720 "source/Android.bp": []byte(`
6721 package {
6722 default_visibility: ["//visibility:private"],
6723 }
6724
6725 java_sdk_library {
6726 name: "foo",
6727 visibility: ["//apex"],
6728 srcs: ["a.java"],
6729 api_packages: ["foo"],
6730 apex_available: ["myapex"],
6731 sdk_version: "none",
6732 system_modules: "none",
6733 public: {
6734 enabled: true,
6735 },
6736 }
6737`),
6738 "prebuilt/a.jar": nil,
6739 "prebuilt/Android.bp": []byte(`
6740 package {
6741 default_visibility: ["//visibility:private"],
6742 }
6743
6744 java_sdk_library_import {
6745 name: "foo",
6746 visibility: ["//apex", "//source"],
6747 apex_available: ["myapex"],
6748 prefer: true,
6749 public: {
6750 jars: ["a.jar"],
6751 },
6752 }
6753`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006754 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006755 )
6756
6757 // java_sdk_library installs both impl jar and permission XML
6758 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6759 "javalib/bar.jar",
6760 "javalib/foo.jar",
6761 "etc/permissions/foo.xml",
6762 })
6763
6764 // The bar library should depend on the implementation jar.
6765 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006766 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006767 t.Errorf("expected %q, found %#q", expected, actual)
6768 }
6769}
6770
6771func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6772 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6773 apex {
6774 name: "myapex",
6775 key: "myapex.key",
6776 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006777 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006778 }
6779
6780 apex_key {
6781 name: "myapex.key",
6782 public_key: "testkey.avbpubkey",
6783 private_key: "testkey.pem",
6784 }
6785
6786 java_sdk_library_import {
6787 name: "foo",
6788 apex_available: ["myapex"],
6789 prefer: true,
6790 public: {
6791 jars: ["a.jar"],
6792 },
6793 }
6794
6795 `, withFiles(filesForSdkLibrary))
6796}
6797
atrost6e126252020-01-27 17:01:16 +00006798func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006799 result := android.GroupFixturePreparers(
6800 prepareForApexTest,
6801 java.PrepareForTestWithPlatformCompatConfig,
6802 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006803 apex {
6804 name: "myapex",
6805 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006806 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006807 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006808 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006809 }
6810
6811 apex_key {
6812 name: "myapex.key",
6813 public_key: "testkey.avbpubkey",
6814 private_key: "testkey.pem",
6815 }
6816
6817 platform_compat_config {
6818 name: "myjar-platform-compat-config",
6819 src: ":myjar",
6820 }
6821
6822 java_library {
6823 name: "myjar",
6824 srcs: ["foo/bar/MyClass.java"],
6825 sdk_version: "none",
6826 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006827 apex_available: [ "myapex" ],
6828 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006829
6830 // Make sure that a preferred prebuilt does not affect the apex contents.
6831 prebuilt_platform_compat_config {
6832 name: "myjar-platform-compat-config",
6833 metadata: "compat-config/metadata.xml",
6834 prefer: true,
6835 }
atrost6e126252020-01-27 17:01:16 +00006836 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006837 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006838 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6839 "etc/compatconfig/myjar-platform-compat-config.xml",
6840 "javalib/myjar.jar",
6841 })
6842}
6843
Jiyong Park479321d2019-12-16 11:47:12 +09006844func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6845 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6846 apex {
6847 name: "myapex",
6848 key: "myapex.key",
6849 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006850 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006851 }
6852
6853 apex_key {
6854 name: "myapex.key",
6855 public_key: "testkey.avbpubkey",
6856 private_key: "testkey.pem",
6857 }
6858
6859 java_library {
6860 name: "myjar",
6861 srcs: ["foo/bar/MyClass.java"],
6862 sdk_version: "none",
6863 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006864 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006865 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006866 }
6867 `)
6868}
6869
Jiyong Park7afd1072019-12-30 16:56:33 +09006870func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006871 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006872 apex {
6873 name: "myapex",
6874 key: "myapex.key",
6875 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006876 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006877 }
6878
6879 apex_key {
6880 name: "myapex.key",
6881 public_key: "testkey.avbpubkey",
6882 private_key: "testkey.pem",
6883 }
6884
6885 cc_library {
6886 name: "mylib",
6887 srcs: ["mylib.cpp"],
6888 system_shared_libs: [],
6889 stl: "none",
6890 required: ["a", "b"],
6891 host_required: ["c", "d"],
6892 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006893 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006894 }
6895 `)
6896
6897 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006898 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006899 name := apexBundle.BaseModuleName()
6900 prefix := "TARGET_"
6901 var builder strings.Builder
6902 data.Custom(&builder, name, prefix, "", data)
6903 androidMk := builder.String()
6904 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6905 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6906 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6907}
6908
Jiyong Park7cd10e32020-01-14 09:22:18 +09006909func TestSymlinksFromApexToSystem(t *testing.T) {
6910 bp := `
6911 apex {
6912 name: "myapex",
6913 key: "myapex.key",
6914 native_shared_libs: ["mylib"],
6915 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006916 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006917 }
6918
Jiyong Park9d677202020-02-19 16:29:35 +09006919 apex {
6920 name: "myapex.updatable",
6921 key: "myapex.key",
6922 native_shared_libs: ["mylib"],
6923 java_libs: ["myjar"],
6924 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006925 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006926 }
6927
Jiyong Park7cd10e32020-01-14 09:22:18 +09006928 apex_key {
6929 name: "myapex.key",
6930 public_key: "testkey.avbpubkey",
6931 private_key: "testkey.pem",
6932 }
6933
6934 cc_library {
6935 name: "mylib",
6936 srcs: ["mylib.cpp"],
6937 shared_libs: ["myotherlib"],
6938 system_shared_libs: [],
6939 stl: "none",
6940 apex_available: [
6941 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006942 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006943 "//apex_available:platform",
6944 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006945 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006946 }
6947
6948 cc_library {
6949 name: "myotherlib",
6950 srcs: ["mylib.cpp"],
6951 system_shared_libs: [],
6952 stl: "none",
6953 apex_available: [
6954 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006955 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006956 "//apex_available:platform",
6957 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006958 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006959 }
6960
6961 java_library {
6962 name: "myjar",
6963 srcs: ["foo/bar/MyClass.java"],
6964 sdk_version: "none",
6965 system_modules: "none",
6966 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006967 apex_available: [
6968 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006969 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006970 "//apex_available:platform",
6971 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006972 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006973 }
6974
6975 java_library {
6976 name: "myotherjar",
6977 srcs: ["foo/bar/MyClass.java"],
6978 sdk_version: "none",
6979 system_modules: "none",
6980 apex_available: [
6981 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006982 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006983 "//apex_available:platform",
6984 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006985 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006986 }
6987 `
6988
6989 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6990 for _, f := range files {
6991 if f.path == file {
6992 if f.isLink {
6993 t.Errorf("%q is not a real file", file)
6994 }
6995 return
6996 }
6997 }
6998 t.Errorf("%q is not found", file)
6999 }
7000
7001 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7002 for _, f := range files {
7003 if f.path == file {
7004 if !f.isLink {
7005 t.Errorf("%q is not a symlink", file)
7006 }
7007 return
7008 }
7009 }
7010 t.Errorf("%q is not found", file)
7011 }
7012
Jiyong Park9d677202020-02-19 16:29:35 +09007013 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7014 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007015 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007016 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007017 ensureRealfileExists(t, files, "javalib/myjar.jar")
7018 ensureRealfileExists(t, files, "lib64/mylib.so")
7019 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7020
Jiyong Park9d677202020-02-19 16:29:35 +09007021 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7022 ensureRealfileExists(t, files, "javalib/myjar.jar")
7023 ensureRealfileExists(t, files, "lib64/mylib.so")
7024 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7025
7026 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007027 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007028 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007029 ensureRealfileExists(t, files, "javalib/myjar.jar")
7030 ensureRealfileExists(t, files, "lib64/mylib.so")
7031 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007032
7033 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7034 ensureRealfileExists(t, files, "javalib/myjar.jar")
7035 ensureRealfileExists(t, files, "lib64/mylib.so")
7036 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007037}
7038
Yo Chiange8128052020-07-23 20:09:18 +08007039func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007040 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007041 apex {
7042 name: "myapex",
7043 key: "myapex.key",
7044 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007045 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007046 }
7047
7048 apex_key {
7049 name: "myapex.key",
7050 public_key: "testkey.avbpubkey",
7051 private_key: "testkey.pem",
7052 }
7053
7054 cc_library_shared {
7055 name: "mylib",
7056 srcs: ["mylib.cpp"],
7057 shared_libs: ["myotherlib"],
7058 system_shared_libs: [],
7059 stl: "none",
7060 apex_available: [
7061 "myapex",
7062 "//apex_available:platform",
7063 ],
7064 }
7065
7066 cc_prebuilt_library_shared {
7067 name: "myotherlib",
7068 srcs: ["prebuilt.so"],
7069 system_shared_libs: [],
7070 stl: "none",
7071 apex_available: [
7072 "myapex",
7073 "//apex_available:platform",
7074 ],
7075 }
7076 `)
7077
7078 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007079 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007080 var builder strings.Builder
7081 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7082 androidMk := builder.String()
7083 // `myotherlib` is added to `myapex` as symlink
7084 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
7085 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7086 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7087 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09007088 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 +08007089}
7090
Jooyung Han643adc42020-02-27 13:50:06 +09007091func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007092 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007093 apex {
7094 name: "myapex",
7095 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007096 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007097 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007098 }
7099
7100 apex_key {
7101 name: "myapex.key",
7102 public_key: "testkey.avbpubkey",
7103 private_key: "testkey.pem",
7104 }
7105
7106 cc_library {
7107 name: "mylib",
7108 srcs: ["mylib.cpp"],
7109 shared_libs: ["mylib2"],
7110 system_shared_libs: [],
7111 stl: "none",
7112 apex_available: [ "myapex" ],
7113 }
7114
7115 cc_library {
7116 name: "mylib2",
7117 srcs: ["mylib.cpp"],
7118 system_shared_libs: [],
7119 stl: "none",
7120 apex_available: [ "myapex" ],
7121 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007122
7123 rust_ffi_shared {
7124 name: "libfoo.rust",
7125 crate_name: "foo",
7126 srcs: ["foo.rs"],
7127 shared_libs: ["libfoo.shared_from_rust"],
7128 prefer_rlib: true,
7129 apex_available: ["myapex"],
7130 }
7131
7132 cc_library_shared {
7133 name: "libfoo.shared_from_rust",
7134 srcs: ["mylib.cpp"],
7135 system_shared_libs: [],
7136 stl: "none",
7137 stubs: {
7138 versions: ["10", "11", "12"],
7139 },
7140 }
7141
Jooyung Han643adc42020-02-27 13:50:06 +09007142 `)
7143
7144 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7145 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007146 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007147 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7148 "lib64/mylib.so",
7149 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007150 "lib64/libfoo.rust.so",
7151 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7152 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007153 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007154
7155 // b/220397949
7156 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007157}
7158
Jooyung Han49f67012020-04-17 13:43:10 +09007159func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007160 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007161 apex {
7162 name: "myapex",
7163 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007164 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007165 }
7166 apex_key {
7167 name: "myapex.key",
7168 public_key: "testkey.avbpubkey",
7169 private_key: "testkey.pem",
7170 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007171 `,
7172 android.FixtureModifyConfig(func(config android.Config) {
7173 delete(config.Targets, android.Android)
7174 config.AndroidCommonTarget = android.Target{}
7175 }),
7176 )
Jooyung Han49f67012020-04-17 13:43:10 +09007177
7178 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7179 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7180 }
7181}
7182
Jiyong Parkbd159612020-02-28 15:22:21 +09007183func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007184 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007185 apex {
7186 name: "myapex",
7187 key: "myapex.key",
7188 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007189 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007190 }
7191
7192 apex_key {
7193 name: "myapex.key",
7194 public_key: "testkey.avbpubkey",
7195 private_key: "testkey.pem",
7196 }
7197
7198 android_app {
7199 name: "AppFoo",
7200 srcs: ["foo/bar/MyClass.java"],
7201 sdk_version: "none",
7202 system_modules: "none",
7203 apex_available: [ "myapex" ],
7204 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007205 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007206
Colin Crosscf371cc2020-11-13 11:48:42 -08007207 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007208 content := bundleConfigRule.Args["content"]
7209
7210 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007211 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@TEST.BUILD_ID/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09007212}
7213
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007214func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007215 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007216 apex {
7217 name: "myapex",
7218 key: "myapex.key",
7219 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007220 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007221 }
7222
7223 apex_key {
7224 name: "myapex.key",
7225 public_key: "testkey.avbpubkey",
7226 private_key: "testkey.pem",
7227 }
7228
7229 android_app_set {
7230 name: "AppSet",
7231 set: "AppSet.apks",
7232 }`)
7233 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007234 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007235 content := bundleConfigRule.Args["content"]
7236 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7237 s := mod.Rule("apexRule").Args["copy_commands"]
7238 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
7239 if len(copyCmds) != 3 {
7240 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
7241 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007242 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7243 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
7244 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007245}
7246
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007247func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007248 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007249 apex_set {
7250 name: "myapex",
7251 filename: "foo_v2.apex",
7252 sanitized: {
7253 none: { set: "myapex.apks", },
7254 hwaddress: { set: "myapex.hwasan.apks", },
7255 },
Paul Duffin24704672021-04-06 16:09:30 +01007256 }
7257 `
7258 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007259
Paul Duffin24704672021-04-06 16:09:30 +01007260 // Check that the extractor produces the correct output file from the correct input file.
7261 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007262
Paul Duffin24704672021-04-06 16:09:30 +01007263 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7264 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007265
Paul Duffin24704672021-04-06 16:09:30 +01007266 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7267
7268 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007269 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7270 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007271
7272 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007273}
7274
Paul Duffin89f570a2021-06-16 01:42:33 +01007275func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007276 t.Helper()
7277
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007278 bp := `
7279 java_library {
7280 name: "some-updatable-apex-lib",
7281 srcs: ["a.java"],
7282 sdk_version: "current",
7283 apex_available: [
7284 "some-updatable-apex",
7285 ],
satayevabcd5972021-08-06 17:49:46 +01007286 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007287 }
7288
7289 java_library {
7290 name: "some-non-updatable-apex-lib",
7291 srcs: ["a.java"],
7292 apex_available: [
7293 "some-non-updatable-apex",
7294 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007295 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007296 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007297 }
7298
7299 bootclasspath_fragment {
7300 name: "some-non-updatable-fragment",
7301 contents: ["some-non-updatable-apex-lib"],
7302 apex_available: [
7303 "some-non-updatable-apex",
7304 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007305 hidden_api: {
7306 split_packages: ["*"],
7307 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007308 }
7309
7310 java_library {
7311 name: "some-platform-lib",
7312 srcs: ["a.java"],
7313 sdk_version: "current",
7314 installable: true,
7315 }
7316
7317 java_library {
7318 name: "some-art-lib",
7319 srcs: ["a.java"],
7320 sdk_version: "current",
7321 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007322 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007323 ],
7324 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007325 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007326 }
7327
7328 apex {
7329 name: "some-updatable-apex",
7330 key: "some-updatable-apex.key",
7331 java_libs: ["some-updatable-apex-lib"],
7332 updatable: true,
7333 min_sdk_version: "current",
7334 }
7335
7336 apex {
7337 name: "some-non-updatable-apex",
7338 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007339 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007340 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007341 }
7342
7343 apex_key {
7344 name: "some-updatable-apex.key",
7345 }
7346
7347 apex_key {
7348 name: "some-non-updatable-apex.key",
7349 }
7350
7351 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007352 name: "com.android.art.debug",
7353 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007354 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007355 updatable: true,
7356 min_sdk_version: "current",
7357 }
7358
Paul Duffinf23bc472021-04-27 12:42:20 +01007359 bootclasspath_fragment {
7360 name: "art-bootclasspath-fragment",
7361 image_name: "art",
7362 contents: ["some-art-lib"],
7363 apex_available: [
7364 "com.android.art.debug",
7365 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007366 hidden_api: {
7367 split_packages: ["*"],
7368 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007369 }
7370
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007371 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007372 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007373 }
7374
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007375 filegroup {
7376 name: "some-updatable-apex-file_contexts",
7377 srcs: [
7378 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7379 ],
7380 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007381
7382 filegroup {
7383 name: "some-non-updatable-apex-file_contexts",
7384 srcs: [
7385 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7386 ],
7387 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007388 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007389
Paul Duffin89f570a2021-06-16 01:42:33 +01007390 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007391}
7392
Paul Duffin89f570a2021-06-16 01:42:33 +01007393func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007394 t.Helper()
7395
Paul Duffin55607122021-03-30 23:32:51 +01007396 fs := android.MockFS{
7397 "a.java": nil,
7398 "a.jar": nil,
7399 "apex_manifest.json": nil,
7400 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007401 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007402 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7403 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7404 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007405 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007406 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007407
Paul Duffin55607122021-03-30 23:32:51 +01007408 errorHandler := android.FixtureExpectsNoErrors
7409 if errmsg != "" {
7410 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007411 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007412
Paul Duffin55607122021-03-30 23:32:51 +01007413 result := android.GroupFixturePreparers(
7414 cc.PrepareForTestWithCcDefaultModules,
7415 java.PrepareForTestWithHiddenApiBuildComponents,
7416 java.PrepareForTestWithJavaDefaultModules,
7417 java.PrepareForTestWithJavaSdkLibraryFiles,
7418 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007419 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007420 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007421 android.FixtureModifyMockFS(func(fs android.MockFS) {
7422 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7423 insert := ""
7424 for _, fragment := range fragments {
7425 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7426 }
7427 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7428 platform_bootclasspath {
7429 name: "platform-bootclasspath",
7430 fragments: [
7431 %s
7432 ],
7433 }
7434 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007435 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007436 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007437 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007438 ).
7439 ExtendWithErrorHandler(errorHandler).
7440 RunTestWithBp(t, bp)
7441
7442 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007443}
7444
Paul Duffin5556c5f2022-06-09 17:32:21 +00007445func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007446 preparers := android.GroupFixturePreparers(
7447 java.PrepareForTestWithJavaDefaultModules,
7448 PrepareForTestWithApexBuildComponents,
7449 ).
7450 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7451 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7452
7453 bpBase := `
7454 apex_set {
7455 name: "com.android.myapex",
7456 installable: true,
7457 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7458 set: "myapex.apks",
7459 }
7460
7461 apex_set {
7462 name: "com.mycompany.android.myapex",
7463 apex_name: "com.android.myapex",
7464 installable: true,
7465 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7466 set: "company-myapex.apks",
7467 }
7468
7469 prebuilt_bootclasspath_fragment {
7470 name: "my-bootclasspath-fragment",
7471 apex_available: ["com.android.myapex"],
7472 %s
7473 }
7474 `
7475
7476 t.Run("java_import", func(t *testing.T) {
7477 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7478 java_import {
7479 name: "libfoo",
7480 jars: ["libfoo.jar"],
7481 apex_available: ["com.android.myapex"],
7482 }
7483 `)
7484 })
7485
7486 t.Run("java_sdk_library_import", func(t *testing.T) {
7487 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7488 java_sdk_library_import {
7489 name: "libfoo",
7490 public: {
7491 jars: ["libbar.jar"],
7492 },
7493 apex_available: ["com.android.myapex"],
7494 }
7495 `)
7496 })
7497
7498 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7499 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7500 image_name: "art",
7501 contents: ["libfoo"],
7502 `)+`
7503 java_sdk_library_import {
7504 name: "libfoo",
7505 public: {
7506 jars: ["libbar.jar"],
7507 },
7508 apex_available: ["com.android.myapex"],
7509 }
7510 `)
7511 })
7512}
7513
Paul Duffin5556c5f2022-06-09 17:32:21 +00007514func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7515 preparers := android.GroupFixturePreparers(
7516 java.PrepareForTestWithJavaDefaultModules,
7517 PrepareForTestWithApexBuildComponents,
7518 )
7519
7520 bpBase := `
7521 apex_set {
7522 name: "com.android.myapex",
7523 installable: true,
7524 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7525 set: "myapex.apks",
7526 }
7527
7528 apex_set {
7529 name: "com.android.myapex_compressed",
7530 apex_name: "com.android.myapex",
7531 installable: true,
7532 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7533 set: "myapex_compressed.apks",
7534 }
7535
7536 prebuilt_bootclasspath_fragment {
7537 name: "my-bootclasspath-fragment",
7538 apex_available: [
7539 "com.android.myapex",
7540 "com.android.myapex_compressed",
7541 ],
7542 hidden_api: {
7543 annotation_flags: "annotation-flags.csv",
7544 metadata: "metadata.csv",
7545 index: "index.csv",
7546 signature_patterns: "signature_patterns.csv",
7547 },
7548 %s
7549 }
7550 `
7551
7552 t.Run("java_import", func(t *testing.T) {
7553 result := preparers.RunTestWithBp(t,
7554 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7555 java_import {
7556 name: "libfoo",
7557 jars: ["libfoo.jar"],
7558 apex_available: [
7559 "com.android.myapex",
7560 "com.android.myapex_compressed",
7561 ],
7562 }
7563 `)
7564
7565 module := result.Module("libfoo", "android_common_com.android.myapex")
7566 usesLibraryDep := module.(java.UsesLibraryDependency)
7567 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7568 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7569 usesLibraryDep.DexJarBuildPath().Path())
7570 })
7571
7572 t.Run("java_sdk_library_import", func(t *testing.T) {
7573 result := preparers.RunTestWithBp(t,
7574 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7575 java_sdk_library_import {
7576 name: "libfoo",
7577 public: {
7578 jars: ["libbar.jar"],
7579 },
7580 apex_available: [
7581 "com.android.myapex",
7582 "com.android.myapex_compressed",
7583 ],
7584 compile_dex: true,
7585 }
7586 `)
7587
7588 module := result.Module("libfoo", "android_common_com.android.myapex")
7589 usesLibraryDep := module.(java.UsesLibraryDependency)
7590 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7591 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7592 usesLibraryDep.DexJarBuildPath().Path())
7593 })
7594
7595 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7596 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7597 image_name: "art",
7598 contents: ["libfoo"],
7599 `)+`
7600 java_sdk_library_import {
7601 name: "libfoo",
7602 public: {
7603 jars: ["libbar.jar"],
7604 },
7605 apex_available: [
7606 "com.android.myapex",
7607 "com.android.myapex_compressed",
7608 ],
7609 compile_dex: true,
7610 }
7611 `)
7612 })
7613}
7614
Jooyung Han548640b2020-04-27 12:10:30 +09007615func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7616 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7617 apex {
7618 name: "myapex",
7619 key: "myapex.key",
7620 updatable: true,
7621 }
7622
7623 apex_key {
7624 name: "myapex.key",
7625 public_key: "testkey.avbpubkey",
7626 private_key: "testkey.pem",
7627 }
7628 `)
7629}
7630
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007631func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7632 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7633 apex {
7634 name: "myapex",
7635 key: "myapex.key",
7636 }
7637
7638 apex_key {
7639 name: "myapex.key",
7640 public_key: "testkey.avbpubkey",
7641 private_key: "testkey.pem",
7642 }
7643 `)
7644}
7645
Daniel Norman69109112021-12-02 12:52:42 -08007646func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7647 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7648 apex {
7649 name: "myapex",
7650 key: "myapex.key",
7651 updatable: true,
7652 soc_specific: true,
7653 }
7654
7655 apex_key {
7656 name: "myapex.key",
7657 public_key: "testkey.avbpubkey",
7658 private_key: "testkey.pem",
7659 }
7660 `)
7661}
7662
satayevb98371c2021-06-15 16:49:50 +01007663func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7664 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7665 apex {
7666 name: "myapex",
7667 key: "myapex.key",
7668 systemserverclasspath_fragments: [
7669 "mysystemserverclasspathfragment",
7670 ],
7671 min_sdk_version: "29",
7672 updatable: true,
7673 }
7674
7675 apex_key {
7676 name: "myapex.key",
7677 public_key: "testkey.avbpubkey",
7678 private_key: "testkey.pem",
7679 }
7680
7681 java_library {
7682 name: "foo",
7683 srcs: ["b.java"],
7684 min_sdk_version: "29",
7685 installable: true,
7686 apex_available: [
7687 "myapex",
7688 ],
7689 }
7690
7691 systemserverclasspath_fragment {
7692 name: "mysystemserverclasspathfragment",
7693 generate_classpaths_proto: false,
7694 contents: [
7695 "foo",
7696 ],
7697 apex_available: [
7698 "myapex",
7699 ],
7700 }
satayevabcd5972021-08-06 17:49:46 +01007701 `,
7702 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7703 )
satayevb98371c2021-06-15 16:49:50 +01007704}
7705
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007706func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007707 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7708 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7709 // modules to be included in the BootJars.
7710 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7711 return android.GroupFixturePreparers(
7712 dexpreopt.FixtureSetBootJars(bootJars...),
7713 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7714 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7715 }),
7716 )
7717 }
7718
7719 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7720 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7721 // specified in the ArtApexJars configuration.
7722 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7723 return android.GroupFixturePreparers(
7724 dexpreopt.FixtureSetArtBootJars(bootJars...),
7725 dexpreopt.FixtureSetBootJars(bootJars...),
7726 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7727 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7728 }),
7729 )
7730 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007731
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007732 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007733 preparer := android.GroupFixturePreparers(
7734 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7735 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7736 )
7737 fragments := []java.ApexVariantReference{
7738 {
7739 Apex: proptools.StringPtr("com.android.art.debug"),
7740 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7741 },
7742 {
7743 Apex: proptools.StringPtr("some-non-updatable-apex"),
7744 Module: proptools.StringPtr("some-non-updatable-fragment"),
7745 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007746 }
satayevabcd5972021-08-06 17:49:46 +01007747 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007748 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007749
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007750 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007751 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7752 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007753 preparer := android.GroupFixturePreparers(
7754 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7755 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7756 )
Paul Duffin60264a02021-04-12 20:02:36 +01007757 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007758 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007759
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007760 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 +01007761 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 +01007762 // Update the dexpreopt ArtApexJars directly.
7763 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7764 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007765 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007766
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007767 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 +01007768 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 +01007769 // Update the dexpreopt ArtApexJars directly.
7770 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7771 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007772 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007773
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007774 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 +01007775 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 +01007776 preparer := android.GroupFixturePreparers(
7777 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7778 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7779 )
Paul Duffin60264a02021-04-12 20:02:36 +01007780 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007781 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007782
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007783 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 +01007784 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007785 fragment := java.ApexVariantReference{
7786 Apex: proptools.StringPtr("some-non-updatable-apex"),
7787 Module: proptools.StringPtr("some-non-updatable-fragment"),
7788 }
7789 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007790 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007791
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007792 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007793 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007794 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7795 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007796 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007797
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007798 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007799 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007800 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7801 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007802 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007803
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007804 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007805 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007806 // Update the dexpreopt ArtApexJars directly.
7807 preparer := prepareSetArtJars("platform:some-platform-lib")
7808 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007809 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007810
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007811 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007812 preparer := android.GroupFixturePreparers(
7813 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7814 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7815 )
7816 fragments := []java.ApexVariantReference{
7817 {
7818 Apex: proptools.StringPtr("some-non-updatable-apex"),
7819 Module: proptools.StringPtr("some-non-updatable-fragment"),
7820 },
7821 }
7822 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007823 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007824}
7825
7826func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007827 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007828 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007829 fragment := java.ApexVariantReference{
7830 Apex: proptools.StringPtr("myapex"),
7831 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7832 }
7833
Paul Duffin064b70c2020-11-02 17:32:38 +00007834 testDexpreoptWithApexes(t, `
7835 prebuilt_apex {
7836 name: "myapex" ,
7837 arch: {
7838 arm64: {
7839 src: "myapex-arm64.apex",
7840 },
7841 arm: {
7842 src: "myapex-arm.apex",
7843 },
7844 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007845 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7846 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007847
Paul Duffin89f570a2021-06-16 01:42:33 +01007848 prebuilt_bootclasspath_fragment {
7849 name: "my-bootclasspath-fragment",
7850 contents: ["libfoo"],
7851 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007852 hidden_api: {
7853 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7854 metadata: "my-bootclasspath-fragment/metadata.csv",
7855 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007856 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7857 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7858 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007859 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007860 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007861
Paul Duffin89f570a2021-06-16 01:42:33 +01007862 java_import {
7863 name: "libfoo",
7864 jars: ["libfoo.jar"],
7865 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007866 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007867 }
7868 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007869 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007870}
7871
Spandan Dasf14e2542021-11-12 00:01:37 +00007872func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007873 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007874 bp += `
7875 apex_key {
7876 name: "myapex.key",
7877 public_key: "testkey.avbpubkey",
7878 private_key: "testkey.pem",
7879 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007880 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007881 "lib1/src/A.java": nil,
7882 "lib2/src/B.java": nil,
7883 "system/sepolicy/apex/myapex-file_contexts": nil,
7884 }
7885
Paul Duffin45338f02021-03-30 23:07:52 +01007886 errorHandler := android.FixtureExpectsNoErrors
7887 if errmsg != "" {
7888 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007889 }
Colin Crossae8600b2020-10-29 17:09:13 -07007890
Paul Duffin45338f02021-03-30 23:07:52 +01007891 android.GroupFixturePreparers(
7892 android.PrepareForTestWithAndroidBuildComponents,
7893 java.PrepareForTestWithJavaBuildComponents,
7894 PrepareForTestWithApexBuildComponents,
7895 android.PrepareForTestWithNeverallowRules(rules),
7896 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007897 apexBootJars := make([]string, 0, len(bootJars))
7898 for _, apexBootJar := range bootJars {
7899 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007900 }
satayevd604b212021-07-21 14:23:52 +01007901 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007902 }),
7903 fs.AddToFixture(),
7904 ).
7905 ExtendWithErrorHandler(errorHandler).
7906 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007907}
7908
7909func TestApexPermittedPackagesRules(t *testing.T) {
7910 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00007911 name string
7912 expectedError string
7913 bp string
7914 bootJars []string
7915 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01007916 }{
7917
7918 {
7919 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7920 expectedError: "",
7921 bp: `
7922 java_library {
7923 name: "bcp_lib1",
7924 srcs: ["lib1/src/*.java"],
7925 permitted_packages: ["foo.bar"],
7926 apex_available: ["myapex"],
7927 sdk_version: "none",
7928 system_modules: "none",
7929 }
7930 java_library {
7931 name: "nonbcp_lib2",
7932 srcs: ["lib2/src/*.java"],
7933 apex_available: ["myapex"],
7934 permitted_packages: ["a.b"],
7935 sdk_version: "none",
7936 system_modules: "none",
7937 }
7938 apex {
7939 name: "myapex",
7940 key: "myapex.key",
7941 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007942 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007943 }`,
7944 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007945 bcpPermittedPackages: map[string][]string{
7946 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007947 "foo.bar",
7948 },
7949 },
7950 },
7951 {
Anton Hanssone1b18362021-12-23 15:05:38 +00007952 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00007953 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 +01007954 bp: `
7955 java_library {
7956 name: "bcp_lib1",
7957 srcs: ["lib1/src/*.java"],
7958 apex_available: ["myapex"],
7959 permitted_packages: ["foo.bar"],
7960 sdk_version: "none",
7961 system_modules: "none",
7962 }
7963 java_library {
7964 name: "bcp_lib2",
7965 srcs: ["lib2/src/*.java"],
7966 apex_available: ["myapex"],
7967 permitted_packages: ["foo.bar", "bar.baz"],
7968 sdk_version: "none",
7969 system_modules: "none",
7970 }
7971 apex {
7972 name: "myapex",
7973 key: "myapex.key",
7974 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007975 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007976 }
7977 `,
7978 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007979 bcpPermittedPackages: map[string][]string{
7980 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007981 "foo.bar",
7982 },
Spandan Dasf14e2542021-11-12 00:01:37 +00007983 "bcp_lib2": []string{
7984 "foo.bar",
7985 },
7986 },
7987 },
7988 {
7989 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
7990 expectedError: "",
7991 bp: `
7992 java_library {
7993 name: "bcp_lib_restricted",
7994 srcs: ["lib1/src/*.java"],
7995 apex_available: ["myapex"],
7996 permitted_packages: ["foo.bar"],
7997 sdk_version: "none",
7998 min_sdk_version: "29",
7999 system_modules: "none",
8000 }
8001 java_library {
8002 name: "bcp_lib_unrestricted",
8003 srcs: ["lib2/src/*.java"],
8004 apex_available: ["myapex"],
8005 permitted_packages: ["foo.bar", "bar.baz"],
8006 sdk_version: "none",
8007 min_sdk_version: "29",
8008 system_modules: "none",
8009 }
8010 apex {
8011 name: "myapex",
8012 key: "myapex.key",
8013 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8014 updatable: true,
8015 min_sdk_version: "29",
8016 }
8017 `,
8018 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8019 bcpPermittedPackages: map[string][]string{
8020 "bcp_lib1_non_updateable": []string{
8021 "foo.bar",
8022 },
8023 // 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 +01008024 },
8025 },
8026 }
8027 for _, tc := range testcases {
8028 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008029 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8030 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008031 })
8032 }
8033}
8034
Jiyong Park62304bb2020-04-13 16:19:48 +09008035func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008036 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008037 apex {
8038 name: "myapex",
8039 key: "myapex.key",
8040 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008041 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008042 }
8043
8044 apex_key {
8045 name: "myapex.key",
8046 public_key: "testkey.avbpubkey",
8047 private_key: "testkey.pem",
8048 }
8049
8050 cc_library {
8051 name: "mylib",
8052 srcs: ["mylib.cpp"],
8053 system_shared_libs: [],
8054 stl: "none",
8055 stubs: {
8056 versions: ["1"],
8057 },
8058 apex_available: ["myapex"],
8059 }
8060
8061 cc_library {
8062 name: "myprivlib",
8063 srcs: ["mylib.cpp"],
8064 system_shared_libs: [],
8065 stl: "none",
8066 apex_available: ["myapex"],
8067 }
8068
8069
8070 cc_test {
8071 name: "mytest",
8072 gtest: false,
8073 srcs: ["mylib.cpp"],
8074 system_shared_libs: [],
8075 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008076 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008077 test_for: ["myapex"]
8078 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008079
8080 cc_library {
8081 name: "mytestlib",
8082 srcs: ["mylib.cpp"],
8083 system_shared_libs: [],
8084 shared_libs: ["mylib", "myprivlib"],
8085 stl: "none",
8086 test_for: ["myapex"],
8087 }
8088
8089 cc_benchmark {
8090 name: "mybench",
8091 srcs: ["mylib.cpp"],
8092 system_shared_libs: [],
8093 shared_libs: ["mylib", "myprivlib"],
8094 stl: "none",
8095 test_for: ["myapex"],
8096 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008097 `)
8098
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008099 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008100 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008101 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8102 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8103 }
8104
8105 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008106 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008107 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8108 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8109 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8110}
Jiyong Park46a512f2020-12-04 18:02:13 +09008111
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008112func TestIndirectTestFor(t *testing.T) {
8113 ctx := testApex(t, `
8114 apex {
8115 name: "myapex",
8116 key: "myapex.key",
8117 native_shared_libs: ["mylib", "myprivlib"],
8118 updatable: false,
8119 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008120
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008121 apex_key {
8122 name: "myapex.key",
8123 public_key: "testkey.avbpubkey",
8124 private_key: "testkey.pem",
8125 }
8126
8127 cc_library {
8128 name: "mylib",
8129 srcs: ["mylib.cpp"],
8130 system_shared_libs: [],
8131 stl: "none",
8132 stubs: {
8133 versions: ["1"],
8134 },
8135 apex_available: ["myapex"],
8136 }
8137
8138 cc_library {
8139 name: "myprivlib",
8140 srcs: ["mylib.cpp"],
8141 system_shared_libs: [],
8142 stl: "none",
8143 shared_libs: ["mylib"],
8144 apex_available: ["myapex"],
8145 }
8146
8147 cc_library {
8148 name: "mytestlib",
8149 srcs: ["mylib.cpp"],
8150 system_shared_libs: [],
8151 shared_libs: ["myprivlib"],
8152 stl: "none",
8153 test_for: ["myapex"],
8154 }
8155 `)
8156
8157 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008158 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008159 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8160 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8161 }
8162
8163 // The platform variant of mytestlib links to the platform variant of the
8164 // internal myprivlib.
8165 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8166
8167 // The platform variant of myprivlib links to the platform variant of mylib
8168 // and bypasses its stubs.
8169 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 +09008170}
8171
Martin Stjernholmec009002021-03-27 15:18:31 +00008172func TestTestForForLibInOtherApex(t *testing.T) {
8173 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8174 _ = testApex(t, `
8175 apex {
8176 name: "com.android.art",
8177 key: "myapex.key",
8178 native_shared_libs: ["mylib"],
8179 updatable: false,
8180 }
8181
8182 apex {
8183 name: "com.android.art.debug",
8184 key: "myapex.key",
8185 native_shared_libs: ["mylib", "mytestlib"],
8186 updatable: false,
8187 }
8188
8189 apex_key {
8190 name: "myapex.key",
8191 public_key: "testkey.avbpubkey",
8192 private_key: "testkey.pem",
8193 }
8194
8195 cc_library {
8196 name: "mylib",
8197 srcs: ["mylib.cpp"],
8198 system_shared_libs: [],
8199 stl: "none",
8200 stubs: {
8201 versions: ["1"],
8202 },
8203 apex_available: ["com.android.art", "com.android.art.debug"],
8204 }
8205
8206 cc_library {
8207 name: "mytestlib",
8208 srcs: ["mylib.cpp"],
8209 system_shared_libs: [],
8210 shared_libs: ["mylib"],
8211 stl: "none",
8212 apex_available: ["com.android.art.debug"],
8213 test_for: ["com.android.art"],
8214 }
8215 `,
8216 android.MockFS{
8217 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8218 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8219 }.AddToFixture())
8220}
8221
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008222// TODO(jungjw): Move this to proptools
8223func intPtr(i int) *int {
8224 return &i
8225}
8226
8227func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008228 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008229 apex_set {
8230 name: "myapex",
8231 set: "myapex.apks",
8232 filename: "foo_v2.apex",
8233 overrides: ["foo"],
8234 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008235 `,
8236 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8237 variables.Platform_sdk_version = intPtr(30)
8238 }),
8239 android.FixtureModifyConfig(func(config android.Config) {
8240 config.Targets[android.Android] = []android.Target{
8241 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8242 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8243 }
8244 }),
8245 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008246
Paul Duffin24704672021-04-06 16:09:30 +01008247 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008248
8249 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008250 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008251 actual := extractedApex.Args["abis"]
8252 expected := "ARMEABI_V7A,ARM64_V8A"
8253 if actual != expected {
8254 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8255 }
8256 actual = extractedApex.Args["sdk-version"]
8257 expected = "30"
8258 if actual != expected {
8259 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8260 }
8261
Paul Duffin6717d882021-06-15 19:09:41 +01008262 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008263 a := m.Module().(*ApexSet)
8264 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008265 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008266 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8267 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8268 }
8269}
8270
Jiyong Park7d95a512020-05-10 15:16:24 +09008271func TestNoStaticLinkingToStubsLib(t *testing.T) {
8272 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8273 apex {
8274 name: "myapex",
8275 key: "myapex.key",
8276 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008277 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008278 }
8279
8280 apex_key {
8281 name: "myapex.key",
8282 public_key: "testkey.avbpubkey",
8283 private_key: "testkey.pem",
8284 }
8285
8286 cc_library {
8287 name: "mylib",
8288 srcs: ["mylib.cpp"],
8289 static_libs: ["otherlib"],
8290 system_shared_libs: [],
8291 stl: "none",
8292 apex_available: [ "myapex" ],
8293 }
8294
8295 cc_library {
8296 name: "otherlib",
8297 srcs: ["mylib.cpp"],
8298 system_shared_libs: [],
8299 stl: "none",
8300 stubs: {
8301 versions: ["1", "2", "3"],
8302 },
8303 apex_available: [ "myapex" ],
8304 }
8305 `)
8306}
8307
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008308func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008309 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008310 apex {
8311 name: "myapex",
8312 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008313 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008314 custom_sign_tool: "sign_myapex",
8315 }
8316
8317 apex_key {
8318 name: "myapex.key",
8319 public_key: "testkey.avbpubkey",
8320 private_key: "testkey.pem",
8321 }
8322 `)
8323
8324 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8325 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8326 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"`)
8327}
8328
8329func TestApexKeysTxtOverrides(t *testing.T) {
8330 ctx := testApex(t, `
8331 apex {
8332 name: "myapex",
8333 key: "myapex.key",
8334 updatable: false,
8335 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008336 }
8337
8338 apex_key {
8339 name: "myapex.key",
8340 public_key: "testkey.avbpubkey",
8341 private_key: "testkey.pem",
8342 }
8343
8344 prebuilt_apex {
8345 name: "myapex",
8346 prefer: true,
8347 arch: {
8348 arm64: {
8349 src: "myapex-arm64.apex",
8350 },
8351 arm: {
8352 src: "myapex-arm.apex",
8353 },
8354 },
8355 }
8356
8357 apex_set {
8358 name: "myapex_set",
8359 set: "myapex.apks",
8360 filename: "myapex_set.apex",
8361 overrides: ["myapex"],
8362 }
8363 `)
8364
8365 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8366 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8367 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 +09008368 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 +09008369}
8370
Jooyung Han938b5932020-06-20 12:47:47 +09008371func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008372 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008373 apex {
8374 name: "myapex",
8375 key: "myapex.key",
8376 apps: ["app"],
8377 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008378 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008379 }
8380
8381 apex_key {
8382 name: "myapex.key",
8383 public_key: "testkey.avbpubkey",
8384 private_key: "testkey.pem",
8385 }
8386
8387 android_app {
8388 name: "app",
8389 srcs: ["foo/bar/MyClass.java"],
8390 package_name: "foo",
8391 sdk_version: "none",
8392 system_modules: "none",
8393 apex_available: [ "myapex" ],
8394 }
8395 `, withFiles(map[string][]byte{
8396 "sub/Android.bp": []byte(`
8397 override_apex {
8398 name: "override_myapex",
8399 base: "myapex",
8400 apps: ["override_app"],
8401 allowed_files: ":allowed",
8402 }
8403 // Overridable "path" property should be referenced indirectly
8404 filegroup {
8405 name: "allowed",
8406 srcs: ["allowed.txt"],
8407 }
8408 override_android_app {
8409 name: "override_app",
8410 base: "app",
8411 package_name: "bar",
8412 }
8413 `),
8414 }))
8415
8416 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8417 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8418 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8419 }
8420
8421 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8422 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8423 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8424 }
8425}
8426
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008427func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008428 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008429 apex {
8430 name: "myapex",
8431 key: "myapex.key",
8432 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008433 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008434 }
8435
8436 apex_key {
8437 name: "myapex.key",
8438 public_key: "testkey.avbpubkey",
8439 private_key: "testkey.pem",
8440 }
8441
8442 cc_library {
8443 name: "mylib",
8444 srcs: ["mylib.cpp"],
8445 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008446 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008447 },
8448 apex_available: ["myapex"],
8449 }
8450
8451 cc_prebuilt_library_shared {
8452 name: "mylib",
8453 prefer: false,
8454 srcs: ["prebuilt.so"],
8455 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008456 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008457 },
8458 apex_available: ["myapex"],
8459 }
8460 `)
8461}
8462
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008463func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008464 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008465 apex {
8466 name: "myapex",
8467 key: "myapex.key",
8468 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008469 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008470 }
8471 apex_key {
8472 name: "myapex.key",
8473 public_key: "testkey.avbpubkey",
8474 private_key: "testkey.pem",
8475 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008476 `,
8477 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8478 variables.CompressedApex = proptools.BoolPtr(true)
8479 }),
8480 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008481
8482 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8483 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8484
8485 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8486 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8487
8488 // Make sure output of bundle is .capex
8489 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8490 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8491
8492 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008493 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008494 var builder strings.Builder
8495 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8496 androidMk := builder.String()
8497 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8498}
8499
Martin Stjernholm2856c662020-12-02 15:03:42 +00008500func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008501 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008502 apex {
8503 name: "myapex",
8504 key: "myapex.key",
8505 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008506 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008507 }
8508
8509 apex_key {
8510 name: "myapex.key",
8511 public_key: "testkey.avbpubkey",
8512 private_key: "testkey.pem",
8513 }
8514
8515 cc_library {
8516 name: "mylib",
8517 srcs: ["mylib.cpp"],
8518 apex_available: ["myapex"],
8519 shared_libs: ["otherlib"],
8520 system_shared_libs: [],
8521 }
8522
8523 cc_library {
8524 name: "otherlib",
8525 srcs: ["mylib.cpp"],
8526 stubs: {
8527 versions: ["current"],
8528 },
8529 }
8530
8531 cc_prebuilt_library_shared {
8532 name: "otherlib",
8533 prefer: true,
8534 srcs: ["prebuilt.so"],
8535 stubs: {
8536 versions: ["current"],
8537 },
8538 }
8539 `)
8540
8541 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008542 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008543 var builder strings.Builder
8544 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8545 androidMk := builder.String()
8546
8547 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8548 // a thing there.
8549 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8550}
8551
Jiyong Parke3867542020-12-03 17:28:25 +09008552func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008553 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008554 apex {
8555 name: "myapex",
8556 key: "myapex.key",
8557 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008558 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008559 }
8560
8561 apex_key {
8562 name: "myapex.key",
8563 public_key: "testkey.avbpubkey",
8564 private_key: "testkey.pem",
8565 }
8566
8567 cc_library {
8568 name: "mylib",
8569 srcs: ["mylib.cpp"],
8570 system_shared_libs: [],
8571 stl: "none",
8572 apex_available: ["myapex"],
8573 shared_libs: ["mylib2"],
8574 target: {
8575 apex: {
8576 exclude_shared_libs: ["mylib2"],
8577 },
8578 },
8579 }
8580
8581 cc_library {
8582 name: "mylib2",
8583 srcs: ["mylib.cpp"],
8584 system_shared_libs: [],
8585 stl: "none",
8586 }
8587 `)
8588
8589 // Check if mylib is linked to mylib2 for the non-apex target
8590 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8591 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8592
8593 // Make sure that the link doesn't occur for the apex target
8594 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8595 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8596
8597 // It shouldn't appear in the copy cmd as well.
8598 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8599 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8600}
8601
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008602func TestPrebuiltStubLibDep(t *testing.T) {
8603 bpBase := `
8604 apex {
8605 name: "myapex",
8606 key: "myapex.key",
8607 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008608 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008609 }
8610 apex_key {
8611 name: "myapex.key",
8612 public_key: "testkey.avbpubkey",
8613 private_key: "testkey.pem",
8614 }
8615 cc_library {
8616 name: "mylib",
8617 srcs: ["mylib.cpp"],
8618 apex_available: ["myapex"],
8619 shared_libs: ["stublib"],
8620 system_shared_libs: [],
8621 }
8622 apex {
8623 name: "otherapex",
8624 enabled: %s,
8625 key: "myapex.key",
8626 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008627 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008628 }
8629 `
8630
8631 stublibSourceBp := `
8632 cc_library {
8633 name: "stublib",
8634 srcs: ["mylib.cpp"],
8635 apex_available: ["otherapex"],
8636 system_shared_libs: [],
8637 stl: "none",
8638 stubs: {
8639 versions: ["1"],
8640 },
8641 }
8642 `
8643
8644 stublibPrebuiltBp := `
8645 cc_prebuilt_library_shared {
8646 name: "stublib",
8647 srcs: ["prebuilt.so"],
8648 apex_available: ["otherapex"],
8649 stubs: {
8650 versions: ["1"],
8651 },
8652 %s
8653 }
8654 `
8655
8656 tests := []struct {
8657 name string
8658 stublibBp string
8659 usePrebuilt bool
8660 modNames []string // Modules to collect AndroidMkEntries for
8661 otherApexEnabled []string
8662 }{
8663 {
8664 name: "only_source",
8665 stublibBp: stublibSourceBp,
8666 usePrebuilt: false,
8667 modNames: []string{"stublib"},
8668 otherApexEnabled: []string{"true", "false"},
8669 },
8670 {
8671 name: "source_preferred",
8672 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8673 usePrebuilt: false,
8674 modNames: []string{"stublib", "prebuilt_stublib"},
8675 otherApexEnabled: []string{"true", "false"},
8676 },
8677 {
8678 name: "prebuilt_preferred",
8679 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8680 usePrebuilt: true,
8681 modNames: []string{"stublib", "prebuilt_stublib"},
8682 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8683 },
8684 {
8685 name: "only_prebuilt",
8686 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8687 usePrebuilt: true,
8688 modNames: []string{"stublib"},
8689 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8690 },
8691 }
8692
8693 for _, test := range tests {
8694 t.Run(test.name, func(t *testing.T) {
8695 for _, otherApexEnabled := range test.otherApexEnabled {
8696 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008697 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008698
8699 type modAndMkEntries struct {
8700 mod *cc.Module
8701 mkEntries android.AndroidMkEntries
8702 }
8703 entries := []*modAndMkEntries{}
8704
8705 // Gather shared lib modules that are installable
8706 for _, modName := range test.modNames {
8707 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8708 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8709 continue
8710 }
8711 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008712 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008713 continue
8714 }
Colin Crossaa255532020-07-03 13:18:24 -07008715 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008716 if ent.Disabled {
8717 continue
8718 }
8719 entries = append(entries, &modAndMkEntries{
8720 mod: mod,
8721 mkEntries: ent,
8722 })
8723 }
8724 }
8725 }
8726
8727 var entry *modAndMkEntries = nil
8728 for _, ent := range entries {
8729 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8730 if entry != nil {
8731 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8732 } else {
8733 entry = ent
8734 }
8735 }
8736 }
8737
8738 if entry == nil {
8739 t.Errorf("AndroidMk entry for \"stublib\" missing")
8740 } else {
8741 isPrebuilt := entry.mod.Prebuilt() != nil
8742 if isPrebuilt != test.usePrebuilt {
8743 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8744 }
8745 if !entry.mod.IsStubs() {
8746 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8747 }
8748 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8749 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8750 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008751 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008752 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008753 if !android.InList(expected, cflags) {
8754 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8755 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008756 }
8757 })
8758 }
8759 })
8760 }
8761}
8762
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008763func TestHostApexInHostOnlyBuild(t *testing.T) {
8764 testApex(t, `
8765 apex {
8766 name: "myapex",
8767 host_supported: true,
8768 key: "myapex.key",
8769 updatable: false,
8770 payload_type: "zip",
8771 }
8772 apex_key {
8773 name: "myapex.key",
8774 public_key: "testkey.avbpubkey",
8775 private_key: "testkey.pem",
8776 }
8777 `,
8778 android.FixtureModifyConfig(func(config android.Config) {
8779 // We may not have device targets in all builds, e.g. in
8780 // prebuilts/build-tools/build-prebuilts.sh
8781 config.Targets[android.Android] = []android.Target{}
8782 }))
8783}
8784
Colin Crossc33e5212021-05-25 18:16:02 -07008785func TestApexJavaCoverage(t *testing.T) {
8786 bp := `
8787 apex {
8788 name: "myapex",
8789 key: "myapex.key",
8790 java_libs: ["mylib"],
8791 bootclasspath_fragments: ["mybootclasspathfragment"],
8792 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8793 updatable: false,
8794 }
8795
8796 apex_key {
8797 name: "myapex.key",
8798 public_key: "testkey.avbpubkey",
8799 private_key: "testkey.pem",
8800 }
8801
8802 java_library {
8803 name: "mylib",
8804 srcs: ["mylib.java"],
8805 apex_available: ["myapex"],
8806 compile_dex: true,
8807 }
8808
8809 bootclasspath_fragment {
8810 name: "mybootclasspathfragment",
8811 contents: ["mybootclasspathlib"],
8812 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01008813 hidden_api: {
8814 split_packages: ["*"],
8815 },
Colin Crossc33e5212021-05-25 18:16:02 -07008816 }
8817
8818 java_library {
8819 name: "mybootclasspathlib",
8820 srcs: ["mybootclasspathlib.java"],
8821 apex_available: ["myapex"],
8822 compile_dex: true,
8823 }
8824
8825 systemserverclasspath_fragment {
8826 name: "mysystemserverclasspathfragment",
8827 contents: ["mysystemserverclasspathlib"],
8828 apex_available: ["myapex"],
8829 }
8830
8831 java_library {
8832 name: "mysystemserverclasspathlib",
8833 srcs: ["mysystemserverclasspathlib.java"],
8834 apex_available: ["myapex"],
8835 compile_dex: true,
8836 }
8837 `
8838
8839 result := android.GroupFixturePreparers(
8840 PrepareForTestWithApexBuildComponents,
8841 prepareForTestWithMyapex,
8842 java.PrepareForTestWithJavaDefaultModules,
8843 android.PrepareForTestWithAndroidBuildComponents,
8844 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008845 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8846 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008847 android.FixtureMergeEnv(map[string]string{
8848 "EMMA_INSTRUMENT": "true",
8849 }),
8850 ).RunTest(t)
8851
8852 // Make sure jacoco ran on both mylib and mybootclasspathlib
8853 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8854 t.Errorf("Failed to find jacoco rule for mylib")
8855 }
8856 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8857 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8858 }
8859 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8860 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8861 }
8862}
8863
Jiyong Park192600a2021-08-03 07:52:17 +00008864func TestProhibitStaticExecutable(t *testing.T) {
8865 testApexError(t, `executable mybin is static`, `
8866 apex {
8867 name: "myapex",
8868 key: "myapex.key",
8869 binaries: ["mybin"],
8870 min_sdk_version: "29",
8871 }
8872
8873 apex_key {
8874 name: "myapex.key",
8875 public_key: "testkey.avbpubkey",
8876 private_key: "testkey.pem",
8877 }
8878
8879 cc_binary {
8880 name: "mybin",
8881 srcs: ["mylib.cpp"],
8882 relative_install_path: "foo/bar",
8883 static_executable: true,
8884 system_shared_libs: [],
8885 stl: "none",
8886 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008887 min_sdk_version: "29",
8888 }
8889 `)
8890
8891 testApexError(t, `executable mybin.rust is static`, `
8892 apex {
8893 name: "myapex",
8894 key: "myapex.key",
8895 binaries: ["mybin.rust"],
8896 min_sdk_version: "29",
8897 }
8898
8899 apex_key {
8900 name: "myapex.key",
8901 public_key: "testkey.avbpubkey",
8902 private_key: "testkey.pem",
8903 }
8904
8905 rust_binary {
8906 name: "mybin.rust",
8907 srcs: ["foo.rs"],
8908 static_executable: true,
8909 apex_available: ["myapex"],
8910 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008911 }
8912 `)
8913}
8914
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008915func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8916 ctx := testApex(t, `
8917 apex {
8918 name: "myapex",
8919 key: "myapex.key",
8920 updatable: false,
8921 java_libs: ["foo"],
8922 }
8923
8924 apex_key {
8925 name: "myapex.key",
8926 public_key: "testkey.avbpubkey",
8927 private_key: "testkey.pem",
8928 }
8929
8930 java_library {
8931 name: "foo",
8932 srcs: ["foo.java"],
8933 apex_available: ["myapex"],
8934 installable: true,
8935 }
8936 `,
8937 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8938 )
8939
8940 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8941 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8942 var builder strings.Builder
8943 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8944 androidMk := builder.String()
8945 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")
8946}
8947
8948func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8949 ctx := testApex(t, `
8950 prebuilt_apex {
8951 name: "myapex",
8952 arch: {
8953 arm64: {
8954 src: "myapex-arm64.apex",
8955 },
8956 arm: {
8957 src: "myapex-arm.apex",
8958 },
8959 },
8960 exported_java_libs: ["foo"],
8961 }
8962
8963 java_import {
8964 name: "foo",
8965 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008966 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008967 }
8968 `,
8969 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8970 )
8971
8972 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8973 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8974 mainModuleEntries := entriesList[0]
8975 android.AssertArrayString(t,
8976 "LOCAL_REQUIRED_MODULES",
8977 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8978 []string{
8979 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8980 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8981 })
8982}
8983
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008984func TestAndroidMk_RequiredModules(t *testing.T) {
8985 ctx := testApex(t, `
8986 apex {
8987 name: "myapex",
8988 key: "myapex.key",
8989 updatable: false,
8990 java_libs: ["foo"],
8991 required: ["otherapex"],
8992 }
8993
8994 apex {
8995 name: "otherapex",
8996 key: "myapex.key",
8997 updatable: false,
8998 java_libs: ["foo"],
8999 required: ["otherapex"],
9000 }
9001
9002 apex_key {
9003 name: "myapex.key",
9004 public_key: "testkey.avbpubkey",
9005 private_key: "testkey.pem",
9006 }
9007
9008 java_library {
9009 name: "foo",
9010 srcs: ["foo.java"],
9011 apex_available: ["myapex", "otherapex"],
9012 installable: true,
9013 }
9014 `)
9015
9016 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9017 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9018 var builder strings.Builder
9019 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9020 androidMk := builder.String()
9021 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
9022}
9023
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009024func TestAndroidMk_RequiredDeps(t *testing.T) {
9025 ctx := testApex(t, `
9026 apex {
9027 name: "myapex",
9028 key: "myapex.key",
9029 updatable: false,
9030 }
9031
9032 apex_key {
9033 name: "myapex.key",
9034 public_key: "testkey.avbpubkey",
9035 private_key: "testkey.pem",
9036 }
9037 `)
9038
9039 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9040 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9041 data := android.AndroidMkDataForTest(t, ctx, bundle)
9042 var builder strings.Builder
9043 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9044 androidMk := builder.String()
9045 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
9046
9047 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9048 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9049 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9050 var flattenedBuilder strings.Builder
9051 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9052 flattenedAndroidMk := flattenedBuilder.String()
9053 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
9054}
9055
Jooyung Hana6d36672022-02-24 13:58:07 +09009056func TestApexOutputFileProducer(t *testing.T) {
9057 for _, tc := range []struct {
9058 name string
9059 ref string
9060 expected_data []string
9061 }{
9062 {
9063 name: "test_using_output",
9064 ref: ":myapex",
9065 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9066 },
9067 {
9068 name: "test_using_apex",
9069 ref: ":myapex{.apex}",
9070 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9071 },
9072 } {
9073 t.Run(tc.name, func(t *testing.T) {
9074 ctx := testApex(t, `
9075 apex {
9076 name: "myapex",
9077 key: "myapex.key",
9078 compressible: true,
9079 updatable: false,
9080 }
9081
9082 apex_key {
9083 name: "myapex.key",
9084 public_key: "testkey.avbpubkey",
9085 private_key: "testkey.pem",
9086 }
9087
9088 java_test {
9089 name: "`+tc.name+`",
9090 srcs: ["a.java"],
9091 data: ["`+tc.ref+`"],
9092 }
9093 `,
9094 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9095 variables.CompressedApex = proptools.BoolPtr(true)
9096 }))
9097 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9098 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9099 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9100 })
9101 }
9102}
9103
satayev758968a2021-12-06 11:42:40 +00009104func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9105 preparer := android.GroupFixturePreparers(
9106 PrepareForTestWithApexBuildComponents,
9107 prepareForTestWithMyapex,
9108 java.PrepareForTestWithJavaSdkLibraryFiles,
9109 java.PrepareForTestWithJavaDefaultModules,
9110 android.PrepareForTestWithAndroidBuildComponents,
9111 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9112 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9113 )
9114
9115 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9116 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9117 preparer.RunTestWithBp(t, `
9118 apex {
9119 name: "myapex",
9120 key: "myapex.key",
9121 bootclasspath_fragments: ["mybootclasspathfragment"],
9122 min_sdk_version: "30",
9123 updatable: false,
9124 }
9125
9126 apex_key {
9127 name: "myapex.key",
9128 public_key: "testkey.avbpubkey",
9129 private_key: "testkey.pem",
9130 }
9131
9132 bootclasspath_fragment {
9133 name: "mybootclasspathfragment",
9134 contents: ["mybootclasspathlib"],
9135 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009136 hidden_api: {
9137 split_packages: ["*"],
9138 },
satayev758968a2021-12-06 11:42:40 +00009139 }
9140
9141 java_sdk_library {
9142 name: "mybootclasspathlib",
9143 srcs: ["mybootclasspathlib.java"],
9144 apex_available: ["myapex"],
9145 compile_dex: true,
9146 unsafe_ignore_missing_latest_api: true,
9147 min_sdk_version: "31",
9148 static_libs: ["util"],
9149 }
9150
9151 java_library {
9152 name: "util",
9153 srcs: ["a.java"],
9154 apex_available: ["myapex"],
9155 min_sdk_version: "31",
9156 static_libs: ["another_util"],
9157 }
9158
9159 java_library {
9160 name: "another_util",
9161 srcs: ["a.java"],
9162 min_sdk_version: "31",
9163 apex_available: ["myapex"],
9164 }
9165 `)
9166 })
9167
9168 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9169 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9170 preparer.RunTestWithBp(t, `
9171 apex {
9172 name: "myapex",
9173 key: "myapex.key",
9174 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9175 min_sdk_version: "30",
9176 updatable: false,
9177 }
9178
9179 apex_key {
9180 name: "myapex.key",
9181 public_key: "testkey.avbpubkey",
9182 private_key: "testkey.pem",
9183 }
9184
9185 systemserverclasspath_fragment {
9186 name: "mysystemserverclasspathfragment",
9187 contents: ["mysystemserverclasspathlib"],
9188 apex_available: ["myapex"],
9189 }
9190
9191 java_sdk_library {
9192 name: "mysystemserverclasspathlib",
9193 srcs: ["mysystemserverclasspathlib.java"],
9194 apex_available: ["myapex"],
9195 compile_dex: true,
9196 min_sdk_version: "32",
9197 unsafe_ignore_missing_latest_api: true,
9198 static_libs: ["util"],
9199 }
9200
9201 java_library {
9202 name: "util",
9203 srcs: ["a.java"],
9204 apex_available: ["myapex"],
9205 min_sdk_version: "31",
9206 static_libs: ["another_util"],
9207 }
9208
9209 java_library {
9210 name: "another_util",
9211 srcs: ["a.java"],
9212 min_sdk_version: "31",
9213 apex_available: ["myapex"],
9214 }
9215 `)
9216 })
9217
9218 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9219 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9220 RunTestWithBp(t, `
9221 apex {
9222 name: "myapex",
9223 key: "myapex.key",
9224 bootclasspath_fragments: ["mybootclasspathfragment"],
9225 min_sdk_version: "30",
9226 updatable: false,
9227 }
9228
9229 apex_key {
9230 name: "myapex.key",
9231 public_key: "testkey.avbpubkey",
9232 private_key: "testkey.pem",
9233 }
9234
9235 bootclasspath_fragment {
9236 name: "mybootclasspathfragment",
9237 contents: ["mybootclasspathlib"],
9238 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009239 hidden_api: {
9240 split_packages: ["*"],
9241 },
satayev758968a2021-12-06 11:42:40 +00009242 }
9243
9244 java_sdk_library {
9245 name: "mybootclasspathlib",
9246 srcs: ["mybootclasspathlib.java"],
9247 apex_available: ["myapex"],
9248 compile_dex: true,
9249 unsafe_ignore_missing_latest_api: true,
9250 }
9251 `)
9252 })
9253
9254 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9255 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9256 RunTestWithBp(t, `
9257 apex {
9258 name: "myapex",
9259 key: "myapex.key",
9260 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9261 min_sdk_version: "30",
9262 updatable: false,
9263 }
9264
9265 apex_key {
9266 name: "myapex.key",
9267 public_key: "testkey.avbpubkey",
9268 private_key: "testkey.pem",
9269 }
9270
9271 systemserverclasspath_fragment {
9272 name: "mysystemserverclasspathfragment",
9273 contents: ["mysystemserverclasspathlib"],
9274 apex_available: ["myapex"],
9275 }
9276
9277 java_sdk_library {
9278 name: "mysystemserverclasspathlib",
9279 srcs: ["mysystemserverclasspathlib.java"],
9280 apex_available: ["myapex"],
9281 compile_dex: true,
9282 unsafe_ignore_missing_latest_api: true,
9283 }
9284 `)
9285 })
9286}
9287
Jiakai Zhang6decef92022-01-12 17:56:19 +00009288// Verifies that the APEX depends on all the Make modules in the list.
9289func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9290 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9291 for _, dep := range deps {
9292 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9293 }
9294}
9295
9296// Verifies that the APEX does not depend on any of the Make modules in the list.
9297func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9298 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9299 for _, dep := range deps {
9300 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9301 }
9302}
9303
Spandan Das66773252022-01-15 00:23:18 +00009304func TestApexStrictUpdtabilityLint(t *testing.T) {
9305 bpTemplate := `
9306 apex {
9307 name: "myapex",
9308 key: "myapex.key",
9309 java_libs: ["myjavalib"],
9310 updatable: %v,
9311 min_sdk_version: "29",
9312 }
9313 apex_key {
9314 name: "myapex.key",
9315 }
9316 java_library {
9317 name: "myjavalib",
9318 srcs: ["MyClass.java"],
9319 apex_available: [ "myapex" ],
9320 lint: {
9321 strict_updatability_linting: %v,
9322 },
9323 sdk_version: "current",
9324 min_sdk_version: "29",
9325 }
9326 `
9327 fs := android.MockFS{
9328 "lint-baseline.xml": nil,
9329 }
9330
9331 testCases := []struct {
9332 testCaseName string
9333 apexUpdatable bool
9334 javaStrictUpdtabilityLint bool
9335 lintFileExists bool
9336 disallowedFlagExpected bool
9337 }{
9338 {
9339 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9340 apexUpdatable: true,
9341 javaStrictUpdtabilityLint: true,
9342 lintFileExists: false,
9343 disallowedFlagExpected: false,
9344 },
9345 {
9346 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9347 apexUpdatable: false,
9348 javaStrictUpdtabilityLint: false,
9349 lintFileExists: true,
9350 disallowedFlagExpected: false,
9351 },
9352 {
9353 testCaseName: "non-updatable apex respects strict updatability of javalib",
9354 apexUpdatable: false,
9355 javaStrictUpdtabilityLint: true,
9356 lintFileExists: true,
9357 disallowedFlagExpected: true,
9358 },
9359 {
9360 testCaseName: "updatable apex sets strict updatability of javalib to true",
9361 apexUpdatable: true,
9362 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9363 lintFileExists: true,
9364 disallowedFlagExpected: true,
9365 },
9366 }
9367
9368 for _, testCase := range testCases {
9369 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9370 fixtures := []android.FixturePreparer{}
9371 if testCase.lintFileExists {
9372 fixtures = append(fixtures, fs.AddToFixture())
9373 }
9374
9375 result := testApex(t, bp, fixtures...)
9376 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9377 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9378 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9379
9380 if disallowedFlagActual != testCase.disallowedFlagExpected {
9381 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9382 }
9383 }
9384}
9385
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009386func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9387 bp := `
9388 apex {
9389 name: "myapex",
9390 key: "myapex.key",
9391 java_libs: ["myjavalib"],
9392 updatable: true,
9393 min_sdk_version: "29",
9394 }
9395 apex_key {
9396 name: "myapex.key",
9397 }
9398 java_library {
9399 name: "myjavalib",
9400 srcs: ["MyClass.java"],
9401 apex_available: [ "myapex" ],
9402 sdk_version: "current",
9403 min_sdk_version: "29",
9404 }
9405 `
9406
9407 testCases := []struct {
9408 testCaseName string
9409 moduleDirectory string
9410 disallowedFlagExpected bool
9411 }{
9412 {
9413 testCaseName: "lintable module defined outside libcore",
9414 moduleDirectory: "",
9415 disallowedFlagExpected: true,
9416 },
9417 {
9418 testCaseName: "lintable module defined in libcore root directory",
9419 moduleDirectory: "libcore/",
9420 disallowedFlagExpected: false,
9421 },
9422 {
9423 testCaseName: "lintable module defined in libcore child directory",
9424 moduleDirectory: "libcore/childdir/",
9425 disallowedFlagExpected: true,
9426 },
9427 }
9428
9429 for _, testCase := range testCases {
9430 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9431 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9432 result := testApex(t, "", lintFileCreator, bpFileCreator)
9433 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9434 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9435 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9436 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9437
9438 if disallowedFlagActual != testCase.disallowedFlagExpected {
9439 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9440 }
9441 }
9442}
9443
Spandan Das66773252022-01-15 00:23:18 +00009444// checks transtive deps of an apex coming from bootclasspath_fragment
9445func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9446 bp := `
9447 apex {
9448 name: "myapex",
9449 key: "myapex.key",
9450 bootclasspath_fragments: ["mybootclasspathfragment"],
9451 updatable: true,
9452 min_sdk_version: "29",
9453 }
9454 apex_key {
9455 name: "myapex.key",
9456 }
9457 bootclasspath_fragment {
9458 name: "mybootclasspathfragment",
9459 contents: ["myjavalib"],
9460 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009461 hidden_api: {
9462 split_packages: ["*"],
9463 },
Spandan Das66773252022-01-15 00:23:18 +00009464 }
9465 java_library {
9466 name: "myjavalib",
9467 srcs: ["MyClass.java"],
9468 apex_available: [ "myapex" ],
9469 sdk_version: "current",
9470 min_sdk_version: "29",
9471 compile_dex: true,
9472 }
9473 `
9474 fs := android.MockFS{
9475 "lint-baseline.xml": nil,
9476 }
9477
9478 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9479 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9480 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9481 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9482 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9483 }
9484}
9485
Spandan Das42e89502022-05-06 22:12:55 +00009486// updatable apexes should propagate updatable=true to its apps
9487func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9488 bp := `
9489 apex {
9490 name: "myapex",
9491 key: "myapex.key",
9492 updatable: %v,
9493 apps: [
9494 "myapp",
9495 ],
9496 min_sdk_version: "30",
9497 }
9498 apex_key {
9499 name: "myapex.key",
9500 }
9501 android_app {
9502 name: "myapp",
9503 updatable: %v,
9504 apex_available: [
9505 "myapex",
9506 ],
9507 sdk_version: "current",
9508 min_sdk_version: "30",
9509 }
9510 `
9511 testCases := []struct {
9512 name string
9513 apex_is_updatable_bp bool
9514 app_is_updatable_bp bool
9515 app_is_updatable_expected bool
9516 }{
9517 {
9518 name: "Non-updatable apex respects updatable property of non-updatable app",
9519 apex_is_updatable_bp: false,
9520 app_is_updatable_bp: false,
9521 app_is_updatable_expected: false,
9522 },
9523 {
9524 name: "Non-updatable apex respects updatable property of updatable app",
9525 apex_is_updatable_bp: false,
9526 app_is_updatable_bp: true,
9527 app_is_updatable_expected: true,
9528 },
9529 {
9530 name: "Updatable apex respects updatable property of updatable app",
9531 apex_is_updatable_bp: true,
9532 app_is_updatable_bp: true,
9533 app_is_updatable_expected: true,
9534 },
9535 {
9536 name: "Updatable apex sets updatable=true on non-updatable app",
9537 apex_is_updatable_bp: true,
9538 app_is_updatable_bp: false,
9539 app_is_updatable_expected: true,
9540 },
9541 }
9542 for _, testCase := range testCases {
9543 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9544 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9545 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9546 }
9547}
9548
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009549func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009550 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009551}