blob: dc505b4fa95d2fccd57567afc40f75a403159779 [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 Chen5372a242022-07-07 17:48:06 +0800622 bpfs: ["bpf", "netdTest"],
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 {
Ken Chen5372a242022-07-07 17:48:06 +0800676 name: "netdTest",
677 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800678 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 Chen5372a242022-07-07 17:48:06 +0800690 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900691 })
692}
693
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800695 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900696 apex {
697 name: "myapex",
698 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000699 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900700 }
701
702 apex_key {
703 name: "myapex.key",
704 public_key: "testkey.avbpubkey",
705 private_key: "testkey.pem",
706 }
707 `)
708
709 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900710 args := module.Rule("apexRule").Args
711 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
712 t.Error("manifest should be apex_manifest.pb, but " + manifest)
713 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900714}
715
Liz Kammer4854a7d2021-05-27 14:28:27 -0400716func TestApexManifestMinSdkVersion(t *testing.T) {
717 ctx := testApex(t, `
718 apex_defaults {
719 name: "my_defaults",
720 key: "myapex.key",
721 product_specific: true,
722 file_contexts: ":my-file-contexts",
723 updatable: false,
724 }
725 apex {
726 name: "myapex_30",
727 min_sdk_version: "30",
728 defaults: ["my_defaults"],
729 }
730
731 apex {
732 name: "myapex_current",
733 min_sdk_version: "current",
734 defaults: ["my_defaults"],
735 }
736
737 apex {
738 name: "myapex_none",
739 defaults: ["my_defaults"],
740 }
741
742 apex_key {
743 name: "myapex.key",
744 public_key: "testkey.avbpubkey",
745 private_key: "testkey.pem",
746 }
747
748 filegroup {
749 name: "my-file-contexts",
750 srcs: ["product_specific_file_contexts"],
751 }
752 `, withFiles(map[string][]byte{
753 "product_specific_file_contexts": nil,
754 }), android.FixtureModifyProductVariables(
755 func(variables android.FixtureProductVariables) {
756 variables.Unbundled_build = proptools.BoolPtr(true)
757 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
758 }), android.FixtureMergeEnv(map[string]string{
759 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
760 }))
761
762 testCases := []struct {
763 module string
764 minSdkVersion string
765 }{
766 {
767 module: "myapex_30",
768 minSdkVersion: "30",
769 },
770 {
771 module: "myapex_current",
772 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
773 },
774 {
775 module: "myapex_none",
776 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
777 },
778 }
779 for _, tc := range testCases {
780 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
781 args := module.Rule("apexRule").Args
782 optFlags := args["opt_flags"]
783 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
784 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
785 }
786 }
787}
788
Alex Light5098a612018-11-29 17:12:15 -0800789func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800790 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800791 apex {
792 name: "myapex",
793 key: "myapex.key",
794 payload_type: "zip",
795 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000796 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800797 }
798
799 apex_key {
800 name: "myapex.key",
801 public_key: "testkey.avbpubkey",
802 private_key: "testkey.pem",
803 }
804
805 cc_library {
806 name: "mylib",
807 srcs: ["mylib.cpp"],
808 shared_libs: ["mylib2"],
809 system_shared_libs: [],
810 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000811 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800812 }
813
814 cc_library {
815 name: "mylib2",
816 srcs: ["mylib.cpp"],
817 system_shared_libs: [],
818 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000819 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800820 }
821 `)
822
Sundong Ahnabb64432019-10-22 13:58:29 +0900823 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800824 copyCmds := zipApexRule.Args["copy_commands"]
825
826 // Ensure that main rule creates an output
827 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
828
829 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800831
832 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700833 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800834
835 // Ensure that both direct and indirect deps are copied into apex
836 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
837 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900838}
839
840func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800841 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900842 apex {
843 name: "myapex",
844 key: "myapex.key",
845 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900846 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000847 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900848 }
849
850 apex_key {
851 name: "myapex.key",
852 public_key: "testkey.avbpubkey",
853 private_key: "testkey.pem",
854 }
855
856 cc_library {
857 name: "mylib",
858 srcs: ["mylib.cpp"],
859 shared_libs: ["mylib2", "mylib3"],
860 system_shared_libs: [],
861 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000862 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900863 }
864
865 cc_library {
866 name: "mylib2",
867 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900868 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900869 system_shared_libs: [],
870 stl: "none",
871 stubs: {
872 versions: ["1", "2", "3"],
873 },
874 }
875
876 cc_library {
877 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900878 srcs: ["mylib.cpp"],
879 shared_libs: ["mylib4"],
880 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900881 stl: "none",
882 stubs: {
883 versions: ["10", "11", "12"],
884 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000885 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900886 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900887
888 cc_library {
889 name: "mylib4",
890 srcs: ["mylib.cpp"],
891 system_shared_libs: [],
892 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000893 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900894 }
Jiyong Park105dc322021-06-11 17:22:09 +0900895
896 rust_binary {
897 name: "foo.rust",
898 srcs: ["foo.rs"],
899 shared_libs: ["libfoo.shared_from_rust"],
900 prefer_rlib: true,
901 apex_available: ["myapex"],
902 }
903
904 cc_library_shared {
905 name: "libfoo.shared_from_rust",
906 srcs: ["mylib.cpp"],
907 system_shared_libs: [],
908 stl: "none",
909 stubs: {
910 versions: ["10", "11", "12"],
911 },
912 }
913
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914 `)
915
Sundong Ahnabb64432019-10-22 13:58:29 +0900916 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900917 copyCmds := apexRule.Args["copy_commands"]
918
919 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800920 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921
922 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800923 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924
925 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800926 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927
Colin Crossaede88c2020-08-11 12:17:01 -0700928 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900929
930 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900931 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900933 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900934
935 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700936 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900937 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700938 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900939
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700940 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
941 // is replaced by sharing of "cFlags" in cc/builder.go.
942 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
943 // module variable representing "cflags". So it was not detected by ensureNotContains.
944 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
945 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
946 // including the original cflags's "-include mylib.h".
947 //
Jiyong Park64379952018-12-13 18:37:29 +0900948 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700949 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
950 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900951
952 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700953 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900954
Jooyung Hana57af4a2020-01-23 05:36:59 +0000955 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900956 "lib64/mylib.so",
957 "lib64/mylib3.so",
958 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900959 "bin/foo.rust",
960 "lib64/libc++.so", // by the implicit dependency from foo.rust
961 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900962 })
Jiyong Park105dc322021-06-11 17:22:09 +0900963
964 // Ensure that stub dependency from a rust module is not included
965 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
966 // The rust module is linked to the stub cc library
967 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
968 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
969 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900970
971 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
972 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900973}
974
Jiyong Park1bc84122021-06-22 20:23:05 +0900975func TestApexCanUsePrivateApis(t *testing.T) {
976 ctx := testApex(t, `
977 apex {
978 name: "myapex",
979 key: "myapex.key",
980 native_shared_libs: ["mylib"],
981 binaries: ["foo.rust"],
982 updatable: false,
983 platform_apis: true,
984 }
985
986 apex_key {
987 name: "myapex.key",
988 public_key: "testkey.avbpubkey",
989 private_key: "testkey.pem",
990 }
991
992 cc_library {
993 name: "mylib",
994 srcs: ["mylib.cpp"],
995 shared_libs: ["mylib2"],
996 system_shared_libs: [],
997 stl: "none",
998 apex_available: [ "myapex" ],
999 }
1000
1001 cc_library {
1002 name: "mylib2",
1003 srcs: ["mylib.cpp"],
1004 cflags: ["-include mylib.h"],
1005 system_shared_libs: [],
1006 stl: "none",
1007 stubs: {
1008 versions: ["1", "2", "3"],
1009 },
1010 }
1011
1012 rust_binary {
1013 name: "foo.rust",
1014 srcs: ["foo.rs"],
1015 shared_libs: ["libfoo.shared_from_rust"],
1016 prefer_rlib: true,
1017 apex_available: ["myapex"],
1018 }
1019
1020 cc_library_shared {
1021 name: "libfoo.shared_from_rust",
1022 srcs: ["mylib.cpp"],
1023 system_shared_libs: [],
1024 stl: "none",
1025 stubs: {
1026 versions: ["10", "11", "12"],
1027 },
1028 }
1029 `)
1030
1031 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1032 copyCmds := apexRule.Args["copy_commands"]
1033
1034 // Ensure that indirect stubs dep is not included
1035 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1037
1038 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1039 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001040 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001041 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1042 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001043 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001044 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1046}
1047
Colin Cross7812fd32020-09-25 12:35:10 -07001048func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1049 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001050 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001051 apex {
1052 name: "myapex",
1053 key: "myapex.key",
1054 native_shared_libs: ["mylib", "mylib3"],
1055 min_sdk_version: "29",
1056 }
1057
1058 apex_key {
1059 name: "myapex.key",
1060 public_key: "testkey.avbpubkey",
1061 private_key: "testkey.pem",
1062 }
1063
1064 cc_library {
1065 name: "mylib",
1066 srcs: ["mylib.cpp"],
1067 shared_libs: ["mylib2", "mylib3"],
1068 system_shared_libs: [],
1069 stl: "none",
1070 apex_available: [ "myapex" ],
1071 min_sdk_version: "28",
1072 }
1073
1074 cc_library {
1075 name: "mylib2",
1076 srcs: ["mylib.cpp"],
1077 cflags: ["-include mylib.h"],
1078 system_shared_libs: [],
1079 stl: "none",
1080 stubs: {
1081 versions: ["28", "29", "30", "current"],
1082 },
1083 min_sdk_version: "28",
1084 }
1085
1086 cc_library {
1087 name: "mylib3",
1088 srcs: ["mylib.cpp"],
1089 shared_libs: ["mylib4"],
1090 system_shared_libs: [],
1091 stl: "none",
1092 stubs: {
1093 versions: ["28", "29", "30", "current"],
1094 },
1095 apex_available: [ "myapex" ],
1096 min_sdk_version: "28",
1097 }
1098
1099 cc_library {
1100 name: "mylib4",
1101 srcs: ["mylib.cpp"],
1102 system_shared_libs: [],
1103 stl: "none",
1104 apex_available: [ "myapex" ],
1105 min_sdk_version: "28",
1106 }
1107 `)
1108
1109 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1110 copyCmds := apexRule.Args["copy_commands"]
1111
1112 // Ensure that direct non-stubs dep is always included
1113 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1114
1115 // Ensure that indirect stubs dep is not included
1116 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1117
1118 // Ensure that direct stubs dep is included
1119 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1120
1121 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1122
Jiyong Park55549df2021-02-26 23:57:23 +09001123 // Ensure that mylib is linking with the latest version of stub for mylib2
1124 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001125 // ... and not linking to the non-stub (impl) variant of mylib2
1126 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1127
1128 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1129 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1130 // .. and not linking to the stubs variant of mylib3
1131 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1132
1133 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001134 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001135 ensureNotContains(t, mylib2Cflags, "-include ")
1136
1137 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -07001138 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -07001139
1140 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1141 "lib64/mylib.so",
1142 "lib64/mylib3.so",
1143 "lib64/mylib4.so",
1144 })
1145}
1146
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001147func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1148 t.Parallel()
1149 // myapex (Z)
1150 // mylib -----------------.
1151 // |
1152 // otherapex (29) |
1153 // libstub's versions: 29 Z current
1154 // |
1155 // <platform> |
1156 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001157 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001158 apex {
1159 name: "myapex",
1160 key: "myapex.key",
1161 native_shared_libs: ["mylib"],
1162 min_sdk_version: "Z", // non-final
1163 }
1164
1165 cc_library {
1166 name: "mylib",
1167 srcs: ["mylib.cpp"],
1168 shared_libs: ["libstub"],
1169 apex_available: ["myapex"],
1170 min_sdk_version: "Z",
1171 }
1172
1173 apex_key {
1174 name: "myapex.key",
1175 public_key: "testkey.avbpubkey",
1176 private_key: "testkey.pem",
1177 }
1178
1179 apex {
1180 name: "otherapex",
1181 key: "myapex.key",
1182 native_shared_libs: ["libstub"],
1183 min_sdk_version: "29",
1184 }
1185
1186 cc_library {
1187 name: "libstub",
1188 srcs: ["mylib.cpp"],
1189 stubs: {
1190 versions: ["29", "Z", "current"],
1191 },
1192 apex_available: ["otherapex"],
1193 min_sdk_version: "29",
1194 }
1195
1196 // platform module depending on libstub from otherapex should use the latest stub("current")
1197 cc_library {
1198 name: "libplatform",
1199 srcs: ["mylib.cpp"],
1200 shared_libs: ["libstub"],
1201 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001202 `,
1203 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1204 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1205 variables.Platform_sdk_final = proptools.BoolPtr(false)
1206 variables.Platform_version_active_codenames = []string{"Z"}
1207 }),
1208 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001209
Jiyong Park55549df2021-02-26 23:57:23 +09001210 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001211 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001212 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001213 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001214 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001215
1216 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1217 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1218 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1219 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1220 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1221}
1222
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001223func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001224 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001225 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001226 name: "myapex2",
1227 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001228 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001229 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001230 }
1231
1232 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001233 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234 public_key: "testkey.avbpubkey",
1235 private_key: "testkey.pem",
1236 }
1237
1238 cc_library {
1239 name: "mylib",
1240 srcs: ["mylib.cpp"],
1241 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001242 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001243 system_shared_libs: [],
1244 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001245 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001246 }
1247
1248 cc_library {
1249 name: "libfoo",
1250 srcs: ["mylib.cpp"],
1251 shared_libs: ["libbar"],
1252 system_shared_libs: [],
1253 stl: "none",
1254 stubs: {
1255 versions: ["10", "20", "30"],
1256 },
1257 }
1258
1259 cc_library {
1260 name: "libbar",
1261 srcs: ["mylib.cpp"],
1262 system_shared_libs: [],
1263 stl: "none",
1264 }
1265
Jiyong Park678c8812020-02-07 17:25:49 +09001266 cc_library_static {
1267 name: "libbaz",
1268 srcs: ["mylib.cpp"],
1269 system_shared_libs: [],
1270 stl: "none",
1271 apex_available: [ "myapex2" ],
1272 }
1273
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001274 `)
1275
Jiyong Park83dc74b2020-01-14 18:38:44 +09001276 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001277 copyCmds := apexRule.Args["copy_commands"]
1278
1279 // Ensure that direct non-stubs dep is always included
1280 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1281
1282 // Ensure that indirect stubs dep is not included
1283 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1284
1285 // Ensure that dependency of stubs is not included
1286 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1287
Colin Crossaede88c2020-08-11 12:17:01 -07001288 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289
1290 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001291 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001292 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001293 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001294
Jiyong Park3ff16992019-12-27 14:11:47 +09001295 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001296
1297 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1298 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001299
Artur Satayeva8bd1132020-04-27 18:07:06 +01001300 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001301 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001302
Artur Satayeva8bd1132020-04-27 18:07:06 +01001303 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001304 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001305}
1306
Jooyung Hand3639552019-08-09 12:57:43 +09001307func TestApexWithRuntimeLibsDependency(t *testing.T) {
1308 /*
1309 myapex
1310 |
1311 v (runtime_libs)
1312 mylib ------+------> libfoo [provides stub]
1313 |
1314 `------> libbar
1315 */
Colin Cross1c460562021-02-16 17:55:47 -08001316 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001317 apex {
1318 name: "myapex",
1319 key: "myapex.key",
1320 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001321 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001322 }
1323
1324 apex_key {
1325 name: "myapex.key",
1326 public_key: "testkey.avbpubkey",
1327 private_key: "testkey.pem",
1328 }
1329
1330 cc_library {
1331 name: "mylib",
1332 srcs: ["mylib.cpp"],
1333 runtime_libs: ["libfoo", "libbar"],
1334 system_shared_libs: [],
1335 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001336 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001337 }
1338
1339 cc_library {
1340 name: "libfoo",
1341 srcs: ["mylib.cpp"],
1342 system_shared_libs: [],
1343 stl: "none",
1344 stubs: {
1345 versions: ["10", "20", "30"],
1346 },
1347 }
1348
1349 cc_library {
1350 name: "libbar",
1351 srcs: ["mylib.cpp"],
1352 system_shared_libs: [],
1353 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001354 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001355 }
1356
1357 `)
1358
Sundong Ahnabb64432019-10-22 13:58:29 +09001359 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001360 copyCmds := apexRule.Args["copy_commands"]
1361
1362 // Ensure that direct non-stubs dep is always included
1363 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1364
1365 // Ensure that indirect stubs dep is not included
1366 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1367
1368 // Ensure that runtime_libs dep in included
1369 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1370
Sundong Ahnabb64432019-10-22 13:58:29 +09001371 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001372 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1373 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001374
1375}
1376
Paul Duffina02cae32021-03-09 01:44:06 +00001377var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1378 cc.PrepareForTestWithCcBuildComponents,
1379 PrepareForTestWithApexBuildComponents,
1380 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001381 apex {
1382 name: "com.android.runtime",
1383 key: "com.android.runtime.key",
1384 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001385 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001386 }
1387
1388 apex_key {
1389 name: "com.android.runtime.key",
1390 public_key: "testkey.avbpubkey",
1391 private_key: "testkey.pem",
1392 }
Paul Duffina02cae32021-03-09 01:44:06 +00001393 `),
1394 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1395)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001396
Paul Duffina02cae32021-03-09 01:44:06 +00001397func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001398 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001399 cc_library {
1400 name: "libc",
1401 no_libcrt: true,
1402 nocrt: true,
1403 stl: "none",
1404 system_shared_libs: [],
1405 stubs: { versions: ["1"] },
1406 apex_available: ["com.android.runtime"],
1407
1408 sanitize: {
1409 hwaddress: true,
1410 }
1411 }
1412
1413 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001414 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001415 no_libcrt: true,
1416 nocrt: true,
1417 stl: "none",
1418 system_shared_libs: [],
1419 srcs: [""],
1420 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001421 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001422
1423 sanitize: {
1424 never: true,
1425 },
Paul Duffina02cae32021-03-09 01:44:06 +00001426 } `)
1427 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001428
1429 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1430 "lib64/bionic/libc.so",
1431 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1432 })
1433
Colin Cross4c4c1be2022-02-10 11:41:18 -08001434 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001435
1436 installed := hwasan.Description("install libclang_rt.hwasan")
1437 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1438
1439 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1440 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1441 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1442}
1443
1444func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001445 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001446 prepareForTestOfRuntimeApexWithHwasan,
1447 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1448 variables.SanitizeDevice = []string{"hwaddress"}
1449 }),
1450 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001451 cc_library {
1452 name: "libc",
1453 no_libcrt: true,
1454 nocrt: true,
1455 stl: "none",
1456 system_shared_libs: [],
1457 stubs: { versions: ["1"] },
1458 apex_available: ["com.android.runtime"],
1459 }
1460
1461 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001462 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001463 no_libcrt: true,
1464 nocrt: true,
1465 stl: "none",
1466 system_shared_libs: [],
1467 srcs: [""],
1468 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001469 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001470
1471 sanitize: {
1472 never: true,
1473 },
1474 }
Paul Duffina02cae32021-03-09 01:44:06 +00001475 `)
1476 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477
1478 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1479 "lib64/bionic/libc.so",
1480 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1481 })
1482
Colin Cross4c4c1be2022-02-10 11:41:18 -08001483 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001484
1485 installed := hwasan.Description("install libclang_rt.hwasan")
1486 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1487
1488 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1489 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1490 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1491}
1492
Jooyung Han61b66e92020-03-21 14:21:46 +00001493func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1494 testcases := []struct {
1495 name string
1496 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001497 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001498 shouldLink string
1499 shouldNotLink []string
1500 }{
1501 {
Jiyong Park55549df2021-02-26 23:57:23 +09001502 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001503 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001504 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001505 shouldLink: "current",
1506 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001507 },
1508 {
Jiyong Park55549df2021-02-26 23:57:23 +09001509 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001510 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001511 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001512 shouldLink: "current",
1513 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001514 },
1515 }
1516 for _, tc := range testcases {
1517 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001518 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001519 apex {
1520 name: "myapex",
1521 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001522 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001523 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001524 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001525 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001526
Jooyung Han61b66e92020-03-21 14:21:46 +00001527 apex_key {
1528 name: "myapex.key",
1529 public_key: "testkey.avbpubkey",
1530 private_key: "testkey.pem",
1531 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001532
Jooyung Han61b66e92020-03-21 14:21:46 +00001533 cc_library {
1534 name: "mylib",
1535 srcs: ["mylib.cpp"],
1536 vendor_available: true,
1537 shared_libs: ["libbar"],
1538 system_shared_libs: [],
1539 stl: "none",
1540 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001541 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001542 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001543
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 cc_library {
1545 name: "libbar",
1546 srcs: ["mylib.cpp"],
1547 system_shared_libs: [],
1548 stl: "none",
1549 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001550 llndk: {
1551 symbol_file: "libbar.map.txt",
1552 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001553 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001554 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001555 withUnbundledBuild,
1556 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001557
Jooyung Han61b66e92020-03-21 14:21:46 +00001558 // Ensure that LLNDK dep is not included
1559 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1560 "lib64/mylib.so",
1561 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 // Ensure that LLNDK dep is required
1564 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1565 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1566 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001567
Steven Moreland2c4000c2021-04-27 02:08:49 +00001568 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1569 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001571 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001573
Steven Moreland2c4000c2021-04-27 02:08:49 +00001574 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001575 ver := tc.shouldLink
1576 if tc.shouldLink == "current" {
1577 ver = strconv.Itoa(android.FutureApiLevelInt)
1578 }
1579 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001580 })
1581 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001582}
1583
Jiyong Park25fc6a92018-11-18 18:02:45 +09001584func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001585 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586 apex {
1587 name: "myapex",
1588 key: "myapex.key",
1589 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001590 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001591 }
1592
1593 apex_key {
1594 name: "myapex.key",
1595 public_key: "testkey.avbpubkey",
1596 private_key: "testkey.pem",
1597 }
1598
1599 cc_library {
1600 name: "mylib",
1601 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001602 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001603 shared_libs: ["libdl#27"],
1604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001605 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001606 }
1607
1608 cc_library_shared {
1609 name: "mylib_shared",
1610 srcs: ["mylib.cpp"],
1611 shared_libs: ["libdl#27"],
1612 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001613 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001614 }
1615
1616 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001617 name: "libBootstrap",
1618 srcs: ["mylib.cpp"],
1619 stl: "none",
1620 bootstrap: true,
1621 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622 `)
1623
Sundong Ahnabb64432019-10-22 13:58:29 +09001624 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001625 copyCmds := apexRule.Args["copy_commands"]
1626
1627 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001628 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001629 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1630 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001631
1632 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001633 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001634
Colin Crossaede88c2020-08-11 12:17:01 -07001635 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1636 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1637 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001638
1639 // For dependency to libc
1640 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001641 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001642 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001643 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001645 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1646 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001647
1648 // For dependency to libm
1649 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001650 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001652 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001653 // ... and is not compiling with the stub
1654 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1655 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1656
1657 // For dependency to libdl
1658 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001659 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001661 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1662 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001664 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665 // ... Cflags from stub is correctly exported to mylib
1666 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1667 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001668
1669 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001670 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1671 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1672 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1673 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001675
Jooyung Han749dc692020-04-15 11:03:39 +09001676func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001677 // there are three links between liba --> libz.
1678 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001679 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001680 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001681 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001682 apex {
1683 name: "myapex",
1684 key: "myapex.key",
1685 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001686 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001687 }
1688
1689 apex {
1690 name: "otherapex",
1691 key: "myapex.key",
1692 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001693 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001694 }
1695
1696 apex_key {
1697 name: "myapex.key",
1698 public_key: "testkey.avbpubkey",
1699 private_key: "testkey.pem",
1700 }
1701
1702 cc_library {
1703 name: "libx",
1704 shared_libs: ["liba"],
1705 system_shared_libs: [],
1706 stl: "none",
1707 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001708 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001709 }
1710
1711 cc_library {
1712 name: "liby",
1713 shared_libs: ["liba"],
1714 system_shared_libs: [],
1715 stl: "none",
1716 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001717 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001718 }
1719
1720 cc_library {
1721 name: "liba",
1722 shared_libs: ["libz"],
1723 system_shared_libs: [],
1724 stl: "none",
1725 apex_available: [
1726 "//apex_available:anyapex",
1727 "//apex_available:platform",
1728 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001729 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001730 }
1731
1732 cc_library {
1733 name: "libz",
1734 system_shared_libs: [],
1735 stl: "none",
1736 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001737 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001738 },
1739 }
Jooyung Han749dc692020-04-15 11:03:39 +09001740 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001741
1742 expectLink := func(from, from_variant, to, to_variant string) {
1743 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1744 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1745 }
1746 expectNoLink := func(from, from_variant, to, to_variant string) {
1747 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1748 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1749 }
1750 // platform liba is linked to non-stub version
1751 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001752 // liba in myapex is linked to current
1753 expectLink("liba", "shared_apex29", "libz", "shared_current")
1754 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001755 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001756 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001757 // liba in otherapex is linked to current
1758 expectLink("liba", "shared_apex30", "libz", "shared_current")
1759 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001760 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1761 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001762}
1763
Jooyung Hanaed150d2020-04-02 01:41:41 +09001764func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["libx"],
1770 min_sdk_version: "R",
1771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "libx",
1781 shared_libs: ["libz"],
1782 system_shared_libs: [],
1783 stl: "none",
1784 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001785 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001786 }
1787
1788 cc_library {
1789 name: "libz",
1790 system_shared_libs: [],
1791 stl: "none",
1792 stubs: {
1793 versions: ["29", "R"],
1794 },
1795 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001796 `,
1797 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1798 variables.Platform_version_active_codenames = []string{"R"}
1799 }),
1800 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001801
1802 expectLink := func(from, from_variant, to, to_variant string) {
1803 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1804 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1805 }
1806 expectNoLink := func(from, from_variant, to, to_variant string) {
1807 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1808 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1809 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001810 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1811 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001812 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1813 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001814}
1815
Jooyung Han4c4da062021-06-23 10:23:16 +09001816func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1817 testApex(t, `
1818 apex {
1819 name: "myapex",
1820 key: "myapex.key",
1821 java_libs: ["libx"],
1822 min_sdk_version: "S",
1823 }
1824
1825 apex_key {
1826 name: "myapex.key",
1827 public_key: "testkey.avbpubkey",
1828 private_key: "testkey.pem",
1829 }
1830
1831 java_library {
1832 name: "libx",
1833 srcs: ["a.java"],
1834 apex_available: [ "myapex" ],
1835 sdk_version: "current",
1836 min_sdk_version: "S", // should be okay
1837 }
1838 `,
1839 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1840 variables.Platform_version_active_codenames = []string{"S"}
1841 variables.Platform_sdk_codename = proptools.StringPtr("S")
1842 }),
1843 )
1844}
1845
Jooyung Han749dc692020-04-15 11:03:39 +09001846func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001847 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001852 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001853 }
1854
1855 apex_key {
1856 name: "myapex.key",
1857 public_key: "testkey.avbpubkey",
1858 private_key: "testkey.pem",
1859 }
1860
1861 cc_library {
1862 name: "libx",
1863 shared_libs: ["libz"],
1864 system_shared_libs: [],
1865 stl: "none",
1866 apex_available: [ "myapex" ],
1867 }
1868
1869 cc_library {
1870 name: "libz",
1871 system_shared_libs: [],
1872 stl: "none",
1873 stubs: {
1874 versions: ["1", "2"],
1875 },
1876 }
1877 `)
1878
1879 expectLink := func(from, from_variant, to, to_variant string) {
1880 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1881 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1882 }
1883 expectNoLink := func(from, from_variant, to, to_variant string) {
1884 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1885 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1886 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001887 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001888 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001889 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001890 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001891}
1892
Jiyong Park5df7bd32021-08-25 16:18:46 +09001893func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1894 ctx := testApex(t, `
1895 apex {
1896 name: "myapex",
1897 key: "myapex.key",
1898 native_shared_libs: ["mylib"],
1899 updatable: false,
1900 vendor: true,
1901 min_sdk_version: "29",
1902 }
1903
1904 apex_key {
1905 name: "myapex.key",
1906 public_key: "testkey.avbpubkey",
1907 private_key: "testkey.pem",
1908 }
1909
1910 cc_library {
1911 name: "mylib",
1912 vendor_available: true,
1913 system_shared_libs: [],
1914 stl: "none",
1915 apex_available: [ "myapex" ],
1916 min_sdk_version: "29",
1917 }
1918 `)
1919
1920 vendorVariant := "android_vendor.29_arm64_armv8-a"
1921
1922 // First check that the correct variant of crtbegin_so is used.
1923 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1924 crtBegin := names(ldRule.Args["crtBegin"])
1925 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1926
1927 // Ensure that the crtbegin_so used by the APEX is targeting 29
1928 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1929 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1930}
1931
Jooyung Han03b51852020-02-26 22:45:42 +09001932func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001933 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001934 apex {
1935 name: "myapex",
1936 key: "myapex.key",
1937 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001938 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001939 }
1940
1941 apex_key {
1942 name: "myapex.key",
1943 public_key: "testkey.avbpubkey",
1944 private_key: "testkey.pem",
1945 }
1946
1947 cc_library {
1948 name: "libx",
1949 system_shared_libs: [],
1950 stl: "none",
1951 apex_available: [ "myapex" ],
1952 stubs: {
1953 versions: ["1", "2"],
1954 },
1955 }
1956
1957 cc_library {
1958 name: "libz",
1959 shared_libs: ["libx"],
1960 system_shared_libs: [],
1961 stl: "none",
1962 }
1963 `)
1964
1965 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001966 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001967 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1968 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1969 }
1970 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001971 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001972 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1973 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1974 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001975 expectLink("libz", "shared", "libx", "shared_current")
1976 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001977 expectNoLink("libz", "shared", "libz", "shared_1")
1978 expectNoLink("libz", "shared", "libz", "shared")
1979}
1980
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001981var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1982 func(variables android.FixtureProductVariables) {
1983 variables.SanitizeDevice = []string{"hwaddress"}
1984 },
1985)
1986
Jooyung Han75568392020-03-20 04:29:24 +09001987func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001988 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001989 apex {
1990 name: "myapex",
1991 key: "myapex.key",
1992 native_shared_libs: ["libx"],
1993 min_sdk_version: "29",
1994 }
1995
1996 apex_key {
1997 name: "myapex.key",
1998 public_key: "testkey.avbpubkey",
1999 private_key: "testkey.pem",
2000 }
2001
2002 cc_library {
2003 name: "libx",
2004 shared_libs: ["libbar"],
2005 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002006 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002007 }
2008
2009 cc_library {
2010 name: "libbar",
2011 stubs: {
2012 versions: ["29", "30"],
2013 },
2014 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002015 `,
2016 prepareForTestWithSantitizeHwaddress,
2017 )
Jooyung Han03b51852020-02-26 22:45:42 +09002018 expectLink := func(from, from_variant, to, to_variant string) {
2019 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2020 libFlags := ld.Args["libFlags"]
2021 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2022 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002023 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002024}
2025
Jooyung Han75568392020-03-20 04:29:24 +09002026func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002027 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002028 apex {
2029 name: "myapex",
2030 key: "myapex.key",
2031 native_shared_libs: ["libx"],
2032 min_sdk_version: "29",
2033 }
2034
2035 apex_key {
2036 name: "myapex.key",
2037 public_key: "testkey.avbpubkey",
2038 private_key: "testkey.pem",
2039 }
2040
2041 cc_library {
2042 name: "libx",
2043 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002044 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002045 }
Jooyung Han75568392020-03-20 04:29:24 +09002046 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002047
2048 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002049 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002050 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002051 // note that platform variant is not.
2052 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002053 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002054}
2055
Jooyung Han749dc692020-04-15 11:03:39 +09002056func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2057 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002058 apex {
2059 name: "myapex",
2060 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002061 native_shared_libs: ["mylib"],
2062 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002063 }
2064
2065 apex_key {
2066 name: "myapex.key",
2067 public_key: "testkey.avbpubkey",
2068 private_key: "testkey.pem",
2069 }
Jooyung Han749dc692020-04-15 11:03:39 +09002070
2071 cc_library {
2072 name: "mylib",
2073 srcs: ["mylib.cpp"],
2074 system_shared_libs: [],
2075 stl: "none",
2076 apex_available: [
2077 "myapex",
2078 ],
2079 min_sdk_version: "30",
2080 }
2081 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002082
2083 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2084 apex {
2085 name: "myapex",
2086 key: "myapex.key",
2087 native_shared_libs: ["libfoo.ffi"],
2088 min_sdk_version: "29",
2089 }
2090
2091 apex_key {
2092 name: "myapex.key",
2093 public_key: "testkey.avbpubkey",
2094 private_key: "testkey.pem",
2095 }
2096
2097 rust_ffi_shared {
2098 name: "libfoo.ffi",
2099 srcs: ["foo.rs"],
2100 crate_name: "foo",
2101 apex_available: [
2102 "myapex",
2103 ],
2104 min_sdk_version: "30",
2105 }
2106 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002107
2108 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2109 apex {
2110 name: "myapex",
2111 key: "myapex.key",
2112 java_libs: ["libfoo"],
2113 min_sdk_version: "29",
2114 }
2115
2116 apex_key {
2117 name: "myapex.key",
2118 public_key: "testkey.avbpubkey",
2119 private_key: "testkey.pem",
2120 }
2121
2122 java_import {
2123 name: "libfoo",
2124 jars: ["libfoo.jar"],
2125 apex_available: [
2126 "myapex",
2127 ],
2128 min_sdk_version: "30",
2129 }
2130 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002131}
2132
2133func TestApexMinSdkVersion_Okay(t *testing.T) {
2134 testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 native_shared_libs: ["libfoo"],
2139 java_libs: ["libbar"],
2140 min_sdk_version: "29",
2141 }
2142
2143 apex_key {
2144 name: "myapex.key",
2145 public_key: "testkey.avbpubkey",
2146 private_key: "testkey.pem",
2147 }
2148
2149 cc_library {
2150 name: "libfoo",
2151 srcs: ["mylib.cpp"],
2152 shared_libs: ["libfoo_dep"],
2153 apex_available: ["myapex"],
2154 min_sdk_version: "29",
2155 }
2156
2157 cc_library {
2158 name: "libfoo_dep",
2159 srcs: ["mylib.cpp"],
2160 apex_available: ["myapex"],
2161 min_sdk_version: "29",
2162 }
2163
2164 java_library {
2165 name: "libbar",
2166 sdk_version: "current",
2167 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002168 static_libs: [
2169 "libbar_dep",
2170 "libbar_import_dep",
2171 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002172 apex_available: ["myapex"],
2173 min_sdk_version: "29",
2174 }
2175
2176 java_library {
2177 name: "libbar_dep",
2178 sdk_version: "current",
2179 srcs: ["a.java"],
2180 apex_available: ["myapex"],
2181 min_sdk_version: "29",
2182 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002183
2184 java_import {
2185 name: "libbar_import_dep",
2186 jars: ["libbar.jar"],
2187 apex_available: ["myapex"],
2188 min_sdk_version: "29",
2189 }
Jooyung Han03b51852020-02-26 22:45:42 +09002190 `)
2191}
2192
Artur Satayev8cf899a2020-04-15 17:29:42 +01002193func TestJavaStableSdkVersion(t *testing.T) {
2194 testCases := []struct {
2195 name string
2196 expectedError string
2197 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002198 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002199 }{
2200 {
2201 name: "Non-updatable apex with non-stable dep",
2202 bp: `
2203 apex {
2204 name: "myapex",
2205 java_libs: ["myjar"],
2206 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002207 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002208 }
2209 apex_key {
2210 name: "myapex.key",
2211 public_key: "testkey.avbpubkey",
2212 private_key: "testkey.pem",
2213 }
2214 java_library {
2215 name: "myjar",
2216 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002217 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002218 apex_available: ["myapex"],
2219 }
2220 `,
2221 },
2222 {
2223 name: "Updatable apex with stable dep",
2224 bp: `
2225 apex {
2226 name: "myapex",
2227 java_libs: ["myjar"],
2228 key: "myapex.key",
2229 updatable: true,
2230 min_sdk_version: "29",
2231 }
2232 apex_key {
2233 name: "myapex.key",
2234 public_key: "testkey.avbpubkey",
2235 private_key: "testkey.pem",
2236 }
2237 java_library {
2238 name: "myjar",
2239 srcs: ["foo/bar/MyClass.java"],
2240 sdk_version: "current",
2241 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002242 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002243 }
2244 `,
2245 },
2246 {
2247 name: "Updatable apex with non-stable dep",
2248 expectedError: "cannot depend on \"myjar\"",
2249 bp: `
2250 apex {
2251 name: "myapex",
2252 java_libs: ["myjar"],
2253 key: "myapex.key",
2254 updatable: true,
2255 }
2256 apex_key {
2257 name: "myapex.key",
2258 public_key: "testkey.avbpubkey",
2259 private_key: "testkey.pem",
2260 }
2261 java_library {
2262 name: "myjar",
2263 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002264 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002265 apex_available: ["myapex"],
2266 }
2267 `,
2268 },
2269 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002270 name: "Updatable apex with non-stable legacy core platform dep",
2271 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2272 bp: `
2273 apex {
2274 name: "myapex",
2275 java_libs: ["myjar-uses-legacy"],
2276 key: "myapex.key",
2277 updatable: true,
2278 }
2279 apex_key {
2280 name: "myapex.key",
2281 public_key: "testkey.avbpubkey",
2282 private_key: "testkey.pem",
2283 }
2284 java_library {
2285 name: "myjar-uses-legacy",
2286 srcs: ["foo/bar/MyClass.java"],
2287 sdk_version: "core_platform",
2288 apex_available: ["myapex"],
2289 }
2290 `,
2291 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2292 },
2293 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002294 name: "Updatable apex with non-stable transitive dep",
2295 // This is not actually detecting that the transitive dependency is unstable, rather it is
2296 // detecting that the transitive dependency is building against a wider API surface than the
2297 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002298 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002299 bp: `
2300 apex {
2301 name: "myapex",
2302 java_libs: ["myjar"],
2303 key: "myapex.key",
2304 updatable: true,
2305 }
2306 apex_key {
2307 name: "myapex.key",
2308 public_key: "testkey.avbpubkey",
2309 private_key: "testkey.pem",
2310 }
2311 java_library {
2312 name: "myjar",
2313 srcs: ["foo/bar/MyClass.java"],
2314 sdk_version: "current",
2315 apex_available: ["myapex"],
2316 static_libs: ["transitive-jar"],
2317 }
2318 java_library {
2319 name: "transitive-jar",
2320 srcs: ["foo/bar/MyClass.java"],
2321 sdk_version: "core_platform",
2322 apex_available: ["myapex"],
2323 }
2324 `,
2325 },
2326 }
2327
2328 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002329 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2330 continue
2331 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002332 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002333 errorHandler := android.FixtureExpectsNoErrors
2334 if test.expectedError != "" {
2335 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002336 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002337 android.GroupFixturePreparers(
2338 java.PrepareForTestWithJavaDefaultModules,
2339 PrepareForTestWithApexBuildComponents,
2340 prepareForTestWithMyapex,
2341 android.OptionalFixturePreparer(test.preparer),
2342 ).
2343 ExtendWithErrorHandler(errorHandler).
2344 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002345 })
2346 }
2347}
2348
Jooyung Han749dc692020-04-15 11:03:39 +09002349func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2350 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2351 apex {
2352 name: "myapex",
2353 key: "myapex.key",
2354 native_shared_libs: ["mylib"],
2355 min_sdk_version: "29",
2356 }
2357
2358 apex_key {
2359 name: "myapex.key",
2360 public_key: "testkey.avbpubkey",
2361 private_key: "testkey.pem",
2362 }
2363
2364 cc_library {
2365 name: "mylib",
2366 srcs: ["mylib.cpp"],
2367 shared_libs: ["mylib2"],
2368 system_shared_libs: [],
2369 stl: "none",
2370 apex_available: [
2371 "myapex",
2372 ],
2373 min_sdk_version: "29",
2374 }
2375
2376 // indirect part of the apex
2377 cc_library {
2378 name: "mylib2",
2379 srcs: ["mylib.cpp"],
2380 system_shared_libs: [],
2381 stl: "none",
2382 apex_available: [
2383 "myapex",
2384 ],
2385 min_sdk_version: "30",
2386 }
2387 `)
2388}
2389
2390func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2391 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2392 apex {
2393 name: "myapex",
2394 key: "myapex.key",
2395 apps: ["AppFoo"],
2396 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002397 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002398 }
2399
2400 apex_key {
2401 name: "myapex.key",
2402 public_key: "testkey.avbpubkey",
2403 private_key: "testkey.pem",
2404 }
2405
2406 android_app {
2407 name: "AppFoo",
2408 srcs: ["foo/bar/MyClass.java"],
2409 sdk_version: "current",
2410 min_sdk_version: "29",
2411 system_modules: "none",
2412 stl: "none",
2413 static_libs: ["bar"],
2414 apex_available: [ "myapex" ],
2415 }
2416
2417 java_library {
2418 name: "bar",
2419 sdk_version: "current",
2420 srcs: ["a.java"],
2421 apex_available: [ "myapex" ],
2422 }
2423 `)
2424}
2425
2426func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002427 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002428 apex {
2429 name: "myapex",
2430 key: "myapex.key",
2431 native_shared_libs: ["mylib"],
2432 min_sdk_version: "29",
2433 }
2434
2435 apex_key {
2436 name: "myapex.key",
2437 public_key: "testkey.avbpubkey",
2438 private_key: "testkey.pem",
2439 }
2440
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002441 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002442 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2443 cc_library {
2444 name: "mylib",
2445 srcs: ["mylib.cpp"],
2446 shared_libs: ["mylib2"],
2447 system_shared_libs: [],
2448 stl: "none",
2449 apex_available: ["myapex", "otherapex"],
2450 min_sdk_version: "29",
2451 }
2452
2453 cc_library {
2454 name: "mylib2",
2455 srcs: ["mylib.cpp"],
2456 system_shared_libs: [],
2457 stl: "none",
2458 apex_available: ["otherapex"],
2459 stubs: { versions: ["29", "30"] },
2460 min_sdk_version: "30",
2461 }
2462
2463 apex {
2464 name: "otherapex",
2465 key: "myapex.key",
2466 native_shared_libs: ["mylib", "mylib2"],
2467 min_sdk_version: "30",
2468 }
2469 `)
2470 expectLink := func(from, from_variant, to, to_variant string) {
2471 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2472 libFlags := ld.Args["libFlags"]
2473 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2474 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002475 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002476 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002477}
2478
Jooyung Haned124c32021-01-26 11:43:46 +09002479func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002480 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2481 func(variables android.FixtureProductVariables) {
2482 variables.Platform_sdk_codename = proptools.StringPtr("S")
2483 variables.Platform_version_active_codenames = []string{"S"}
2484 },
2485 )
Jooyung Haned124c32021-01-26 11:43:46 +09002486 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2487 apex {
2488 name: "myapex",
2489 key: "myapex.key",
2490 native_shared_libs: ["libfoo"],
2491 min_sdk_version: "S",
2492 }
2493 apex_key {
2494 name: "myapex.key",
2495 public_key: "testkey.avbpubkey",
2496 private_key: "testkey.pem",
2497 }
2498 cc_library {
2499 name: "libfoo",
2500 shared_libs: ["libbar"],
2501 apex_available: ["myapex"],
2502 min_sdk_version: "29",
2503 }
2504 cc_library {
2505 name: "libbar",
2506 apex_available: ["myapex"],
2507 }
2508 `, withSAsActiveCodeNames)
2509}
2510
2511func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002512 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2513 variables.Platform_sdk_codename = proptools.StringPtr("S")
2514 variables.Platform_version_active_codenames = []string{"S", "T"}
2515 })
Colin Cross1c460562021-02-16 17:55:47 -08002516 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002517 apex {
2518 name: "myapex",
2519 key: "myapex.key",
2520 native_shared_libs: ["libfoo"],
2521 min_sdk_version: "S",
2522 }
2523 apex_key {
2524 name: "myapex.key",
2525 public_key: "testkey.avbpubkey",
2526 private_key: "testkey.pem",
2527 }
2528 cc_library {
2529 name: "libfoo",
2530 shared_libs: ["libbar"],
2531 apex_available: ["myapex"],
2532 min_sdk_version: "S",
2533 }
2534 cc_library {
2535 name: "libbar",
2536 stubs: {
2537 symbol_file: "libbar.map.txt",
2538 versions: ["30", "S", "T"],
2539 },
2540 }
2541 `, withSAsActiveCodeNames)
2542
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002543 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002544 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2545 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002546 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002547}
2548
Jiyong Park7c2ee712018-12-07 00:42:25 +09002549func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002550 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002551 apex {
2552 name: "myapex",
2553 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002554 native_shared_libs: ["mylib"],
2555 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002556 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002557 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002558 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002559 }
2560
2561 apex_key {
2562 name: "myapex.key",
2563 public_key: "testkey.avbpubkey",
2564 private_key: "testkey.pem",
2565 }
2566
2567 prebuilt_etc {
2568 name: "myetc",
2569 src: "myprebuilt",
2570 sub_dir: "foo/bar",
2571 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002572
2573 cc_library {
2574 name: "mylib",
2575 srcs: ["mylib.cpp"],
2576 relative_install_path: "foo/bar",
2577 system_shared_libs: [],
2578 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002579 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002580 }
2581
2582 cc_binary {
2583 name: "mybin",
2584 srcs: ["mylib.cpp"],
2585 relative_install_path: "foo/bar",
2586 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002587 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002588 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002589 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002590 `)
2591
Sundong Ahnabb64432019-10-22 13:58:29 +09002592 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002593 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002594
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002595 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002596 ensureContains(t, cmd, "/etc ")
2597 ensureContains(t, cmd, "/etc/foo ")
2598 ensureContains(t, cmd, "/etc/foo/bar ")
2599 ensureContains(t, cmd, "/lib64 ")
2600 ensureContains(t, cmd, "/lib64/foo ")
2601 ensureContains(t, cmd, "/lib64/foo/bar ")
2602 ensureContains(t, cmd, "/lib ")
2603 ensureContains(t, cmd, "/lib/foo ")
2604 ensureContains(t, cmd, "/lib/foo/bar ")
2605 ensureContains(t, cmd, "/bin ")
2606 ensureContains(t, cmd, "/bin/foo ")
2607 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002608}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002609
Jooyung Han35155c42020-02-06 17:33:20 +09002610func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002611 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002612 apex {
2613 name: "myapex",
2614 key: "myapex.key",
2615 multilib: {
2616 both: {
2617 native_shared_libs: ["mylib"],
2618 binaries: ["mybin"],
2619 },
2620 },
2621 compile_multilib: "both",
2622 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002623 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002624 }
2625
2626 apex_key {
2627 name: "myapex.key",
2628 public_key: "testkey.avbpubkey",
2629 private_key: "testkey.pem",
2630 }
2631
2632 cc_library {
2633 name: "mylib",
2634 relative_install_path: "foo/bar",
2635 system_shared_libs: [],
2636 stl: "none",
2637 apex_available: [ "myapex" ],
2638 native_bridge_supported: true,
2639 }
2640
2641 cc_binary {
2642 name: "mybin",
2643 relative_install_path: "foo/bar",
2644 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002645 stl: "none",
2646 apex_available: [ "myapex" ],
2647 native_bridge_supported: true,
2648 compile_multilib: "both", // default is "first" for binary
2649 multilib: {
2650 lib64: {
2651 suffix: "64",
2652 },
2653 },
2654 }
2655 `, withNativeBridgeEnabled)
2656 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2657 "bin/foo/bar/mybin",
2658 "bin/foo/bar/mybin64",
2659 "bin/arm/foo/bar/mybin",
2660 "bin/arm64/foo/bar/mybin64",
2661 "lib/foo/bar/mylib.so",
2662 "lib/arm/foo/bar/mylib.so",
2663 "lib64/foo/bar/mylib.so",
2664 "lib64/arm64/foo/bar/mylib.so",
2665 })
2666}
2667
Jooyung Han85d61762020-06-24 23:50:26 +09002668func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002669 result := android.GroupFixturePreparers(
2670 prepareForApexTest,
2671 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2672 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002673 apex {
2674 name: "myapex",
2675 key: "myapex.key",
2676 binaries: ["mybin"],
2677 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002678 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002679 }
2680 apex_key {
2681 name: "myapex.key",
2682 public_key: "testkey.avbpubkey",
2683 private_key: "testkey.pem",
2684 }
2685 cc_binary {
2686 name: "mybin",
2687 vendor: true,
2688 shared_libs: ["libfoo"],
2689 }
2690 cc_library {
2691 name: "libfoo",
2692 proprietary: true,
2693 }
2694 `)
2695
Colin Crossc68db4b2021-11-11 18:59:15 -08002696 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002697 "bin/mybin",
2698 "lib64/libfoo.so",
2699 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2700 "lib64/libc++.so",
2701 })
2702
Colin Crossc68db4b2021-11-11 18:59:15 -08002703 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2704 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002705 name := apexBundle.BaseModuleName()
2706 prefix := "TARGET_"
2707 var builder strings.Builder
2708 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002709 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002710 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002711 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002712
Colin Crossc68db4b2021-11-11 18:59:15 -08002713 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002714 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2715 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002716}
2717
Jooyung Hanc5a96762022-02-04 11:54:50 +09002718func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2719 testApexError(t, `Trying to include a VNDK library`, `
2720 apex {
2721 name: "myapex",
2722 key: "myapex.key",
2723 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2724 vendor: true,
2725 use_vndk_as_stable: true,
2726 updatable: false,
2727 }
2728 apex_key {
2729 name: "myapex.key",
2730 public_key: "testkey.avbpubkey",
2731 private_key: "testkey.pem",
2732 }`)
2733}
2734
Jooyung Handf78e212020-07-22 15:54:47 +09002735func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002736 // myapex myapex2
2737 // | |
2738 // mybin ------. mybin2
2739 // \ \ / |
2740 // (stable) .---\--------` |
2741 // \ / \ |
2742 // \ / \ /
2743 // libvndk libvendor
2744 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002745 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002746 apex {
2747 name: "myapex",
2748 key: "myapex.key",
2749 binaries: ["mybin"],
2750 vendor: true,
2751 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002752 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002753 }
2754 apex_key {
2755 name: "myapex.key",
2756 public_key: "testkey.avbpubkey",
2757 private_key: "testkey.pem",
2758 }
2759 cc_binary {
2760 name: "mybin",
2761 vendor: true,
2762 shared_libs: ["libvndk", "libvendor"],
2763 }
2764 cc_library {
2765 name: "libvndk",
2766 vndk: {
2767 enabled: true,
2768 },
2769 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002770 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002771 }
2772 cc_library {
2773 name: "libvendor",
2774 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002775 stl: "none",
2776 }
2777 apex {
2778 name: "myapex2",
2779 key: "myapex.key",
2780 binaries: ["mybin2"],
2781 vendor: true,
2782 use_vndk_as_stable: false,
2783 updatable: false,
2784 }
2785 cc_binary {
2786 name: "mybin2",
2787 vendor: true,
2788 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002789 }
2790 `)
2791
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002792 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002793
Jooyung Han91f92032022-02-04 12:36:33 +09002794 for _, tc := range []struct {
2795 name string
2796 apexName string
2797 moduleName string
2798 moduleVariant string
2799 libs []string
2800 contents []string
2801 requireVndkNamespace bool
2802 }{
2803 {
2804 name: "use_vndk_as_stable",
2805 apexName: "myapex",
2806 moduleName: "mybin",
2807 moduleVariant: vendorVariant + "_apex10000",
2808 libs: []string{
2809 // should link with vendor variants of VNDK libs(libvndk/libc++)
2810 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2811 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2812 // unstable Vendor libs as APEX variant
2813 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2814 },
2815 contents: []string{
2816 "bin/mybin",
2817 "lib64/libvendor.so",
2818 // VNDK libs (libvndk/libc++) are not included
2819 },
2820 requireVndkNamespace: true,
2821 },
2822 {
2823 name: "!use_vndk_as_stable",
2824 apexName: "myapex2",
2825 moduleName: "mybin2",
2826 moduleVariant: vendorVariant + "_myapex2",
2827 libs: []string{
2828 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2829 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2830 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2831 // unstable vendor libs have "merged" APEX variants
2832 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2833 },
2834 contents: []string{
2835 "bin/mybin2",
2836 "lib64/libvendor.so",
2837 // VNDK libs are included as well
2838 "lib64/libvndk.so",
2839 "lib64/libc++.so",
2840 },
2841 requireVndkNamespace: false,
2842 },
2843 } {
2844 t.Run(tc.name, func(t *testing.T) {
2845 // Check linked libs
2846 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2847 libs := names(ldRule.Args["libFlags"])
2848 for _, lib := range tc.libs {
2849 ensureListContains(t, libs, lib)
2850 }
2851 // Check apex contents
2852 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002853
Jooyung Han91f92032022-02-04 12:36:33 +09002854 // Check "requireNativeLibs"
2855 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2856 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2857 if tc.requireVndkNamespace {
2858 ensureListContains(t, requireNativeLibs, ":vndk")
2859 } else {
2860 ensureListNotContains(t, requireNativeLibs, ":vndk")
2861 }
2862 })
2863 }
Jooyung Handf78e212020-07-22 15:54:47 +09002864}
2865
Justin Yun13decfb2021-03-08 19:25:55 +09002866func TestProductVariant(t *testing.T) {
2867 ctx := testApex(t, `
2868 apex {
2869 name: "myapex",
2870 key: "myapex.key",
2871 updatable: false,
2872 product_specific: true,
2873 binaries: ["foo"],
2874 }
2875
2876 apex_key {
2877 name: "myapex.key",
2878 public_key: "testkey.avbpubkey",
2879 private_key: "testkey.pem",
2880 }
2881
2882 cc_binary {
2883 name: "foo",
2884 product_available: true,
2885 apex_available: ["myapex"],
2886 srcs: ["foo.cpp"],
2887 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002888 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2889 variables.ProductVndkVersion = proptools.StringPtr("current")
2890 }),
2891 )
Justin Yun13decfb2021-03-08 19:25:55 +09002892
2893 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002894 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002895 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2896 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2897 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2898 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2899}
2900
Jooyung Han8e5685d2020-09-21 11:02:57 +09002901func TestApex_withPrebuiltFirmware(t *testing.T) {
2902 testCases := []struct {
2903 name string
2904 additionalProp string
2905 }{
2906 {"system apex with prebuilt_firmware", ""},
2907 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2908 }
2909 for _, tc := range testCases {
2910 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002911 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002912 apex {
2913 name: "myapex",
2914 key: "myapex.key",
2915 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002916 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002917 `+tc.additionalProp+`
2918 }
2919 apex_key {
2920 name: "myapex.key",
2921 public_key: "testkey.avbpubkey",
2922 private_key: "testkey.pem",
2923 }
2924 prebuilt_firmware {
2925 name: "myfirmware",
2926 src: "myfirmware.bin",
2927 filename_from_src: true,
2928 `+tc.additionalProp+`
2929 }
2930 `)
2931 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2932 "etc/firmware/myfirmware.bin",
2933 })
2934 })
2935 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002936}
2937
Jooyung Hanefb184e2020-06-25 17:14:25 +09002938func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002939 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002940 apex {
2941 name: "myapex",
2942 key: "myapex.key",
2943 vendor: true,
2944 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002945 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002946 }
2947
2948 apex_key {
2949 name: "myapex.key",
2950 public_key: "testkey.avbpubkey",
2951 private_key: "testkey.pem",
2952 }
2953
2954 cc_library {
2955 name: "mylib",
2956 vendor_available: true,
2957 }
2958 `)
2959
2960 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002961 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002962 name := apexBundle.BaseModuleName()
2963 prefix := "TARGET_"
2964 var builder strings.Builder
2965 data.Custom(&builder, name, prefix, "", data)
2966 androidMk := builder.String()
2967 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2968}
2969
Jooyung Han2ed99d02020-06-24 23:26:26 +09002970func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002971 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002972 apex {
2973 name: "myapex",
2974 key: "myapex.key",
2975 vintf_fragments: ["fragment.xml"],
2976 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002977 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002978 }
2979 apex_key {
2980 name: "myapex.key",
2981 public_key: "testkey.avbpubkey",
2982 private_key: "testkey.pem",
2983 }
2984 cc_binary {
2985 name: "mybin",
2986 }
2987 `)
2988
2989 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002990 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002991 name := apexBundle.BaseModuleName()
2992 prefix := "TARGET_"
2993 var builder strings.Builder
2994 data.Custom(&builder, name, prefix, "", data)
2995 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002996 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002997 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002998}
2999
Jiyong Park16e91a02018-12-20 18:18:08 +09003000func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003001 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003002 apex {
3003 name: "myapex",
3004 key: "myapex.key",
3005 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003006 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003007 }
3008
3009 apex_key {
3010 name: "myapex.key",
3011 public_key: "testkey.avbpubkey",
3012 private_key: "testkey.pem",
3013 }
3014
3015 cc_library {
3016 name: "mylib",
3017 srcs: ["mylib.cpp"],
3018 system_shared_libs: [],
3019 stl: "none",
3020 stubs: {
3021 versions: ["1", "2", "3"],
3022 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003023 apex_available: [
3024 "//apex_available:platform",
3025 "myapex",
3026 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003027 }
3028
3029 cc_binary {
3030 name: "not_in_apex",
3031 srcs: ["mylib.cpp"],
3032 static_libs: ["mylib"],
3033 static_executable: true,
3034 system_shared_libs: [],
3035 stl: "none",
3036 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003037 `)
3038
Colin Cross7113d202019-11-20 16:39:12 -08003039 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003040
3041 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003042 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003043}
Jiyong Park9335a262018-12-24 11:31:58 +09003044
3045func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003046 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003047 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003048 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003049 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003050 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003051 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003052 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003053 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003054 }
3055
3056 cc_library {
3057 name: "mylib",
3058 srcs: ["mylib.cpp"],
3059 system_shared_libs: [],
3060 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003061 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003062 }
3063
3064 apex_key {
3065 name: "myapex.key",
3066 public_key: "testkey.avbpubkey",
3067 private_key: "testkey.pem",
3068 }
3069
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003070 android_app_certificate {
3071 name: "myapex.certificate",
3072 certificate: "testkey",
3073 }
3074
3075 android_app_certificate {
3076 name: "myapex.certificate.override",
3077 certificate: "testkey.override",
3078 }
3079
Jiyong Park9335a262018-12-24 11:31:58 +09003080 `)
3081
3082 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003083 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003084
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003085 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3086 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003087 "vendor/foo/devkeys/testkey.avbpubkey")
3088 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003089 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3090 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003091 "vendor/foo/devkeys/testkey.pem")
3092 }
3093
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003094 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003095 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003096 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003097 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003098 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003099 }
3100}
Jiyong Park58e364a2019-01-19 19:24:06 +09003101
Jooyung Hanf121a652019-12-17 14:30:11 +09003102func TestCertificate(t *testing.T) {
3103 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003104 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003105 apex {
3106 name: "myapex",
3107 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003108 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003109 }
3110 apex_key {
3111 name: "myapex.key",
3112 public_key: "testkey.avbpubkey",
3113 private_key: "testkey.pem",
3114 }`)
3115 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3116 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3117 if actual := rule.Args["certificates"]; actual != expected {
3118 t.Errorf("certificates should be %q, not %q", expected, actual)
3119 }
3120 })
3121 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003122 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003123 apex {
3124 name: "myapex_keytest",
3125 key: "myapex.key",
3126 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003127 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003128 }
3129 apex_key {
3130 name: "myapex.key",
3131 public_key: "testkey.avbpubkey",
3132 private_key: "testkey.pem",
3133 }
3134 android_app_certificate {
3135 name: "myapex.certificate.override",
3136 certificate: "testkey.override",
3137 }`)
3138 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3139 expected := "testkey.override.x509.pem testkey.override.pk8"
3140 if actual := rule.Args["certificates"]; actual != expected {
3141 t.Errorf("certificates should be %q, not %q", expected, actual)
3142 }
3143 })
3144 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003145 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003146 apex {
3147 name: "myapex",
3148 key: "myapex.key",
3149 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003150 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003151 }
3152 apex_key {
3153 name: "myapex.key",
3154 public_key: "testkey.avbpubkey",
3155 private_key: "testkey.pem",
3156 }
3157 android_app_certificate {
3158 name: "myapex.certificate",
3159 certificate: "testkey",
3160 }`)
3161 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3162 expected := "testkey.x509.pem testkey.pk8"
3163 if actual := rule.Args["certificates"]; actual != expected {
3164 t.Errorf("certificates should be %q, not %q", expected, actual)
3165 }
3166 })
3167 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003168 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003169 apex {
3170 name: "myapex_keytest",
3171 key: "myapex.key",
3172 file_contexts: ":myapex-file_contexts",
3173 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003174 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003175 }
3176 apex_key {
3177 name: "myapex.key",
3178 public_key: "testkey.avbpubkey",
3179 private_key: "testkey.pem",
3180 }
3181 android_app_certificate {
3182 name: "myapex.certificate.override",
3183 certificate: "testkey.override",
3184 }`)
3185 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3186 expected := "testkey.override.x509.pem testkey.override.pk8"
3187 if actual := rule.Args["certificates"]; actual != expected {
3188 t.Errorf("certificates should be %q, not %q", expected, actual)
3189 }
3190 })
3191 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003192 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003193 apex {
3194 name: "myapex",
3195 key: "myapex.key",
3196 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003197 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003198 }
3199 apex_key {
3200 name: "myapex.key",
3201 public_key: "testkey.avbpubkey",
3202 private_key: "testkey.pem",
3203 }`)
3204 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3205 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3206 if actual := rule.Args["certificates"]; actual != expected {
3207 t.Errorf("certificates should be %q, not %q", expected, actual)
3208 }
3209 })
3210 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003211 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003212 apex {
3213 name: "myapex_keytest",
3214 key: "myapex.key",
3215 file_contexts: ":myapex-file_contexts",
3216 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003217 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003218 }
3219 apex_key {
3220 name: "myapex.key",
3221 public_key: "testkey.avbpubkey",
3222 private_key: "testkey.pem",
3223 }
3224 android_app_certificate {
3225 name: "myapex.certificate.override",
3226 certificate: "testkey.override",
3227 }`)
3228 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3229 expected := "testkey.override.x509.pem testkey.override.pk8"
3230 if actual := rule.Args["certificates"]; actual != expected {
3231 t.Errorf("certificates should be %q, not %q", expected, actual)
3232 }
3233 })
3234}
3235
Jiyong Park58e364a2019-01-19 19:24:06 +09003236func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003237 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003238 apex {
3239 name: "myapex",
3240 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003241 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003242 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003243 }
3244
3245 apex {
3246 name: "otherapex",
3247 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003248 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003249 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003250 }
3251
3252 apex_key {
3253 name: "myapex.key",
3254 public_key: "testkey.avbpubkey",
3255 private_key: "testkey.pem",
3256 }
3257
3258 cc_library {
3259 name: "mylib",
3260 srcs: ["mylib.cpp"],
3261 system_shared_libs: [],
3262 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003263 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003264 "myapex",
3265 "otherapex",
3266 ],
Jooyung Han24282772020-03-21 23:20:55 +09003267 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003268 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003269 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003270 cc_library {
3271 name: "mylib2",
3272 srcs: ["mylib.cpp"],
3273 system_shared_libs: [],
3274 stl: "none",
3275 apex_available: [
3276 "myapex",
3277 "otherapex",
3278 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003279 static_libs: ["mylib3"],
3280 recovery_available: true,
3281 min_sdk_version: "29",
3282 }
3283 cc_library {
3284 name: "mylib3",
3285 srcs: ["mylib.cpp"],
3286 system_shared_libs: [],
3287 stl: "none",
3288 apex_available: [
3289 "myapex",
3290 "otherapex",
3291 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003292 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003293 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003294 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003295 `)
3296
Jooyung Hanc87a0592020-03-02 17:44:33 +09003297 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003298 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003299 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003300 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003301
Jooyung Hanccce2f22020-03-07 03:45:53 +09003302 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003303 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003304 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003305 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003306
Jooyung Hanccce2f22020-03-07 03:45:53 +09003307 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003308 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003309 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003310 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003311
Colin Crossaede88c2020-08-11 12:17:01 -07003312 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3313 // each variant defines additional macros to distinguish which apex variant it is built for
3314
3315 // non-APEX variant does not have __ANDROID_APEX__ defined
3316 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3317 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3318
Dan Albertb19953d2020-11-17 15:29:36 -08003319 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003320 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3321 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003322 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003323
Jooyung Hanc87a0592020-03-02 17:44:33 +09003324 // non-APEX variant does not have __ANDROID_APEX__ defined
3325 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3326 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3327
Dan Albertb19953d2020-11-17 15:29:36 -08003328 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003329 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003330 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003331 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003332}
Jiyong Park7e636d02019-01-28 16:16:54 +09003333
3334func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003335 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003336 apex {
3337 name: "myapex",
3338 key: "myapex.key",
3339 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003340 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003341 }
3342
3343 apex_key {
3344 name: "myapex.key",
3345 public_key: "testkey.avbpubkey",
3346 private_key: "testkey.pem",
3347 }
3348
3349 cc_library_headers {
3350 name: "mylib_headers",
3351 export_include_dirs: ["my_include"],
3352 system_shared_libs: [],
3353 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003354 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003355 }
3356
3357 cc_library {
3358 name: "mylib",
3359 srcs: ["mylib.cpp"],
3360 system_shared_libs: [],
3361 stl: "none",
3362 header_libs: ["mylib_headers"],
3363 export_header_lib_headers: ["mylib_headers"],
3364 stubs: {
3365 versions: ["1", "2", "3"],
3366 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003367 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003368 }
3369
3370 cc_library {
3371 name: "otherlib",
3372 srcs: ["mylib.cpp"],
3373 system_shared_libs: [],
3374 stl: "none",
3375 shared_libs: ["mylib"],
3376 }
3377 `)
3378
Colin Cross7113d202019-11-20 16:39:12 -08003379 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003380
3381 // Ensure that the include path of the header lib is exported to 'otherlib'
3382 ensureContains(t, cFlags, "-Imy_include")
3383}
Alex Light9670d332019-01-29 18:07:33 -08003384
Jiyong Park7cd10e32020-01-14 09:22:18 +09003385type fileInApex struct {
3386 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003387 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003388 isLink bool
3389}
3390
Jooyung Hana57af4a2020-01-23 05:36:59 +00003391func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003392 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003393 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003394 copyCmds := apexRule.Args["copy_commands"]
3395 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003396 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003397 for _, cmd := range strings.Split(copyCmds, "&&") {
3398 cmd = strings.TrimSpace(cmd)
3399 if cmd == "" {
3400 continue
3401 }
3402 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003403 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003404 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003405 switch terms[0] {
3406 case "mkdir":
3407 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003408 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003409 t.Fatal("copyCmds contains invalid cp command", cmd)
3410 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003411 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003412 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003413 isLink = false
3414 case "ln":
3415 if len(terms) != 3 && len(terms) != 4 {
3416 // ln LINK TARGET or ln -s LINK TARGET
3417 t.Fatal("copyCmds contains invalid ln command", cmd)
3418 }
3419 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003420 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003421 isLink = true
3422 default:
3423 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3424 }
3425 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003426 index := strings.Index(dst, imageApexDir)
3427 if index == -1 {
3428 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3429 }
3430 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003431 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003432 }
3433 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003434 return ret
3435}
3436
Jooyung Hana57af4a2020-01-23 05:36:59 +00003437func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3438 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003439 var failed bool
3440 var surplus []string
3441 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003442 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003443 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003444 for _, expected := range files {
3445 if matched, _ := path.Match(expected, file.path); matched {
3446 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003447 mactchFound = true
3448 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003449 }
3450 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003451 if !mactchFound {
3452 surplus = append(surplus, file.path)
3453 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003454 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003455
Jooyung Han31c470b2019-10-18 16:26:59 +09003456 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003457 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003458 t.Log("surplus files", surplus)
3459 failed = true
3460 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003461
3462 if len(files) > len(filesMatched) {
3463 var missing []string
3464 for _, expected := range files {
3465 if !filesMatched[expected] {
3466 missing = append(missing, expected)
3467 }
3468 }
3469 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003470 t.Log("missing files", missing)
3471 failed = true
3472 }
3473 if failed {
3474 t.Fail()
3475 }
3476}
3477
Jooyung Han344d5432019-08-23 11:17:39 +09003478func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003479 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003480 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003481 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003482 "etc/llndk.libraries.29.txt",
3483 "etc/vndkcore.libraries.29.txt",
3484 "etc/vndksp.libraries.29.txt",
3485 "etc/vndkprivate.libraries.29.txt",
3486 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003487 }
3488 testCases := []struct {
3489 vndkVersion string
3490 expectedFiles []string
3491 }{
3492 {
3493 vndkVersion: "current",
3494 expectedFiles: append(commonFiles,
3495 "lib/libvndk.so",
3496 "lib/libvndksp.so",
3497 "lib64/libvndk.so",
3498 "lib64/libvndksp.so"),
3499 },
3500 {
3501 vndkVersion: "",
3502 expectedFiles: append(commonFiles,
3503 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3504 "lib/libvndksp.so",
3505 "lib64/libvndksp.so"),
3506 },
3507 }
3508 for _, tc := range testCases {
3509 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3510 ctx := testApex(t, `
3511 apex_vndk {
3512 name: "com.android.vndk.current",
3513 key: "com.android.vndk.current.key",
3514 updatable: false,
3515 }
3516
3517 apex_key {
3518 name: "com.android.vndk.current.key",
3519 public_key: "testkey.avbpubkey",
3520 private_key: "testkey.pem",
3521 }
3522
3523 cc_library {
3524 name: "libvndk",
3525 srcs: ["mylib.cpp"],
3526 vendor_available: true,
3527 product_available: true,
3528 vndk: {
3529 enabled: true,
3530 },
3531 system_shared_libs: [],
3532 stl: "none",
3533 apex_available: [ "com.android.vndk.current" ],
3534 }
3535
3536 cc_library {
3537 name: "libvndksp",
3538 srcs: ["mylib.cpp"],
3539 vendor_available: true,
3540 product_available: true,
3541 vndk: {
3542 enabled: true,
3543 support_system_process: true,
3544 },
3545 system_shared_libs: [],
3546 stl: "none",
3547 apex_available: [ "com.android.vndk.current" ],
3548 }
3549
3550 // VNDK-Ext should not cause any problems
3551
3552 cc_library {
3553 name: "libvndk.ext",
3554 srcs: ["mylib2.cpp"],
3555 vendor: true,
3556 vndk: {
3557 enabled: true,
3558 extends: "libvndk",
3559 },
3560 system_shared_libs: [],
3561 stl: "none",
3562 }
3563
3564 cc_library {
3565 name: "libvndksp.ext",
3566 srcs: ["mylib2.cpp"],
3567 vendor: true,
3568 vndk: {
3569 enabled: true,
3570 support_system_process: true,
3571 extends: "libvndksp",
3572 },
3573 system_shared_libs: [],
3574 stl: "none",
3575 }
3576 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3577 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3578 }))
3579 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3580 })
3581 }
Jooyung Han344d5432019-08-23 11:17:39 +09003582}
3583
3584func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003585 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003586 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003587 name: "com.android.vndk.current",
3588 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003589 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003590 }
3591
3592 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003593 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003594 public_key: "testkey.avbpubkey",
3595 private_key: "testkey.pem",
3596 }
3597
3598 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003599 name: "libvndk",
3600 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003601 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003602 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003603 vndk: {
3604 enabled: true,
3605 },
3606 system_shared_libs: [],
3607 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003608 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003609 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003610
3611 cc_prebuilt_library_shared {
3612 name: "libvndk.arm",
3613 srcs: ["libvndk.arm.so"],
3614 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003615 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003616 vndk: {
3617 enabled: true,
3618 },
3619 enabled: false,
3620 arch: {
3621 arm: {
3622 enabled: true,
3623 },
3624 },
3625 system_shared_libs: [],
3626 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003627 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003628 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003629 `+vndkLibrariesTxtFiles("current"),
3630 withFiles(map[string][]byte{
3631 "libvndk.so": nil,
3632 "libvndk.arm.so": nil,
3633 }))
Colin Cross2807f002021-03-02 10:15:29 -08003634 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003635 "lib/libvndk.so",
3636 "lib/libvndk.arm.so",
3637 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003638 "lib/libc++.so",
3639 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003640 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003641 })
Jooyung Han344d5432019-08-23 11:17:39 +09003642}
3643
Jooyung Han39edb6c2019-11-06 16:53:07 +09003644func vndkLibrariesTxtFiles(vers ...string) (result string) {
3645 for _, v := range vers {
3646 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003647 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003648 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003649 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003650 name: "` + txt + `.libraries.txt",
3651 }
3652 `
3653 }
3654 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003655 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003656 result += `
3657 prebuilt_etc {
3658 name: "` + txt + `.libraries.` + v + `.txt",
3659 src: "dummy.txt",
3660 }
3661 `
3662 }
3663 }
3664 }
3665 return
3666}
3667
Jooyung Han344d5432019-08-23 11:17:39 +09003668func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003669 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003670 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003671 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003672 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003673 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003674 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003675 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003676 }
3677
3678 apex_key {
3679 name: "myapex.key",
3680 public_key: "testkey.avbpubkey",
3681 private_key: "testkey.pem",
3682 }
3683
Jooyung Han31c470b2019-10-18 16:26:59 +09003684 vndk_prebuilt_shared {
3685 name: "libvndk27",
3686 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003687 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003688 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003689 vndk: {
3690 enabled: true,
3691 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003692 target_arch: "arm64",
3693 arch: {
3694 arm: {
3695 srcs: ["libvndk27_arm.so"],
3696 },
3697 arm64: {
3698 srcs: ["libvndk27_arm64.so"],
3699 },
3700 },
Colin Cross2807f002021-03-02 10:15:29 -08003701 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003702 }
3703
3704 vndk_prebuilt_shared {
3705 name: "libvndk27",
3706 version: "27",
3707 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003708 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003709 vndk: {
3710 enabled: true,
3711 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003712 target_arch: "x86_64",
3713 arch: {
3714 x86: {
3715 srcs: ["libvndk27_x86.so"],
3716 },
3717 x86_64: {
3718 srcs: ["libvndk27_x86_64.so"],
3719 },
3720 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003721 }
3722 `+vndkLibrariesTxtFiles("27"),
3723 withFiles(map[string][]byte{
3724 "libvndk27_arm.so": nil,
3725 "libvndk27_arm64.so": nil,
3726 "libvndk27_x86.so": nil,
3727 "libvndk27_x86_64.so": nil,
3728 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003729
Colin Cross2807f002021-03-02 10:15:29 -08003730 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003731 "lib/libvndk27_arm.so",
3732 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003733 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003734 })
Jooyung Han344d5432019-08-23 11:17:39 +09003735}
3736
Jooyung Han90eee022019-10-01 20:02:42 +09003737func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003738 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003739 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003740 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003741 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003742 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003743 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003744 }
3745 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003746 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003747 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003748 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003749 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003750 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003751 }
3752 apex_key {
3753 name: "myapex.key",
3754 public_key: "testkey.avbpubkey",
3755 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003756 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003757
3758 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003759 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003760 actual := proptools.String(bundle.properties.Apex_name)
3761 if !reflect.DeepEqual(actual, expected) {
3762 t.Errorf("Got '%v', expected '%v'", actual, expected)
3763 }
3764 }
3765
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003766 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003767 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003768}
3769
Jooyung Han344d5432019-08-23 11:17:39 +09003770func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003771 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003772 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003773 name: "com.android.vndk.current",
3774 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003775 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003776 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003777 }
3778
3779 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003780 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003781 public_key: "testkey.avbpubkey",
3782 private_key: "testkey.pem",
3783 }
3784
3785 cc_library {
3786 name: "libvndk",
3787 srcs: ["mylib.cpp"],
3788 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003789 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003790 native_bridge_supported: true,
3791 host_supported: true,
3792 vndk: {
3793 enabled: true,
3794 },
3795 system_shared_libs: [],
3796 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003797 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003798 }
Colin Cross2807f002021-03-02 10:15:29 -08003799 `+vndkLibrariesTxtFiles("current"),
3800 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003801
Colin Cross2807f002021-03-02 10:15:29 -08003802 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003803 "lib/libvndk.so",
3804 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003805 "lib/libc++.so",
3806 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003807 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003808 })
Jooyung Han344d5432019-08-23 11:17:39 +09003809}
3810
3811func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003812 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003813 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003814 name: "com.android.vndk.current",
3815 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003816 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003817 native_bridge_supported: true,
3818 }
3819
3820 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003821 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003822 public_key: "testkey.avbpubkey",
3823 private_key: "testkey.pem",
3824 }
3825
3826 cc_library {
3827 name: "libvndk",
3828 srcs: ["mylib.cpp"],
3829 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003830 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003831 native_bridge_supported: true,
3832 host_supported: true,
3833 vndk: {
3834 enabled: true,
3835 },
3836 system_shared_libs: [],
3837 stl: "none",
3838 }
3839 `)
3840}
3841
Jooyung Han31c470b2019-10-18 16:26:59 +09003842func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003843 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003844 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003845 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003846 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003847 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003848 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003849 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003850 }
3851
3852 apex_key {
3853 name: "myapex.key",
3854 public_key: "testkey.avbpubkey",
3855 private_key: "testkey.pem",
3856 }
3857
3858 vndk_prebuilt_shared {
3859 name: "libvndk27",
3860 version: "27",
3861 target_arch: "arm",
3862 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003863 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003864 vndk: {
3865 enabled: true,
3866 },
3867 arch: {
3868 arm: {
3869 srcs: ["libvndk27.so"],
3870 }
3871 },
3872 }
3873
3874 vndk_prebuilt_shared {
3875 name: "libvndk27",
3876 version: "27",
3877 target_arch: "arm",
3878 binder32bit: true,
3879 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003880 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003881 vndk: {
3882 enabled: true,
3883 },
3884 arch: {
3885 arm: {
3886 srcs: ["libvndk27binder32.so"],
3887 }
3888 },
Colin Cross2807f002021-03-02 10:15:29 -08003889 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003890 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003891 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003892 withFiles(map[string][]byte{
3893 "libvndk27.so": nil,
3894 "libvndk27binder32.so": nil,
3895 }),
3896 withBinder32bit,
3897 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003898 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003899 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3900 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003901 },
3902 }),
3903 )
3904
Colin Cross2807f002021-03-02 10:15:29 -08003905 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003906 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003907 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003908 })
3909}
3910
Jooyung Han45a96772020-06-15 14:59:42 +09003911func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003912 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003913 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003914 name: "com.android.vndk.current",
3915 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003916 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003917 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003918 }
3919
3920 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003921 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003922 public_key: "testkey.avbpubkey",
3923 private_key: "testkey.pem",
3924 }
3925
3926 cc_library {
3927 name: "libz",
3928 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003929 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003930 vndk: {
3931 enabled: true,
3932 },
3933 stubs: {
3934 symbol_file: "libz.map.txt",
3935 versions: ["30"],
3936 }
3937 }
3938 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3939 "libz.map.txt": nil,
3940 }))
3941
Colin Cross2807f002021-03-02 10:15:29 -08003942 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003943 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3944 ensureListEmpty(t, provideNativeLibs)
3945}
3946
Jooyung Hane1633032019-08-01 17:41:43 +09003947func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003948 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003949 apex {
3950 name: "myapex_nodep",
3951 key: "myapex.key",
3952 native_shared_libs: ["lib_nodep"],
3953 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003954 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003955 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003956 }
3957
3958 apex {
3959 name: "myapex_dep",
3960 key: "myapex.key",
3961 native_shared_libs: ["lib_dep"],
3962 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003963 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003964 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003965 }
3966
3967 apex {
3968 name: "myapex_provider",
3969 key: "myapex.key",
3970 native_shared_libs: ["libfoo"],
3971 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003972 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003973 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003974 }
3975
3976 apex {
3977 name: "myapex_selfcontained",
3978 key: "myapex.key",
3979 native_shared_libs: ["lib_dep", "libfoo"],
3980 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003981 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003982 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003983 }
3984
3985 apex_key {
3986 name: "myapex.key",
3987 public_key: "testkey.avbpubkey",
3988 private_key: "testkey.pem",
3989 }
3990
3991 cc_library {
3992 name: "lib_nodep",
3993 srcs: ["mylib.cpp"],
3994 system_shared_libs: [],
3995 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003996 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003997 }
3998
3999 cc_library {
4000 name: "lib_dep",
4001 srcs: ["mylib.cpp"],
4002 shared_libs: ["libfoo"],
4003 system_shared_libs: [],
4004 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004005 apex_available: [
4006 "myapex_dep",
4007 "myapex_provider",
4008 "myapex_selfcontained",
4009 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004010 }
4011
4012 cc_library {
4013 name: "libfoo",
4014 srcs: ["mytest.cpp"],
4015 stubs: {
4016 versions: ["1"],
4017 },
4018 system_shared_libs: [],
4019 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004020 apex_available: [
4021 "myapex_provider",
4022 "myapex_selfcontained",
4023 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004024 }
4025 `)
4026
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004027 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004028 var provideNativeLibs, requireNativeLibs []string
4029
Sundong Ahnabb64432019-10-22 13:58:29 +09004030 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004031 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4032 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004033 ensureListEmpty(t, provideNativeLibs)
4034 ensureListEmpty(t, requireNativeLibs)
4035
Sundong Ahnabb64432019-10-22 13:58:29 +09004036 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004037 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4038 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004039 ensureListEmpty(t, provideNativeLibs)
4040 ensureListContains(t, requireNativeLibs, "libfoo.so")
4041
Sundong Ahnabb64432019-10-22 13:58:29 +09004042 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004043 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4044 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004045 ensureListContains(t, provideNativeLibs, "libfoo.so")
4046 ensureListEmpty(t, requireNativeLibs)
4047
Sundong Ahnabb64432019-10-22 13:58:29 +09004048 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004049 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4050 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004051 ensureListContains(t, provideNativeLibs, "libfoo.so")
4052 ensureListEmpty(t, requireNativeLibs)
4053}
4054
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004055func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004056 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004057 apex {
4058 name: "myapex",
4059 key: "myapex.key",
4060 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004061 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004062 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004063 }
4064
4065 apex_key {
4066 name: "myapex.key",
4067 public_key: "testkey.avbpubkey",
4068 private_key: "testkey.pem",
4069 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004070
4071 cc_library {
4072 name: "mylib",
4073 srcs: ["mylib.cpp"],
4074 system_shared_libs: [],
4075 stl: "none",
4076 apex_available: [
4077 "//apex_available:platform",
4078 "myapex",
4079 ],
4080 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004081 `)
4082
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004083 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004084 apexManifestRule := module.Rule("apexManifestRule")
4085 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4086 apexRule := module.Rule("apexRule")
4087 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004088
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004089 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004090 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004091 name := apexBundle.BaseModuleName()
4092 prefix := "TARGET_"
4093 var builder strings.Builder
4094 data.Custom(&builder, name, prefix, "", data)
4095 androidMk := builder.String()
4096 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4097 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004098}
4099
Alex Light0851b882019-02-07 13:20:53 -08004100func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004101 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004102 apex {
4103 name: "myapex",
4104 key: "myapex.key",
4105 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004106 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004107 }
4108
4109 apex_key {
4110 name: "myapex.key",
4111 public_key: "testkey.avbpubkey",
4112 private_key: "testkey.pem",
4113 }
4114
4115 cc_library {
4116 name: "mylib_common",
4117 srcs: ["mylib.cpp"],
4118 system_shared_libs: [],
4119 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004120 apex_available: [
4121 "//apex_available:platform",
4122 "myapex",
4123 ],
Alex Light0851b882019-02-07 13:20:53 -08004124 }
4125 `)
4126
Sundong Ahnabb64432019-10-22 13:58:29 +09004127 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004128 apexRule := module.Rule("apexRule")
4129 copyCmds := apexRule.Args["copy_commands"]
4130
4131 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4132 t.Log("Apex was a test apex!")
4133 t.Fail()
4134 }
4135 // Ensure that main rule creates an output
4136 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4137
4138 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004139 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004140
4141 // Ensure that both direct and indirect deps are copied into apex
4142 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4143
Colin Cross7113d202019-11-20 16:39:12 -08004144 // Ensure that the platform variant ends with _shared
4145 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004146
Colin Cross56a83212020-09-15 18:30:11 -07004147 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004148 t.Log("Found mylib_common not in any apex!")
4149 t.Fail()
4150 }
4151}
4152
4153func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004154 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004155 apex_test {
4156 name: "myapex",
4157 key: "myapex.key",
4158 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004159 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004160 }
4161
4162 apex_key {
4163 name: "myapex.key",
4164 public_key: "testkey.avbpubkey",
4165 private_key: "testkey.pem",
4166 }
4167
4168 cc_library {
4169 name: "mylib_common_test",
4170 srcs: ["mylib.cpp"],
4171 system_shared_libs: [],
4172 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004173 // TODO: remove //apex_available:platform
4174 apex_available: [
4175 "//apex_available:platform",
4176 "myapex",
4177 ],
Alex Light0851b882019-02-07 13:20:53 -08004178 }
4179 `)
4180
Sundong Ahnabb64432019-10-22 13:58:29 +09004181 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004182 apexRule := module.Rule("apexRule")
4183 copyCmds := apexRule.Args["copy_commands"]
4184
4185 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4186 t.Log("Apex was not a test apex!")
4187 t.Fail()
4188 }
4189 // Ensure that main rule creates an output
4190 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4191
4192 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004193 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004194
4195 // Ensure that both direct and indirect deps are copied into apex
4196 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4197
Colin Cross7113d202019-11-20 16:39:12 -08004198 // Ensure that the platform variant ends with _shared
4199 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004200}
4201
Alex Light9670d332019-01-29 18:07:33 -08004202func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004203 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004204 apex {
4205 name: "myapex",
4206 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004207 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004208 multilib: {
4209 first: {
4210 native_shared_libs: ["mylib_common"],
4211 }
4212 },
4213 target: {
4214 android: {
4215 multilib: {
4216 first: {
4217 native_shared_libs: ["mylib"],
4218 }
4219 }
4220 },
4221 host: {
4222 multilib: {
4223 first: {
4224 native_shared_libs: ["mylib2"],
4225 }
4226 }
4227 }
4228 }
4229 }
4230
4231 apex_key {
4232 name: "myapex.key",
4233 public_key: "testkey.avbpubkey",
4234 private_key: "testkey.pem",
4235 }
4236
4237 cc_library {
4238 name: "mylib",
4239 srcs: ["mylib.cpp"],
4240 system_shared_libs: [],
4241 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004242 // TODO: remove //apex_available:platform
4243 apex_available: [
4244 "//apex_available:platform",
4245 "myapex",
4246 ],
Alex Light9670d332019-01-29 18:07:33 -08004247 }
4248
4249 cc_library {
4250 name: "mylib_common",
4251 srcs: ["mylib.cpp"],
4252 system_shared_libs: [],
4253 stl: "none",
4254 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004255 // TODO: remove //apex_available:platform
4256 apex_available: [
4257 "//apex_available:platform",
4258 "myapex",
4259 ],
Alex Light9670d332019-01-29 18:07:33 -08004260 }
4261
4262 cc_library {
4263 name: "mylib2",
4264 srcs: ["mylib.cpp"],
4265 system_shared_libs: [],
4266 stl: "none",
4267 compile_multilib: "first",
4268 }
4269 `)
4270
Sundong Ahnabb64432019-10-22 13:58:29 +09004271 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004272 copyCmds := apexRule.Args["copy_commands"]
4273
4274 // Ensure that main rule creates an output
4275 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4276
4277 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004278 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4279 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4280 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004281
4282 // Ensure that both direct and indirect deps are copied into apex
4283 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4284 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4285 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4286
Colin Cross7113d202019-11-20 16:39:12 -08004287 // Ensure that the platform variant ends with _shared
4288 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4289 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4290 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004291}
Jiyong Park04480cf2019-02-06 00:16:29 +09004292
Jiyong Park59140302020-12-14 18:44:04 +09004293func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004294 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004295 apex {
4296 name: "myapex",
4297 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004298 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004299 arch: {
4300 arm64: {
4301 native_shared_libs: ["mylib.arm64"],
4302 },
4303 x86_64: {
4304 native_shared_libs: ["mylib.x64"],
4305 },
4306 }
4307 }
4308
4309 apex_key {
4310 name: "myapex.key",
4311 public_key: "testkey.avbpubkey",
4312 private_key: "testkey.pem",
4313 }
4314
4315 cc_library {
4316 name: "mylib.arm64",
4317 srcs: ["mylib.cpp"],
4318 system_shared_libs: [],
4319 stl: "none",
4320 // TODO: remove //apex_available:platform
4321 apex_available: [
4322 "//apex_available:platform",
4323 "myapex",
4324 ],
4325 }
4326
4327 cc_library {
4328 name: "mylib.x64",
4329 srcs: ["mylib.cpp"],
4330 system_shared_libs: [],
4331 stl: "none",
4332 // TODO: remove //apex_available:platform
4333 apex_available: [
4334 "//apex_available:platform",
4335 "myapex",
4336 ],
4337 }
4338 `)
4339
4340 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4341 copyCmds := apexRule.Args["copy_commands"]
4342
4343 // Ensure that apex variant is created for the direct dep
4344 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4345 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4346
4347 // Ensure that both direct and indirect deps are copied into apex
4348 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4349 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4350}
4351
Jiyong Park04480cf2019-02-06 00:16:29 +09004352func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004353 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004354 apex {
4355 name: "myapex",
4356 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004357 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004358 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004359 }
4360
4361 apex_key {
4362 name: "myapex.key",
4363 public_key: "testkey.avbpubkey",
4364 private_key: "testkey.pem",
4365 }
4366
4367 sh_binary {
4368 name: "myscript",
4369 src: "mylib.cpp",
4370 filename: "myscript.sh",
4371 sub_dir: "script",
4372 }
4373 `)
4374
Sundong Ahnabb64432019-10-22 13:58:29 +09004375 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004376 copyCmds := apexRule.Args["copy_commands"]
4377
4378 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4379}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004380
Jooyung Han91df2082019-11-20 01:49:42 +09004381func TestApexInVariousPartition(t *testing.T) {
4382 testcases := []struct {
4383 propName, parition, flattenedPartition string
4384 }{
4385 {"", "system", "system_ext"},
4386 {"product_specific: true", "product", "product"},
4387 {"soc_specific: true", "vendor", "vendor"},
4388 {"proprietary: true", "vendor", "vendor"},
4389 {"vendor: true", "vendor", "vendor"},
4390 {"system_ext_specific: true", "system_ext", "system_ext"},
4391 }
4392 for _, tc := range testcases {
4393 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004394 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004395 apex {
4396 name: "myapex",
4397 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004398 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004399 `+tc.propName+`
4400 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004401
Jooyung Han91df2082019-11-20 01:49:42 +09004402 apex_key {
4403 name: "myapex.key",
4404 public_key: "testkey.avbpubkey",
4405 private_key: "testkey.pem",
4406 }
4407 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004408
Jooyung Han91df2082019-11-20 01:49:42 +09004409 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004410 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4411 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004412 if actual != expected {
4413 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4414 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004415
Jooyung Han91df2082019-11-20 01:49:42 +09004416 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004417 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4418 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004419 if actual != expected {
4420 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4421 }
4422 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004423 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004424}
Jiyong Park67882562019-03-21 01:11:21 +09004425
Jooyung Han580eb4f2020-06-24 19:33:06 +09004426func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004427 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004428 apex {
4429 name: "myapex",
4430 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004431 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004432 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004433
Jooyung Han580eb4f2020-06-24 19:33:06 +09004434 apex_key {
4435 name: "myapex.key",
4436 public_key: "testkey.avbpubkey",
4437 private_key: "testkey.pem",
4438 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004439 `)
4440 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004441 rule := module.Output("file_contexts")
4442 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4443}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004444
Jooyung Han580eb4f2020-06-24 19:33:06 +09004445func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004446 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004447 apex {
4448 name: "myapex",
4449 key: "myapex.key",
4450 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004451 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004452 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004453
Jooyung Han580eb4f2020-06-24 19:33:06 +09004454 apex_key {
4455 name: "myapex.key",
4456 public_key: "testkey.avbpubkey",
4457 private_key: "testkey.pem",
4458 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004459 `, withFiles(map[string][]byte{
4460 "my_own_file_contexts": nil,
4461 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004462}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004463
Jooyung Han580eb4f2020-06-24 19:33:06 +09004464func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004465 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004466 apex {
4467 name: "myapex",
4468 key: "myapex.key",
4469 product_specific: true,
4470 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004471 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004472 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004473
Jooyung Han580eb4f2020-06-24 19:33:06 +09004474 apex_key {
4475 name: "myapex.key",
4476 public_key: "testkey.avbpubkey",
4477 private_key: "testkey.pem",
4478 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004479 `)
4480
Colin Cross1c460562021-02-16 17:55:47 -08004481 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004482 apex {
4483 name: "myapex",
4484 key: "myapex.key",
4485 product_specific: true,
4486 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004487 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004488 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004489
Jooyung Han580eb4f2020-06-24 19:33:06 +09004490 apex_key {
4491 name: "myapex.key",
4492 public_key: "testkey.avbpubkey",
4493 private_key: "testkey.pem",
4494 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004495 `, withFiles(map[string][]byte{
4496 "product_specific_file_contexts": nil,
4497 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004498 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4499 rule := module.Output("file_contexts")
4500 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4501}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004502
Jooyung Han580eb4f2020-06-24 19:33:06 +09004503func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004504 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004505 apex {
4506 name: "myapex",
4507 key: "myapex.key",
4508 product_specific: true,
4509 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004510 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004511 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004512
Jooyung Han580eb4f2020-06-24 19:33:06 +09004513 apex_key {
4514 name: "myapex.key",
4515 public_key: "testkey.avbpubkey",
4516 private_key: "testkey.pem",
4517 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004518
Jooyung Han580eb4f2020-06-24 19:33:06 +09004519 filegroup {
4520 name: "my-file-contexts",
4521 srcs: ["product_specific_file_contexts"],
4522 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004523 `, withFiles(map[string][]byte{
4524 "product_specific_file_contexts": nil,
4525 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004526 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4527 rule := module.Output("file_contexts")
4528 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004529}
4530
Jiyong Park67882562019-03-21 01:11:21 +09004531func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004532 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004533 apex_key {
4534 name: "myapex.key",
4535 public_key: ":my.avbpubkey",
4536 private_key: ":my.pem",
4537 product_specific: true,
4538 }
4539
4540 filegroup {
4541 name: "my.avbpubkey",
4542 srcs: ["testkey2.avbpubkey"],
4543 }
4544
4545 filegroup {
4546 name: "my.pem",
4547 srcs: ["testkey2.pem"],
4548 }
4549 `)
4550
4551 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4552 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004553 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004554 if actual_pubkey != expected_pubkey {
4555 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4556 }
4557 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004558 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004559 if actual_privkey != expected_privkey {
4560 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4561 }
4562}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004563
4564func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004565 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004566 prebuilt_apex {
4567 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004568 arch: {
4569 arm64: {
4570 src: "myapex-arm64.apex",
4571 },
4572 arm: {
4573 src: "myapex-arm.apex",
4574 },
4575 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004576 }
4577 `)
4578
Wei Li340ee8e2022-03-18 17:33:24 -07004579 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4580 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004581
Jiyong Parkc95714e2019-03-29 14:23:10 +09004582 expectedInput := "myapex-arm64.apex"
4583 if prebuilt.inputApex.String() != expectedInput {
4584 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4585 }
Wei Li340ee8e2022-03-18 17:33:24 -07004586 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4587 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4588 rule := testingModule.Rule("genProvenanceMetaData")
4589 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4590 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4591 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4592 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004593}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004594
Paul Duffinc0609c62021-03-01 17:27:16 +00004595func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004596 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004597 prebuilt_apex {
4598 name: "myapex",
4599 }
4600 `)
4601}
4602
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004603func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004604 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004605 prebuilt_apex {
4606 name: "myapex",
4607 src: "myapex-arm.apex",
4608 filename: "notmyapex.apex",
4609 }
4610 `)
4611
Wei Li340ee8e2022-03-18 17:33:24 -07004612 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4613 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004614
4615 expected := "notmyapex.apex"
4616 if p.installFilename != expected {
4617 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4618 }
Wei Li340ee8e2022-03-18 17:33:24 -07004619 rule := testingModule.Rule("genProvenanceMetaData")
4620 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4621 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4622 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4623 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004624}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004625
Samiul Islam7c02e262021-09-08 17:48:28 +01004626func TestApexSetFilenameOverride(t *testing.T) {
4627 testApex(t, `
4628 apex_set {
4629 name: "com.company.android.myapex",
4630 apex_name: "com.android.myapex",
4631 set: "company-myapex.apks",
4632 filename: "com.company.android.myapex.apex"
4633 }
4634 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4635
4636 testApex(t, `
4637 apex_set {
4638 name: "com.company.android.myapex",
4639 apex_name: "com.android.myapex",
4640 set: "company-myapex.apks",
4641 filename: "com.company.android.myapex.capex"
4642 }
4643 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4644
4645 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4646 apex_set {
4647 name: "com.company.android.myapex",
4648 apex_name: "com.android.myapex",
4649 set: "company-myapex.apks",
4650 filename: "some-random-suffix"
4651 }
4652 `)
4653}
4654
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004655func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004656 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004657 prebuilt_apex {
4658 name: "myapex.prebuilt",
4659 src: "myapex-arm.apex",
4660 overrides: [
4661 "myapex",
4662 ],
4663 }
4664 `)
4665
Wei Li340ee8e2022-03-18 17:33:24 -07004666 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4667 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004668
4669 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004670 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004671 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004672 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004673 }
Wei Li340ee8e2022-03-18 17:33:24 -07004674 rule := testingModule.Rule("genProvenanceMetaData")
4675 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4676 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4677 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4678 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004679}
4680
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004681func TestPrebuiltApexName(t *testing.T) {
4682 testApex(t, `
4683 prebuilt_apex {
4684 name: "com.company.android.myapex",
4685 apex_name: "com.android.myapex",
4686 src: "company-myapex-arm.apex",
4687 }
4688 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4689
4690 testApex(t, `
4691 apex_set {
4692 name: "com.company.android.myapex",
4693 apex_name: "com.android.myapex",
4694 set: "company-myapex.apks",
4695 }
4696 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4697}
4698
4699func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4700 _ = android.GroupFixturePreparers(
4701 java.PrepareForTestWithJavaDefaultModules,
4702 PrepareForTestWithApexBuildComponents,
4703 android.FixtureWithRootAndroidBp(`
4704 platform_bootclasspath {
4705 name: "platform-bootclasspath",
4706 fragments: [
4707 {
4708 apex: "com.android.art",
4709 module: "art-bootclasspath-fragment",
4710 },
4711 ],
4712 }
4713
4714 prebuilt_apex {
4715 name: "com.company.android.art",
4716 apex_name: "com.android.art",
4717 src: "com.company.android.art-arm.apex",
4718 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4719 }
4720
4721 prebuilt_bootclasspath_fragment {
4722 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004723 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004724 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004725 hidden_api: {
4726 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4727 metadata: "my-bootclasspath-fragment/metadata.csv",
4728 index: "my-bootclasspath-fragment/index.csv",
4729 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4730 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4731 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004732 }
4733
4734 java_import {
4735 name: "core-oj",
4736 jars: ["prebuilt.jar"],
4737 }
4738 `),
4739 ).RunTest(t)
4740}
4741
Paul Duffin092153d2021-01-26 11:42:39 +00004742// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4743// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004744func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004745 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004746
Paul Duffin89886cb2021-02-05 16:44:03 +00004747 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004748 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004749 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004750 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004751 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004752 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004753 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4754 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4755 android.NormalizePathForTesting(dexJarBuildPath))
4756 }
4757
4758 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004759 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004760 // Make sure the import has been given the correct path to the dex jar.
4761 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4762 dexJarBuildPath := p.DexJarInstallPath()
4763 stem := android.RemoveOptionalPrebuiltPrefix(name)
4764 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4765 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4766 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004767 }
4768
Paul Duffin39853512021-02-26 11:09:39 +00004769 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004770 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004771 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004772 android.AssertArrayString(t, "Check if there is no source variant",
4773 []string{"android_common"},
4774 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004775 }
4776
4777 t.Run("prebuilt only", func(t *testing.T) {
4778 bp := `
4779 prebuilt_apex {
4780 name: "myapex",
4781 arch: {
4782 arm64: {
4783 src: "myapex-arm64.apex",
4784 },
4785 arm: {
4786 src: "myapex-arm.apex",
4787 },
4788 },
Paul Duffin39853512021-02-26 11:09:39 +00004789 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004790 }
4791
4792 java_import {
4793 name: "libfoo",
4794 jars: ["libfoo.jar"],
4795 }
Paul Duffin39853512021-02-26 11:09:39 +00004796
4797 java_sdk_library_import {
4798 name: "libbar",
4799 public: {
4800 jars: ["libbar.jar"],
4801 },
4802 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004803 `
4804
4805 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4806 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4807
Martin Stjernholm44825602021-09-17 01:44:12 +01004808 deapexerName := deapexerModuleName("myapex")
4809 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4810
Paul Duffinf6932af2021-02-26 18:21:56 +00004811 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004812 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004813 rule := deapexer.Rule("deapexer")
4814 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4815 t.Errorf("expected: %q, found: %q", expected, actual)
4816 }
4817
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004818 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004819 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004820 rule = prebuiltApex.Rule("android/soong/android.Cp")
4821 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4822 t.Errorf("expected: %q, found: %q", expected, actual)
4823 }
4824
Paul Duffin89886cb2021-02-05 16:44:03 +00004825 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004826 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004827
4828 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004829 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004830 })
4831
4832 t.Run("prebuilt with source preferred", func(t *testing.T) {
4833
4834 bp := `
4835 prebuilt_apex {
4836 name: "myapex",
4837 arch: {
4838 arm64: {
4839 src: "myapex-arm64.apex",
4840 },
4841 arm: {
4842 src: "myapex-arm.apex",
4843 },
4844 },
Paul Duffin39853512021-02-26 11:09:39 +00004845 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004846 }
4847
4848 java_import {
4849 name: "libfoo",
4850 jars: ["libfoo.jar"],
4851 }
4852
4853 java_library {
4854 name: "libfoo",
4855 }
Paul Duffin39853512021-02-26 11:09:39 +00004856
4857 java_sdk_library_import {
4858 name: "libbar",
4859 public: {
4860 jars: ["libbar.jar"],
4861 },
4862 }
4863
4864 java_sdk_library {
4865 name: "libbar",
4866 srcs: ["foo/bar/MyClass.java"],
4867 unsafe_ignore_missing_latest_api: true,
4868 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004869 `
4870
4871 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4872 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4873
Paul Duffin89886cb2021-02-05 16:44:03 +00004874 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004875 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004876 ensureNoSourceVariant(t, ctx, "libfoo")
4877
4878 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004879 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004880 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004881 })
4882
4883 t.Run("prebuilt preferred with source", func(t *testing.T) {
4884 bp := `
4885 prebuilt_apex {
4886 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004887 arch: {
4888 arm64: {
4889 src: "myapex-arm64.apex",
4890 },
4891 arm: {
4892 src: "myapex-arm.apex",
4893 },
4894 },
Paul Duffin39853512021-02-26 11:09:39 +00004895 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004896 }
4897
4898 java_import {
4899 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004900 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004901 jars: ["libfoo.jar"],
4902 }
4903
4904 java_library {
4905 name: "libfoo",
4906 }
Paul Duffin39853512021-02-26 11:09:39 +00004907
4908 java_sdk_library_import {
4909 name: "libbar",
4910 prefer: true,
4911 public: {
4912 jars: ["libbar.jar"],
4913 },
4914 }
4915
4916 java_sdk_library {
4917 name: "libbar",
4918 srcs: ["foo/bar/MyClass.java"],
4919 unsafe_ignore_missing_latest_api: true,
4920 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004921 `
4922
4923 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4924 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4925
Paul Duffin89886cb2021-02-05 16:44:03 +00004926 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004927 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004928 ensureNoSourceVariant(t, ctx, "libfoo")
4929
4930 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004931 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004932 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004933 })
4934}
4935
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004936func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004937 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004938 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004939 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4940 // is disabled.
4941 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4942 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004943
Paul Duffin37856732021-02-26 14:24:15 +00004944 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4945 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004946 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004947 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004948 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004949 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004950 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004951 foundLibfooJar = true
4952 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004953 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004954 }
4955 }
4956 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004957 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 +00004958 }
4959 }
4960
Paul Duffin40a3f652021-07-19 13:11:24 +01004961 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004962 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004963 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004964 var rule android.TestingBuildParams
4965
4966 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4967 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004968 }
4969
Paul Duffin40a3f652021-07-19 13:11:24 +01004970 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4971 t.Helper()
4972 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4973 var rule android.TestingBuildParams
4974
4975 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4976 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4977 }
4978
Paul Duffin89f570a2021-06-16 01:42:33 +01004979 fragment := java.ApexVariantReference{
4980 Apex: proptools.StringPtr("myapex"),
4981 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4982 }
4983
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004984 t.Run("prebuilt only", func(t *testing.T) {
4985 bp := `
4986 prebuilt_apex {
4987 name: "myapex",
4988 arch: {
4989 arm64: {
4990 src: "myapex-arm64.apex",
4991 },
4992 arm: {
4993 src: "myapex-arm.apex",
4994 },
4995 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004996 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4997 }
4998
4999 prebuilt_bootclasspath_fragment {
5000 name: "my-bootclasspath-fragment",
5001 contents: ["libfoo", "libbar"],
5002 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005003 hidden_api: {
5004 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5005 metadata: "my-bootclasspath-fragment/metadata.csv",
5006 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005007 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5008 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5009 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005010 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005011 }
5012
5013 java_import {
5014 name: "libfoo",
5015 jars: ["libfoo.jar"],
5016 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005017 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005018 }
Paul Duffin37856732021-02-26 14:24:15 +00005019
5020 java_sdk_library_import {
5021 name: "libbar",
5022 public: {
5023 jars: ["libbar.jar"],
5024 },
5025 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005026 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005027 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005028 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005029 `
5030
Paul Duffin89f570a2021-06-16 01:42:33 +01005031 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005032 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5033 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005034
Paul Duffin537ea3d2021-05-14 10:38:00 +01005035 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005036 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005037 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005038 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005039 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5040 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005041 })
5042
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005043 t.Run("apex_set only", func(t *testing.T) {
5044 bp := `
5045 apex_set {
5046 name: "myapex",
5047 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005048 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5049 }
5050
5051 prebuilt_bootclasspath_fragment {
5052 name: "my-bootclasspath-fragment",
5053 contents: ["libfoo", "libbar"],
5054 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005055 hidden_api: {
5056 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5057 metadata: "my-bootclasspath-fragment/metadata.csv",
5058 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005059 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5060 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5061 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005062 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005063 }
5064
5065 java_import {
5066 name: "libfoo",
5067 jars: ["libfoo.jar"],
5068 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005069 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005070 }
5071
5072 java_sdk_library_import {
5073 name: "libbar",
5074 public: {
5075 jars: ["libbar.jar"],
5076 },
5077 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005078 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005079 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005080 }
5081 `
5082
Paul Duffin89f570a2021-06-16 01:42:33 +01005083 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005084 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5085 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5086
Paul Duffin537ea3d2021-05-14 10:38:00 +01005087 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005088 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005089 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005090 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005091 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5092 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005093 })
5094
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005095 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5096 bp := `
5097 prebuilt_apex {
5098 name: "myapex",
5099 arch: {
5100 arm64: {
5101 src: "myapex-arm64.apex",
5102 },
5103 arm: {
5104 src: "myapex-arm.apex",
5105 },
5106 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005107 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5108 }
5109
5110 prebuilt_bootclasspath_fragment {
5111 name: "my-bootclasspath-fragment",
5112 contents: ["libfoo", "libbar"],
5113 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005114 hidden_api: {
5115 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5116 metadata: "my-bootclasspath-fragment/metadata.csv",
5117 index: "my-bootclasspath-fragment/index.csv",
5118 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5119 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5120 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005121 }
5122
5123 java_import {
5124 name: "libfoo",
5125 jars: ["libfoo.jar"],
5126 apex_available: ["myapex"],
5127 }
5128
5129 java_library {
5130 name: "libfoo",
5131 srcs: ["foo/bar/MyClass.java"],
5132 apex_available: ["myapex"],
5133 }
Paul Duffin37856732021-02-26 14:24:15 +00005134
5135 java_sdk_library_import {
5136 name: "libbar",
5137 public: {
5138 jars: ["libbar.jar"],
5139 },
5140 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005141 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005142 }
5143
5144 java_sdk_library {
5145 name: "libbar",
5146 srcs: ["foo/bar/MyClass.java"],
5147 unsafe_ignore_missing_latest_api: true,
5148 apex_available: ["myapex"],
5149 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005150 `
5151
5152 // In this test the source (java_library) libfoo is active since the
5153 // prebuilt (java_import) defaults to prefer:false. However the
5154 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5155 // find the dex boot jar in it. We either need to disable the source libfoo
5156 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005157 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005158 // dexbootjar check is skipped if AllowMissingDependencies is true
5159 preparerAllowMissingDeps := android.GroupFixturePreparers(
5160 preparer,
5161 android.PrepareForTestWithAllowMissingDependencies,
5162 )
5163 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005164 })
5165
5166 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5167 bp := `
5168 prebuilt_apex {
5169 name: "myapex",
5170 arch: {
5171 arm64: {
5172 src: "myapex-arm64.apex",
5173 },
5174 arm: {
5175 src: "myapex-arm.apex",
5176 },
5177 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005178 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5179 }
5180
5181 prebuilt_bootclasspath_fragment {
5182 name: "my-bootclasspath-fragment",
5183 contents: ["libfoo", "libbar"],
5184 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005185 hidden_api: {
5186 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5187 metadata: "my-bootclasspath-fragment/metadata.csv",
5188 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005189 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5190 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5191 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005192 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005193 }
5194
5195 java_import {
5196 name: "libfoo",
5197 prefer: true,
5198 jars: ["libfoo.jar"],
5199 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005200 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005201 }
5202
5203 java_library {
5204 name: "libfoo",
5205 srcs: ["foo/bar/MyClass.java"],
5206 apex_available: ["myapex"],
5207 }
Paul Duffin37856732021-02-26 14:24:15 +00005208
5209 java_sdk_library_import {
5210 name: "libbar",
5211 prefer: true,
5212 public: {
5213 jars: ["libbar.jar"],
5214 },
5215 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005216 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005217 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005218 }
5219
5220 java_sdk_library {
5221 name: "libbar",
5222 srcs: ["foo/bar/MyClass.java"],
5223 unsafe_ignore_missing_latest_api: true,
5224 apex_available: ["myapex"],
5225 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005226 `
5227
Paul Duffin89f570a2021-06-16 01:42:33 +01005228 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005229 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5230 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005231
Paul Duffin537ea3d2021-05-14 10:38:00 +01005232 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005233 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005234 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005235 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005236 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5237 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005238 })
5239
5240 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5241 bp := `
5242 apex {
5243 name: "myapex",
5244 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005245 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005246 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005247 }
5248
5249 apex_key {
5250 name: "myapex.key",
5251 public_key: "testkey.avbpubkey",
5252 private_key: "testkey.pem",
5253 }
5254
5255 prebuilt_apex {
5256 name: "myapex",
5257 arch: {
5258 arm64: {
5259 src: "myapex-arm64.apex",
5260 },
5261 arm: {
5262 src: "myapex-arm.apex",
5263 },
5264 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005265 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5266 }
5267
5268 prebuilt_bootclasspath_fragment {
5269 name: "my-bootclasspath-fragment",
5270 contents: ["libfoo", "libbar"],
5271 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005272 hidden_api: {
5273 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5274 metadata: "my-bootclasspath-fragment/metadata.csv",
5275 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005276 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5277 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5278 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005279 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005280 }
5281
5282 java_import {
5283 name: "libfoo",
5284 jars: ["libfoo.jar"],
5285 apex_available: ["myapex"],
5286 }
5287
5288 java_library {
5289 name: "libfoo",
5290 srcs: ["foo/bar/MyClass.java"],
5291 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005292 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005293 }
Paul Duffin37856732021-02-26 14:24:15 +00005294
5295 java_sdk_library_import {
5296 name: "libbar",
5297 public: {
5298 jars: ["libbar.jar"],
5299 },
5300 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005301 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005302 }
5303
5304 java_sdk_library {
5305 name: "libbar",
5306 srcs: ["foo/bar/MyClass.java"],
5307 unsafe_ignore_missing_latest_api: true,
5308 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005309 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005310 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005311 `
5312
Paul Duffin89f570a2021-06-16 01:42:33 +01005313 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005314 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5315 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005316
Paul Duffin537ea3d2021-05-14 10:38:00 +01005317 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005318 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005319 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005320 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005321 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5322 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005323 })
5324
5325 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5326 bp := `
5327 apex {
5328 name: "myapex",
5329 enabled: false,
5330 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005331 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005332 }
5333
5334 apex_key {
5335 name: "myapex.key",
5336 public_key: "testkey.avbpubkey",
5337 private_key: "testkey.pem",
5338 }
5339
5340 prebuilt_apex {
5341 name: "myapex",
5342 arch: {
5343 arm64: {
5344 src: "myapex-arm64.apex",
5345 },
5346 arm: {
5347 src: "myapex-arm.apex",
5348 },
5349 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005350 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5351 }
5352
5353 prebuilt_bootclasspath_fragment {
5354 name: "my-bootclasspath-fragment",
5355 contents: ["libfoo", "libbar"],
5356 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005357 hidden_api: {
5358 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5359 metadata: "my-bootclasspath-fragment/metadata.csv",
5360 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005361 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5362 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5363 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005364 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005365 }
5366
5367 java_import {
5368 name: "libfoo",
5369 prefer: true,
5370 jars: ["libfoo.jar"],
5371 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005372 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005373 }
5374
5375 java_library {
5376 name: "libfoo",
5377 srcs: ["foo/bar/MyClass.java"],
5378 apex_available: ["myapex"],
5379 }
Paul Duffin37856732021-02-26 14:24:15 +00005380
5381 java_sdk_library_import {
5382 name: "libbar",
5383 prefer: true,
5384 public: {
5385 jars: ["libbar.jar"],
5386 },
5387 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005388 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005389 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005390 }
5391
5392 java_sdk_library {
5393 name: "libbar",
5394 srcs: ["foo/bar/MyClass.java"],
5395 unsafe_ignore_missing_latest_api: true,
5396 apex_available: ["myapex"],
5397 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005398 `
5399
Paul Duffin89f570a2021-06-16 01:42:33 +01005400 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005401 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5402 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005403
Paul Duffin537ea3d2021-05-14 10:38:00 +01005404 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005405 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005406 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005407 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005408 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5409 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005410 })
5411}
5412
Roland Levillain630846d2019-06-26 12:48:34 +01005413func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005414 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005415 apex_test {
5416 name: "myapex",
5417 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005418 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005419 tests: [
5420 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005421 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005422 ],
5423 }
5424
5425 apex_key {
5426 name: "myapex.key",
5427 public_key: "testkey.avbpubkey",
5428 private_key: "testkey.pem",
5429 }
5430
Liz Kammer1c14a212020-05-12 15:26:55 -07005431 filegroup {
5432 name: "fg",
5433 srcs: [
5434 "baz",
5435 "bar/baz"
5436 ],
5437 }
5438
Roland Levillain630846d2019-06-26 12:48:34 +01005439 cc_test {
5440 name: "mytest",
5441 gtest: false,
5442 srcs: ["mytest.cpp"],
5443 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005444 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005445 system_shared_libs: [],
5446 static_executable: true,
5447 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005448 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005449 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005450
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005451 cc_library {
5452 name: "mylib",
5453 srcs: ["mylib.cpp"],
5454 system_shared_libs: [],
5455 stl: "none",
5456 }
5457
Liz Kammer5bd365f2020-05-27 15:15:11 -07005458 filegroup {
5459 name: "fg2",
5460 srcs: [
5461 "testdata/baz"
5462 ],
5463 }
5464
Roland Levillain9b5fde92019-06-28 15:41:19 +01005465 cc_test {
5466 name: "mytests",
5467 gtest: false,
5468 srcs: [
5469 "mytest1.cpp",
5470 "mytest2.cpp",
5471 "mytest3.cpp",
5472 ],
5473 test_per_src: true,
5474 relative_install_path: "test",
5475 system_shared_libs: [],
5476 static_executable: true,
5477 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005478 data: [
5479 ":fg",
5480 ":fg2",
5481 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005482 }
Roland Levillain630846d2019-06-26 12:48:34 +01005483 `)
5484
Sundong Ahnabb64432019-10-22 13:58:29 +09005485 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005486 copyCmds := apexRule.Args["copy_commands"]
5487
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005488 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005489 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005490 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005491
Liz Kammer1c14a212020-05-12 15:26:55 -07005492 //Ensure that test data are copied into apex.
5493 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5494 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5495
Roland Levillain9b5fde92019-06-28 15:41:19 +01005496 // Ensure that test deps built with `test_per_src` are copied into apex.
5497 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5498 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5499 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005500
5501 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005502 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005503 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005504 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005505 prefix := "TARGET_"
5506 var builder strings.Builder
5507 data.Custom(&builder, name, prefix, "", data)
5508 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005509 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5510 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5511 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5512 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005513 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005514 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005515 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005516
5517 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005518 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005519 data.Custom(&builder, name, prefix, "", data)
5520 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005521 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5522 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005523}
5524
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005525func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005526 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005527 apex {
5528 name: "myapex",
5529 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005530 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005531 }
5532 apex_key {
5533 name: "myapex.key",
5534 public_key: "testkey.avbpubkey",
5535 private_key: "testkey.pem",
5536 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005537 `,
5538 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5539 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5540 }),
5541 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005542 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005543 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005544 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005545 var builder strings.Builder
5546 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5547 androidMk := builder.String()
5548 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5549}
5550
Jooyung Hand48f3c32019-08-23 11:18:57 +09005551func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5552 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5553 apex {
5554 name: "myapex",
5555 key: "myapex.key",
5556 native_shared_libs: ["libfoo"],
5557 }
5558
5559 apex_key {
5560 name: "myapex.key",
5561 public_key: "testkey.avbpubkey",
5562 private_key: "testkey.pem",
5563 }
5564
5565 cc_library {
5566 name: "libfoo",
5567 stl: "none",
5568 system_shared_libs: [],
5569 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005570 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005571 }
5572 `)
5573 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5574 apex {
5575 name: "myapex",
5576 key: "myapex.key",
5577 java_libs: ["myjar"],
5578 }
5579
5580 apex_key {
5581 name: "myapex.key",
5582 public_key: "testkey.avbpubkey",
5583 private_key: "testkey.pem",
5584 }
5585
5586 java_library {
5587 name: "myjar",
5588 srcs: ["foo/bar/MyClass.java"],
5589 sdk_version: "none",
5590 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005591 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005592 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005593 }
5594 `)
5595}
5596
Bill Peckhama41a6962021-01-11 10:58:54 -08005597func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005598 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005599 apex {
5600 name: "myapex",
5601 key: "myapex.key",
5602 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005603 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005604 }
5605
5606 apex_key {
5607 name: "myapex.key",
5608 public_key: "testkey.avbpubkey",
5609 private_key: "testkey.pem",
5610 }
5611
5612 java_import {
5613 name: "myjavaimport",
5614 apex_available: ["myapex"],
5615 jars: ["my.jar"],
5616 compile_dex: true,
5617 }
5618 `)
5619
5620 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5621 apexRule := module.Rule("apexRule")
5622 copyCmds := apexRule.Args["copy_commands"]
5623 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5624}
5625
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005626func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005627 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005628 apex {
5629 name: "myapex",
5630 key: "myapex.key",
5631 apps: [
5632 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005633 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005634 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005635 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005636 }
5637
5638 apex_key {
5639 name: "myapex.key",
5640 public_key: "testkey.avbpubkey",
5641 private_key: "testkey.pem",
5642 }
5643
5644 android_app {
5645 name: "AppFoo",
5646 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005647 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005648 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005649 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005650 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005651 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005652 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005653
5654 android_app {
5655 name: "AppFooPriv",
5656 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005657 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005658 system_modules: "none",
5659 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005660 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005661 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005662 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005663
5664 cc_library_shared {
5665 name: "libjni",
5666 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005667 shared_libs: ["libfoo"],
5668 stl: "none",
5669 system_shared_libs: [],
5670 apex_available: [ "myapex" ],
5671 sdk_version: "current",
5672 }
5673
5674 cc_library_shared {
5675 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005676 stl: "none",
5677 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005678 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005679 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005680 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005681 `)
5682
Sundong Ahnabb64432019-10-22 13:58:29 +09005683 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005684 apexRule := module.Rule("apexRule")
5685 copyCmds := apexRule.Args["copy_commands"]
5686
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005687 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5688 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005689
Colin Crossaede88c2020-08-11 12:17:01 -07005690 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005691 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005692 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005693 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005694 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005695 // JNI libraries including transitive deps are
5696 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005697 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005698 // ... embedded inside APK (jnilibs.zip)
5699 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5700 // ... and not directly inside the APEX
5701 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5702 }
Dario Frenicde2a032019-10-27 00:29:22 +01005703}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005704
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005705func TestApexWithAppImportBuildId(t *testing.T) {
5706 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5707 for _, id := range invalidBuildIds {
5708 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5709 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5710 variables.BuildId = proptools.StringPtr(id)
5711 })
5712 testApexError(t, message, `apex {
5713 name: "myapex",
5714 key: "myapex.key",
5715 apps: ["AppFooPrebuilt"],
5716 updatable: false,
5717 }
5718
5719 apex_key {
5720 name: "myapex.key",
5721 public_key: "testkey.avbpubkey",
5722 private_key: "testkey.pem",
5723 }
5724
5725 android_app_import {
5726 name: "AppFooPrebuilt",
5727 apk: "PrebuiltAppFoo.apk",
5728 presigned: true,
5729 apex_available: ["myapex"],
5730 }
5731 `, fixture)
5732 }
5733}
5734
Dario Frenicde2a032019-10-27 00:29:22 +01005735func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005736 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005737 apex {
5738 name: "myapex",
5739 key: "myapex.key",
5740 apps: [
5741 "AppFooPrebuilt",
5742 "AppFooPrivPrebuilt",
5743 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005744 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005745 }
5746
5747 apex_key {
5748 name: "myapex.key",
5749 public_key: "testkey.avbpubkey",
5750 private_key: "testkey.pem",
5751 }
5752
5753 android_app_import {
5754 name: "AppFooPrebuilt",
5755 apk: "PrebuiltAppFoo.apk",
5756 presigned: true,
5757 dex_preopt: {
5758 enabled: false,
5759 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005760 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005761 }
5762
5763 android_app_import {
5764 name: "AppFooPrivPrebuilt",
5765 apk: "PrebuiltAppFooPriv.apk",
5766 privileged: true,
5767 presigned: true,
5768 dex_preopt: {
5769 enabled: false,
5770 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005771 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005772 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005773 }
5774 `)
5775
Sundong Ahnabb64432019-10-22 13:58:29 +09005776 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005777 apexRule := module.Rule("apexRule")
5778 copyCmds := apexRule.Args["copy_commands"]
5779
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005780 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5781 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005782}
5783
5784func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005785 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005786 apex {
5787 name: "myapex",
5788 key: "myapex.key",
5789 apps: [
5790 "AppFoo",
5791 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005792 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005793 }
5794
5795 apex_key {
5796 name: "myapex.key",
5797 public_key: "testkey.avbpubkey",
5798 private_key: "testkey.pem",
5799 }
5800
5801 android_app {
5802 name: "AppFoo",
5803 srcs: ["foo/bar/MyClass.java"],
5804 sdk_version: "none",
5805 system_modules: "none",
5806 apex_available: [ "myapex" ],
5807 }
5808
5809 android_app_import {
5810 name: "AppFoo",
5811 apk: "AppFooPrebuilt.apk",
5812 filename: "AppFooPrebuilt.apk",
5813 presigned: true,
5814 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005815 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005816 }
5817 `, withFiles(map[string][]byte{
5818 "AppFooPrebuilt.apk": nil,
5819 }))
5820
5821 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005822 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005823 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005824}
5825
Dario Freni6f3937c2019-12-20 22:58:03 +00005826func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005827 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005828 apex {
5829 name: "myapex",
5830 key: "myapex.key",
5831 apps: [
5832 "TesterHelpAppFoo",
5833 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005834 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005835 }
5836
5837 apex_key {
5838 name: "myapex.key",
5839 public_key: "testkey.avbpubkey",
5840 private_key: "testkey.pem",
5841 }
5842
5843 android_test_helper_app {
5844 name: "TesterHelpAppFoo",
5845 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005846 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005847 }
5848
5849 `)
5850
5851 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5852 apexRule := module.Rule("apexRule")
5853 copyCmds := apexRule.Args["copy_commands"]
5854
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005855 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005856}
5857
Jooyung Han18020ea2019-11-13 10:50:48 +09005858func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5859 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005860 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005861 apex {
5862 name: "myapex",
5863 key: "myapex.key",
5864 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005865 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005866 }
5867
5868 apex_key {
5869 name: "myapex.key",
5870 public_key: "testkey.avbpubkey",
5871 private_key: "testkey.pem",
5872 }
5873
5874 apex {
5875 name: "otherapex",
5876 key: "myapex.key",
5877 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005878 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005879 }
5880
5881 cc_defaults {
5882 name: "libfoo-defaults",
5883 apex_available: ["otherapex"],
5884 }
5885
5886 cc_library {
5887 name: "libfoo",
5888 defaults: ["libfoo-defaults"],
5889 stl: "none",
5890 system_shared_libs: [],
5891 }`)
5892}
5893
Paul Duffine52e66f2020-03-30 17:54:29 +01005894func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005895 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005896 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005897 apex {
5898 name: "myapex",
5899 key: "myapex.key",
5900 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005901 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005902 }
5903
5904 apex_key {
5905 name: "myapex.key",
5906 public_key: "testkey.avbpubkey",
5907 private_key: "testkey.pem",
5908 }
5909
5910 apex {
5911 name: "otherapex",
5912 key: "otherapex.key",
5913 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005914 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005915 }
5916
5917 apex_key {
5918 name: "otherapex.key",
5919 public_key: "testkey.avbpubkey",
5920 private_key: "testkey.pem",
5921 }
5922
5923 cc_library {
5924 name: "libfoo",
5925 stl: "none",
5926 system_shared_libs: [],
5927 apex_available: ["otherapex"],
5928 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005929}
Jiyong Park127b40b2019-09-30 16:04:35 +09005930
Paul Duffine52e66f2020-03-30 17:54:29 +01005931func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005932 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005933 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00005934.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01005935.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005936.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005937.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005938.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005939.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005940 apex {
5941 name: "myapex",
5942 key: "myapex.key",
5943 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005944 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005945 }
5946
5947 apex_key {
5948 name: "myapex.key",
5949 public_key: "testkey.avbpubkey",
5950 private_key: "testkey.pem",
5951 }
5952
Jiyong Park127b40b2019-09-30 16:04:35 +09005953 cc_library {
5954 name: "libfoo",
5955 stl: "none",
5956 shared_libs: ["libbar"],
5957 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005958 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005959 }
5960
5961 cc_library {
5962 name: "libbar",
5963 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005964 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005965 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005966 apex_available: ["myapex"],
5967 }
5968
5969 cc_library {
5970 name: "libbaz",
5971 stl: "none",
5972 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005973 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005974}
Jiyong Park127b40b2019-09-30 16:04:35 +09005975
Paul Duffine52e66f2020-03-30 17:54:29 +01005976func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005977 testApexError(t, "\"otherapex\" is not a valid module name", `
5978 apex {
5979 name: "myapex",
5980 key: "myapex.key",
5981 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005982 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005983 }
5984
5985 apex_key {
5986 name: "myapex.key",
5987 public_key: "testkey.avbpubkey",
5988 private_key: "testkey.pem",
5989 }
5990
5991 cc_library {
5992 name: "libfoo",
5993 stl: "none",
5994 system_shared_libs: [],
5995 apex_available: ["otherapex"],
5996 }`)
5997
Paul Duffine52e66f2020-03-30 17:54:29 +01005998 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005999 apex {
6000 name: "myapex",
6001 key: "myapex.key",
6002 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006003 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006004 }
6005
6006 apex_key {
6007 name: "myapex.key",
6008 public_key: "testkey.avbpubkey",
6009 private_key: "testkey.pem",
6010 }
6011
6012 cc_library {
6013 name: "libfoo",
6014 stl: "none",
6015 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006016 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006017 apex_available: ["myapex"],
6018 }
6019
6020 cc_library {
6021 name: "libbar",
6022 stl: "none",
6023 system_shared_libs: [],
6024 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006025 }
6026
6027 cc_library {
6028 name: "libbaz",
6029 stl: "none",
6030 system_shared_libs: [],
6031 stubs: {
6032 versions: ["10", "20", "30"],
6033 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006034 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006035}
Jiyong Park127b40b2019-09-30 16:04:35 +09006036
Jiyong Park89e850a2020-04-07 16:37:39 +09006037func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006038 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006039 apex {
6040 name: "myapex",
6041 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006042 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006043 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006044 }
6045
6046 apex_key {
6047 name: "myapex.key",
6048 public_key: "testkey.avbpubkey",
6049 private_key: "testkey.pem",
6050 }
6051
6052 cc_library {
6053 name: "libfoo",
6054 stl: "none",
6055 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006056 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006057 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006058 }
6059
6060 cc_library {
6061 name: "libfoo2",
6062 stl: "none",
6063 system_shared_libs: [],
6064 shared_libs: ["libbaz"],
6065 apex_available: ["//apex_available:platform"],
6066 }
6067
6068 cc_library {
6069 name: "libbar",
6070 stl: "none",
6071 system_shared_libs: [],
6072 apex_available: ["myapex"],
6073 }
6074
6075 cc_library {
6076 name: "libbaz",
6077 stl: "none",
6078 system_shared_libs: [],
6079 apex_available: ["myapex"],
6080 stubs: {
6081 versions: ["1"],
6082 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006083 }`)
6084
Jiyong Park89e850a2020-04-07 16:37:39 +09006085 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6086 // because it depends on libbar which isn't available to platform
6087 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6088 if libfoo.NotAvailableForPlatform() != true {
6089 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6090 }
6091
6092 // libfoo2 however can be available to platform because it depends on libbaz which provides
6093 // stubs
6094 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6095 if libfoo2.NotAvailableForPlatform() == true {
6096 t.Errorf("%q should be available to platform", libfoo2.String())
6097 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006098}
Jiyong Parka90ca002019-10-07 15:47:24 +09006099
Paul Duffine52e66f2020-03-30 17:54:29 +01006100func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006101 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006102 apex {
6103 name: "myapex",
6104 key: "myapex.key",
6105 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006106 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006107 }
6108
6109 apex_key {
6110 name: "myapex.key",
6111 public_key: "testkey.avbpubkey",
6112 private_key: "testkey.pem",
6113 }
6114
6115 cc_library {
6116 name: "libfoo",
6117 stl: "none",
6118 system_shared_libs: [],
6119 apex_available: ["myapex"],
6120 static: {
6121 apex_available: ["//apex_available:platform"],
6122 },
6123 }`)
6124
Jiyong Park89e850a2020-04-07 16:37:39 +09006125 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6126 if libfooShared.NotAvailableForPlatform() != true {
6127 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6128 }
6129 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6130 if libfooStatic.NotAvailableForPlatform() != false {
6131 t.Errorf("%q should be available to platform", libfooStatic.String())
6132 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006133}
6134
Jiyong Park5d790c32019-11-15 18:40:32 +09006135func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006136 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006137 apex {
6138 name: "myapex",
6139 key: "myapex.key",
6140 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006141 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006142 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006143 bootclasspath_fragments: ["mybootclasspath_fragment"],
6144 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6145 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006146 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006147 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006148 }
6149
6150 override_apex {
6151 name: "override_myapex",
6152 base: "myapex",
6153 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006154 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006155 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006156 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6157 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6158 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006159 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006160 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006161 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006162 key: "mynewapex.key",
6163 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006164 }
6165
6166 apex_key {
6167 name: "myapex.key",
6168 public_key: "testkey.avbpubkey",
6169 private_key: "testkey.pem",
6170 }
6171
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006172 apex_key {
6173 name: "mynewapex.key",
6174 public_key: "testkey2.avbpubkey",
6175 private_key: "testkey2.pem",
6176 }
6177
6178 android_app_certificate {
6179 name: "myapex.certificate",
6180 certificate: "testkey",
6181 }
6182
Jiyong Park5d790c32019-11-15 18:40:32 +09006183 android_app {
6184 name: "app",
6185 srcs: ["foo/bar/MyClass.java"],
6186 package_name: "foo",
6187 sdk_version: "none",
6188 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006189 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006190 }
6191
6192 override_android_app {
6193 name: "override_app",
6194 base: "app",
6195 package_name: "bar",
6196 }
markchien7c803b82021-08-26 22:10:06 +08006197
6198 bpf {
6199 name: "bpf",
6200 srcs: ["bpf.c"],
6201 }
6202
6203 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006204 name: "overrideBpf",
6205 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006206 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006207
6208 prebuilt_etc {
6209 name: "myetc",
6210 src: "myprebuilt",
6211 }
6212
6213 prebuilt_etc {
6214 name: "override_myetc",
6215 src: "override_myprebuilt",
6216 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006217
6218 java_library {
6219 name: "bcplib",
6220 srcs: ["a.java"],
6221 compile_dex: true,
6222 apex_available: ["myapex"],
6223 permitted_packages: ["bcp.lib"],
6224 }
6225
6226 bootclasspath_fragment {
6227 name: "mybootclasspath_fragment",
6228 contents: ["bcplib"],
6229 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006230 hidden_api: {
6231 split_packages: ["*"],
6232 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006233 }
6234
6235 java_library {
6236 name: "override_bcplib",
6237 srcs: ["a.java"],
6238 compile_dex: true,
6239 apex_available: ["myapex"],
6240 permitted_packages: ["override.bcp.lib"],
6241 }
6242
6243 bootclasspath_fragment {
6244 name: "override_bootclasspath_fragment",
6245 contents: ["override_bcplib"],
6246 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006247 hidden_api: {
6248 split_packages: ["*"],
6249 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006250 }
6251
6252 java_library {
6253 name: "systemserverlib",
6254 srcs: ["a.java"],
6255 apex_available: ["myapex"],
6256 }
6257
6258 systemserverclasspath_fragment {
6259 name: "mysystemserverclasspath_fragment",
6260 standalone_contents: ["systemserverlib"],
6261 apex_available: ["myapex"],
6262 }
6263
6264 java_library {
6265 name: "override_systemserverlib",
6266 srcs: ["a.java"],
6267 apex_available: ["myapex"],
6268 }
6269
6270 systemserverclasspath_fragment {
6271 name: "override_systemserverclasspath_fragment",
6272 standalone_contents: ["override_systemserverlib"],
6273 apex_available: ["myapex"],
6274 }
6275
6276 java_library {
6277 name: "myjava_library",
6278 srcs: ["a.java"],
6279 compile_dex: true,
6280 apex_available: ["myapex"],
6281 }
6282
6283 java_library {
6284 name: "override_java_library",
6285 srcs: ["a.java"],
6286 compile_dex: true,
6287 apex_available: ["myapex"],
6288 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006289 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006290
Jiyong Park317645e2019-12-05 13:20:58 +09006291 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6292 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6293 if originalVariant.GetOverriddenBy() != "" {
6294 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6295 }
6296 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6297 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6298 }
6299
Jiyong Park5d790c32019-11-15 18:40:32 +09006300 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6301 apexRule := module.Rule("apexRule")
6302 copyCmds := apexRule.Args["copy_commands"]
6303
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006304 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6305 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006306
markchien7c803b82021-08-26 22:10:06 +08006307 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006308 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006309
Daniel Norman5a3ce132021-08-26 15:44:43 -07006310 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6311 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6312
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006313 apexBundle := module.Module().(*apexBundle)
6314 name := apexBundle.Name()
6315 if name != "override_myapex" {
6316 t.Errorf("name should be \"override_myapex\", but was %q", name)
6317 }
6318
Baligh Uddin004d7172020-02-19 21:29:28 -08006319 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6320 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6321 }
6322
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006323 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6324 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6325 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6326 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6327 android.AssertArrayString(t, "Java_libs does not match",
6328 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6329
Jiyong Park20bacab2020-03-03 11:45:41 +09006330 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006331 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006332 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6333
6334 signApkRule := module.Rule("signapk")
6335 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006336
Colin Crossaa255532020-07-03 13:18:24 -07006337 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006338 var builder strings.Builder
6339 data.Custom(&builder, name, "TARGET_", "", data)
6340 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006341 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Ken Chen5372a242022-07-07 17:48:06 +08006342 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006343 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006344 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6345 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6346 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006347 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006348 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006349 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006350 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006351 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006352 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006353 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6354 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6355 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006356 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006357}
6358
Albert Martineefabcf2022-03-21 20:11:16 +00006359func TestMinSdkVersionOverride(t *testing.T) {
6360 // Override from 29 to 31
6361 minSdkOverride31 := "31"
6362 ctx := testApex(t, `
6363 apex {
6364 name: "myapex",
6365 key: "myapex.key",
6366 native_shared_libs: ["mylib"],
6367 updatable: true,
6368 min_sdk_version: "29"
6369 }
6370
6371 override_apex {
6372 name: "override_myapex",
6373 base: "myapex",
6374 logging_parent: "com.foo.bar",
6375 package_name: "test.overridden.package"
6376 }
6377
6378 apex_key {
6379 name: "myapex.key",
6380 public_key: "testkey.avbpubkey",
6381 private_key: "testkey.pem",
6382 }
6383
6384 cc_library {
6385 name: "mylib",
6386 srcs: ["mylib.cpp"],
6387 runtime_libs: ["libbar"],
6388 system_shared_libs: [],
6389 stl: "none",
6390 apex_available: [ "myapex" ],
6391 min_sdk_version: "apex_inherit"
6392 }
6393
6394 cc_library {
6395 name: "libbar",
6396 srcs: ["mylib.cpp"],
6397 system_shared_libs: [],
6398 stl: "none",
6399 apex_available: [ "myapex" ],
6400 min_sdk_version: "apex_inherit"
6401 }
6402
6403 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6404
6405 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6406 copyCmds := apexRule.Args["copy_commands"]
6407
6408 // Ensure that direct non-stubs dep is always included
6409 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6410
6411 // Ensure that runtime_libs dep in included
6412 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6413
6414 // Ensure libraries target overridden min_sdk_version value
6415 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6416}
6417
6418func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6419 // Attempt to override from 31 to 29, should be a NOOP
6420 minSdkOverride29 := "29"
6421 ctx := testApex(t, `
6422 apex {
6423 name: "myapex",
6424 key: "myapex.key",
6425 native_shared_libs: ["mylib"],
6426 updatable: true,
6427 min_sdk_version: "31"
6428 }
6429
6430 override_apex {
6431 name: "override_myapex",
6432 base: "myapex",
6433 logging_parent: "com.foo.bar",
6434 package_name: "test.overridden.package"
6435 }
6436
6437 apex_key {
6438 name: "myapex.key",
6439 public_key: "testkey.avbpubkey",
6440 private_key: "testkey.pem",
6441 }
6442
6443 cc_library {
6444 name: "mylib",
6445 srcs: ["mylib.cpp"],
6446 runtime_libs: ["libbar"],
6447 system_shared_libs: [],
6448 stl: "none",
6449 apex_available: [ "myapex" ],
6450 min_sdk_version: "apex_inherit"
6451 }
6452
6453 cc_library {
6454 name: "libbar",
6455 srcs: ["mylib.cpp"],
6456 system_shared_libs: [],
6457 stl: "none",
6458 apex_available: [ "myapex" ],
6459 min_sdk_version: "apex_inherit"
6460 }
6461
6462 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6463
6464 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6465 copyCmds := apexRule.Args["copy_commands"]
6466
6467 // Ensure that direct non-stubs dep is always included
6468 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6469
6470 // Ensure that runtime_libs dep in included
6471 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6472
6473 // Ensure libraries target the original min_sdk_version value rather than the overridden
6474 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6475}
6476
Jooyung Han214bf372019-11-12 13:03:50 +09006477func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006478 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006479 apex {
6480 name: "myapex",
6481 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006482 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006483 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006484 }
6485
6486 apex_key {
6487 name: "myapex.key",
6488 public_key: "testkey.avbpubkey",
6489 private_key: "testkey.pem",
6490 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006491
6492 cc_library {
6493 name: "mylib",
6494 srcs: ["mylib.cpp"],
6495 stl: "libc++",
6496 system_shared_libs: [],
6497 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006498 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006499 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006500 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006501
6502 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6503 args := module.Rule("apexRule").Args
6504 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006505 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006506
6507 // The copies of the libraries in the apex should have one more dependency than
6508 // the ones outside the apex, namely the unwinder. Ideally we should check
6509 // the dependency names directly here but for some reason the names are blank in
6510 // this test.
6511 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006512 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006513 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6514 if len(apexImplicits) != len(nonApexImplicits)+1 {
6515 t.Errorf("%q missing unwinder dep", lib)
6516 }
6517 }
Jooyung Han214bf372019-11-12 13:03:50 +09006518}
6519
Paul Duffine05480a2021-03-08 15:07:14 +00006520var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006521 "api/current.txt": nil,
6522 "api/removed.txt": nil,
6523 "api/system-current.txt": nil,
6524 "api/system-removed.txt": nil,
6525 "api/test-current.txt": nil,
6526 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006527
Anton Hanssondff2c782020-12-21 17:10:01 +00006528 "100/public/api/foo.txt": nil,
6529 "100/public/api/foo-removed.txt": nil,
6530 "100/system/api/foo.txt": nil,
6531 "100/system/api/foo-removed.txt": nil,
6532
Paul Duffineedc5d52020-06-12 17:46:39 +01006533 // For java_sdk_library_import
6534 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006535}
6536
Jooyung Han58f26ab2019-12-18 15:34:32 +09006537func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006538 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006539 apex {
6540 name: "myapex",
6541 key: "myapex.key",
6542 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006543 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006544 }
6545
6546 apex_key {
6547 name: "myapex.key",
6548 public_key: "testkey.avbpubkey",
6549 private_key: "testkey.pem",
6550 }
6551
6552 java_sdk_library {
6553 name: "foo",
6554 srcs: ["a.java"],
6555 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006556 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006557 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006558
6559 prebuilt_apis {
6560 name: "sdk",
6561 api_dirs: ["100"],
6562 }
Paul Duffin9b879592020-05-26 13:21:35 +01006563 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006564
6565 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006566 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006567 "javalib/foo.jar",
6568 "etc/permissions/foo.xml",
6569 })
6570 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006571 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006572 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 +09006573}
6574
Paul Duffin9b879592020-05-26 13:21:35 +01006575func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006576 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006577 apex {
6578 name: "myapex",
6579 key: "myapex.key",
6580 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006581 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006582 }
6583
6584 apex_key {
6585 name: "myapex.key",
6586 public_key: "testkey.avbpubkey",
6587 private_key: "testkey.pem",
6588 }
6589
6590 java_sdk_library {
6591 name: "foo",
6592 srcs: ["a.java"],
6593 api_packages: ["foo"],
6594 apex_available: ["myapex"],
6595 sdk_version: "none",
6596 system_modules: "none",
6597 }
6598
6599 java_library {
6600 name: "bar",
6601 srcs: ["a.java"],
6602 libs: ["foo"],
6603 apex_available: ["myapex"],
6604 sdk_version: "none",
6605 system_modules: "none",
6606 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006607
6608 prebuilt_apis {
6609 name: "sdk",
6610 api_dirs: ["100"],
6611 }
Paul Duffin9b879592020-05-26 13:21:35 +01006612 `, withFiles(filesForSdkLibrary))
6613
6614 // java_sdk_library installs both impl jar and permission XML
6615 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6616 "javalib/bar.jar",
6617 "javalib/foo.jar",
6618 "etc/permissions/foo.xml",
6619 })
6620
6621 // The bar library should depend on the implementation jar.
6622 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006623 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006624 t.Errorf("expected %q, found %#q", expected, actual)
6625 }
6626}
6627
6628func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006629 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006630 apex {
6631 name: "myapex",
6632 key: "myapex.key",
6633 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006634 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006635 }
6636
6637 apex_key {
6638 name: "myapex.key",
6639 public_key: "testkey.avbpubkey",
6640 private_key: "testkey.pem",
6641 }
6642
6643 java_sdk_library {
6644 name: "foo",
6645 srcs: ["a.java"],
6646 api_packages: ["foo"],
6647 apex_available: ["myapex"],
6648 sdk_version: "none",
6649 system_modules: "none",
6650 }
6651
6652 java_library {
6653 name: "bar",
6654 srcs: ["a.java"],
6655 libs: ["foo"],
6656 sdk_version: "none",
6657 system_modules: "none",
6658 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006659
6660 prebuilt_apis {
6661 name: "sdk",
6662 api_dirs: ["100"],
6663 }
Paul Duffin9b879592020-05-26 13:21:35 +01006664 `, withFiles(filesForSdkLibrary))
6665
6666 // java_sdk_library installs both impl jar and permission XML
6667 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6668 "javalib/foo.jar",
6669 "etc/permissions/foo.xml",
6670 })
6671
6672 // The bar library should depend on the stubs jar.
6673 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006674 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006675 t.Errorf("expected %q, found %#q", expected, actual)
6676 }
6677}
6678
Paul Duffineedc5d52020-06-12 17:46:39 +01006679func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006680 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006681 prebuilt_apis {
6682 name: "sdk",
6683 api_dirs: ["100"],
6684 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006685 withFiles(map[string][]byte{
6686 "apex/a.java": nil,
6687 "apex/apex_manifest.json": nil,
6688 "apex/Android.bp": []byte(`
6689 package {
6690 default_visibility: ["//visibility:private"],
6691 }
6692
6693 apex {
6694 name: "myapex",
6695 key: "myapex.key",
6696 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006697 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006698 }
6699
6700 apex_key {
6701 name: "myapex.key",
6702 public_key: "testkey.avbpubkey",
6703 private_key: "testkey.pem",
6704 }
6705
6706 java_library {
6707 name: "bar",
6708 srcs: ["a.java"],
6709 libs: ["foo"],
6710 apex_available: ["myapex"],
6711 sdk_version: "none",
6712 system_modules: "none",
6713 }
6714`),
6715 "source/a.java": nil,
6716 "source/api/current.txt": nil,
6717 "source/api/removed.txt": nil,
6718 "source/Android.bp": []byte(`
6719 package {
6720 default_visibility: ["//visibility:private"],
6721 }
6722
6723 java_sdk_library {
6724 name: "foo",
6725 visibility: ["//apex"],
6726 srcs: ["a.java"],
6727 api_packages: ["foo"],
6728 apex_available: ["myapex"],
6729 sdk_version: "none",
6730 system_modules: "none",
6731 public: {
6732 enabled: true,
6733 },
6734 }
6735`),
6736 "prebuilt/a.jar": nil,
6737 "prebuilt/Android.bp": []byte(`
6738 package {
6739 default_visibility: ["//visibility:private"],
6740 }
6741
6742 java_sdk_library_import {
6743 name: "foo",
6744 visibility: ["//apex", "//source"],
6745 apex_available: ["myapex"],
6746 prefer: true,
6747 public: {
6748 jars: ["a.jar"],
6749 },
6750 }
6751`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006752 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006753 )
6754
6755 // java_sdk_library installs both impl jar and permission XML
6756 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6757 "javalib/bar.jar",
6758 "javalib/foo.jar",
6759 "etc/permissions/foo.xml",
6760 })
6761
6762 // The bar library should depend on the implementation jar.
6763 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006764 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006765 t.Errorf("expected %q, found %#q", expected, actual)
6766 }
6767}
6768
6769func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6770 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6771 apex {
6772 name: "myapex",
6773 key: "myapex.key",
6774 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006775 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006776 }
6777
6778 apex_key {
6779 name: "myapex.key",
6780 public_key: "testkey.avbpubkey",
6781 private_key: "testkey.pem",
6782 }
6783
6784 java_sdk_library_import {
6785 name: "foo",
6786 apex_available: ["myapex"],
6787 prefer: true,
6788 public: {
6789 jars: ["a.jar"],
6790 },
6791 }
6792
6793 `, withFiles(filesForSdkLibrary))
6794}
6795
atrost6e126252020-01-27 17:01:16 +00006796func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006797 result := android.GroupFixturePreparers(
6798 prepareForApexTest,
6799 java.PrepareForTestWithPlatformCompatConfig,
6800 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006801 apex {
6802 name: "myapex",
6803 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006804 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006805 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006806 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006807 }
6808
6809 apex_key {
6810 name: "myapex.key",
6811 public_key: "testkey.avbpubkey",
6812 private_key: "testkey.pem",
6813 }
6814
6815 platform_compat_config {
6816 name: "myjar-platform-compat-config",
6817 src: ":myjar",
6818 }
6819
6820 java_library {
6821 name: "myjar",
6822 srcs: ["foo/bar/MyClass.java"],
6823 sdk_version: "none",
6824 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006825 apex_available: [ "myapex" ],
6826 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006827
6828 // Make sure that a preferred prebuilt does not affect the apex contents.
6829 prebuilt_platform_compat_config {
6830 name: "myjar-platform-compat-config",
6831 metadata: "compat-config/metadata.xml",
6832 prefer: true,
6833 }
atrost6e126252020-01-27 17:01:16 +00006834 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006835 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006836 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6837 "etc/compatconfig/myjar-platform-compat-config.xml",
6838 "javalib/myjar.jar",
6839 })
6840}
6841
Jiyong Park479321d2019-12-16 11:47:12 +09006842func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6843 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6844 apex {
6845 name: "myapex",
6846 key: "myapex.key",
6847 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006848 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006849 }
6850
6851 apex_key {
6852 name: "myapex.key",
6853 public_key: "testkey.avbpubkey",
6854 private_key: "testkey.pem",
6855 }
6856
6857 java_library {
6858 name: "myjar",
6859 srcs: ["foo/bar/MyClass.java"],
6860 sdk_version: "none",
6861 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006862 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006863 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006864 }
6865 `)
6866}
6867
Jiyong Park7afd1072019-12-30 16:56:33 +09006868func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006869 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006870 apex {
6871 name: "myapex",
6872 key: "myapex.key",
6873 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006874 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006875 }
6876
6877 apex_key {
6878 name: "myapex.key",
6879 public_key: "testkey.avbpubkey",
6880 private_key: "testkey.pem",
6881 }
6882
6883 cc_library {
6884 name: "mylib",
6885 srcs: ["mylib.cpp"],
6886 system_shared_libs: [],
6887 stl: "none",
6888 required: ["a", "b"],
6889 host_required: ["c", "d"],
6890 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006891 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006892 }
6893 `)
6894
6895 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006896 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006897 name := apexBundle.BaseModuleName()
6898 prefix := "TARGET_"
6899 var builder strings.Builder
6900 data.Custom(&builder, name, prefix, "", data)
6901 androidMk := builder.String()
6902 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6903 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6904 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6905}
6906
Jiyong Park7cd10e32020-01-14 09:22:18 +09006907func TestSymlinksFromApexToSystem(t *testing.T) {
6908 bp := `
6909 apex {
6910 name: "myapex",
6911 key: "myapex.key",
6912 native_shared_libs: ["mylib"],
6913 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006914 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006915 }
6916
Jiyong Park9d677202020-02-19 16:29:35 +09006917 apex {
6918 name: "myapex.updatable",
6919 key: "myapex.key",
6920 native_shared_libs: ["mylib"],
6921 java_libs: ["myjar"],
6922 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006923 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006924 }
6925
Jiyong Park7cd10e32020-01-14 09:22:18 +09006926 apex_key {
6927 name: "myapex.key",
6928 public_key: "testkey.avbpubkey",
6929 private_key: "testkey.pem",
6930 }
6931
6932 cc_library {
6933 name: "mylib",
6934 srcs: ["mylib.cpp"],
6935 shared_libs: ["myotherlib"],
6936 system_shared_libs: [],
6937 stl: "none",
6938 apex_available: [
6939 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006940 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006941 "//apex_available:platform",
6942 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006943 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006944 }
6945
6946 cc_library {
6947 name: "myotherlib",
6948 srcs: ["mylib.cpp"],
6949 system_shared_libs: [],
6950 stl: "none",
6951 apex_available: [
6952 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006953 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006954 "//apex_available:platform",
6955 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006956 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006957 }
6958
6959 java_library {
6960 name: "myjar",
6961 srcs: ["foo/bar/MyClass.java"],
6962 sdk_version: "none",
6963 system_modules: "none",
6964 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006965 apex_available: [
6966 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006967 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006968 "//apex_available:platform",
6969 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006970 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006971 }
6972
6973 java_library {
6974 name: "myotherjar",
6975 srcs: ["foo/bar/MyClass.java"],
6976 sdk_version: "none",
6977 system_modules: "none",
6978 apex_available: [
6979 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006980 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006981 "//apex_available:platform",
6982 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006983 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006984 }
6985 `
6986
6987 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6988 for _, f := range files {
6989 if f.path == file {
6990 if f.isLink {
6991 t.Errorf("%q is not a real file", file)
6992 }
6993 return
6994 }
6995 }
6996 t.Errorf("%q is not found", file)
6997 }
6998
6999 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7000 for _, f := range files {
7001 if f.path == file {
7002 if !f.isLink {
7003 t.Errorf("%q is not a symlink", file)
7004 }
7005 return
7006 }
7007 }
7008 t.Errorf("%q is not found", file)
7009 }
7010
Jiyong Park9d677202020-02-19 16:29:35 +09007011 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7012 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007013 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007014 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007015 ensureRealfileExists(t, files, "javalib/myjar.jar")
7016 ensureRealfileExists(t, files, "lib64/mylib.so")
7017 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7018
Jiyong Park9d677202020-02-19 16:29:35 +09007019 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7020 ensureRealfileExists(t, files, "javalib/myjar.jar")
7021 ensureRealfileExists(t, files, "lib64/mylib.so")
7022 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7023
7024 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007025 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007026 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007027 ensureRealfileExists(t, files, "javalib/myjar.jar")
7028 ensureRealfileExists(t, files, "lib64/mylib.so")
7029 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007030
7031 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7032 ensureRealfileExists(t, files, "javalib/myjar.jar")
7033 ensureRealfileExists(t, files, "lib64/mylib.so")
7034 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007035}
7036
Yo Chiange8128052020-07-23 20:09:18 +08007037func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007038 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007039 apex {
7040 name: "myapex",
7041 key: "myapex.key",
7042 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007043 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007044 }
7045
7046 apex_key {
7047 name: "myapex.key",
7048 public_key: "testkey.avbpubkey",
7049 private_key: "testkey.pem",
7050 }
7051
7052 cc_library_shared {
7053 name: "mylib",
7054 srcs: ["mylib.cpp"],
7055 shared_libs: ["myotherlib"],
7056 system_shared_libs: [],
7057 stl: "none",
7058 apex_available: [
7059 "myapex",
7060 "//apex_available:platform",
7061 ],
7062 }
7063
7064 cc_prebuilt_library_shared {
7065 name: "myotherlib",
7066 srcs: ["prebuilt.so"],
7067 system_shared_libs: [],
7068 stl: "none",
7069 apex_available: [
7070 "myapex",
7071 "//apex_available:platform",
7072 ],
7073 }
7074 `)
7075
7076 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007077 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007078 var builder strings.Builder
7079 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7080 androidMk := builder.String()
7081 // `myotherlib` is added to `myapex` as symlink
7082 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
7083 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7084 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7085 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09007086 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 +08007087}
7088
Jooyung Han643adc42020-02-27 13:50:06 +09007089func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007090 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007091 apex {
7092 name: "myapex",
7093 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007094 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007095 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007096 }
7097
7098 apex_key {
7099 name: "myapex.key",
7100 public_key: "testkey.avbpubkey",
7101 private_key: "testkey.pem",
7102 }
7103
7104 cc_library {
7105 name: "mylib",
7106 srcs: ["mylib.cpp"],
7107 shared_libs: ["mylib2"],
7108 system_shared_libs: [],
7109 stl: "none",
7110 apex_available: [ "myapex" ],
7111 }
7112
7113 cc_library {
7114 name: "mylib2",
7115 srcs: ["mylib.cpp"],
7116 system_shared_libs: [],
7117 stl: "none",
7118 apex_available: [ "myapex" ],
7119 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007120
7121 rust_ffi_shared {
7122 name: "libfoo.rust",
7123 crate_name: "foo",
7124 srcs: ["foo.rs"],
7125 shared_libs: ["libfoo.shared_from_rust"],
7126 prefer_rlib: true,
7127 apex_available: ["myapex"],
7128 }
7129
7130 cc_library_shared {
7131 name: "libfoo.shared_from_rust",
7132 srcs: ["mylib.cpp"],
7133 system_shared_libs: [],
7134 stl: "none",
7135 stubs: {
7136 versions: ["10", "11", "12"],
7137 },
7138 }
7139
Jooyung Han643adc42020-02-27 13:50:06 +09007140 `)
7141
7142 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7143 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007144 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007145 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7146 "lib64/mylib.so",
7147 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007148 "lib64/libfoo.rust.so",
7149 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7150 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007151 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007152
7153 // b/220397949
7154 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007155}
7156
Jooyung Han49f67012020-04-17 13:43:10 +09007157func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007158 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007159 apex {
7160 name: "myapex",
7161 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007162 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007163 }
7164 apex_key {
7165 name: "myapex.key",
7166 public_key: "testkey.avbpubkey",
7167 private_key: "testkey.pem",
7168 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007169 `,
7170 android.FixtureModifyConfig(func(config android.Config) {
7171 delete(config.Targets, android.Android)
7172 config.AndroidCommonTarget = android.Target{}
7173 }),
7174 )
Jooyung Han49f67012020-04-17 13:43:10 +09007175
7176 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7177 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7178 }
7179}
7180
Jiyong Parkbd159612020-02-28 15:22:21 +09007181func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007182 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007183 apex {
7184 name: "myapex",
7185 key: "myapex.key",
7186 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007187 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007188 }
7189
7190 apex_key {
7191 name: "myapex.key",
7192 public_key: "testkey.avbpubkey",
7193 private_key: "testkey.pem",
7194 }
7195
7196 android_app {
7197 name: "AppFoo",
7198 srcs: ["foo/bar/MyClass.java"],
7199 sdk_version: "none",
7200 system_modules: "none",
7201 apex_available: [ "myapex" ],
7202 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007203 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007204
Colin Crosscf371cc2020-11-13 11:48:42 -08007205 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007206 content := bundleConfigRule.Args["content"]
7207
7208 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007209 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 +09007210}
7211
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007212func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007213 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007214 apex {
7215 name: "myapex",
7216 key: "myapex.key",
7217 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007218 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007219 }
7220
7221 apex_key {
7222 name: "myapex.key",
7223 public_key: "testkey.avbpubkey",
7224 private_key: "testkey.pem",
7225 }
7226
7227 android_app_set {
7228 name: "AppSet",
7229 set: "AppSet.apks",
7230 }`)
7231 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007232 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007233 content := bundleConfigRule.Args["content"]
7234 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7235 s := mod.Rule("apexRule").Args["copy_commands"]
7236 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
7237 if len(copyCmds) != 3 {
7238 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
7239 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007240 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7241 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
7242 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007243}
7244
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007245func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007246 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007247 apex_set {
7248 name: "myapex",
7249 filename: "foo_v2.apex",
7250 sanitized: {
7251 none: { set: "myapex.apks", },
7252 hwaddress: { set: "myapex.hwasan.apks", },
7253 },
Paul Duffin24704672021-04-06 16:09:30 +01007254 }
7255 `
7256 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007257
Paul Duffin24704672021-04-06 16:09:30 +01007258 // Check that the extractor produces the correct output file from the correct input file.
7259 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007260
Paul Duffin24704672021-04-06 16:09:30 +01007261 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7262 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007263
Paul Duffin24704672021-04-06 16:09:30 +01007264 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7265
7266 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007267 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7268 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007269
7270 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007271}
7272
Paul Duffin89f570a2021-06-16 01:42:33 +01007273func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007274 t.Helper()
7275
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007276 bp := `
7277 java_library {
7278 name: "some-updatable-apex-lib",
7279 srcs: ["a.java"],
7280 sdk_version: "current",
7281 apex_available: [
7282 "some-updatable-apex",
7283 ],
satayevabcd5972021-08-06 17:49:46 +01007284 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007285 }
7286
7287 java_library {
7288 name: "some-non-updatable-apex-lib",
7289 srcs: ["a.java"],
7290 apex_available: [
7291 "some-non-updatable-apex",
7292 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007293 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007294 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007295 }
7296
7297 bootclasspath_fragment {
7298 name: "some-non-updatable-fragment",
7299 contents: ["some-non-updatable-apex-lib"],
7300 apex_available: [
7301 "some-non-updatable-apex",
7302 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007303 hidden_api: {
7304 split_packages: ["*"],
7305 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007306 }
7307
7308 java_library {
7309 name: "some-platform-lib",
7310 srcs: ["a.java"],
7311 sdk_version: "current",
7312 installable: true,
7313 }
7314
7315 java_library {
7316 name: "some-art-lib",
7317 srcs: ["a.java"],
7318 sdk_version: "current",
7319 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007320 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007321 ],
7322 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007323 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007324 }
7325
7326 apex {
7327 name: "some-updatable-apex",
7328 key: "some-updatable-apex.key",
7329 java_libs: ["some-updatable-apex-lib"],
7330 updatable: true,
7331 min_sdk_version: "current",
7332 }
7333
7334 apex {
7335 name: "some-non-updatable-apex",
7336 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007337 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007338 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007339 }
7340
7341 apex_key {
7342 name: "some-updatable-apex.key",
7343 }
7344
7345 apex_key {
7346 name: "some-non-updatable-apex.key",
7347 }
7348
7349 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007350 name: "com.android.art.debug",
7351 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007352 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007353 updatable: true,
7354 min_sdk_version: "current",
7355 }
7356
Paul Duffinf23bc472021-04-27 12:42:20 +01007357 bootclasspath_fragment {
7358 name: "art-bootclasspath-fragment",
7359 image_name: "art",
7360 contents: ["some-art-lib"],
7361 apex_available: [
7362 "com.android.art.debug",
7363 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007364 hidden_api: {
7365 split_packages: ["*"],
7366 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007367 }
7368
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007369 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007370 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007371 }
7372
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007373 filegroup {
7374 name: "some-updatable-apex-file_contexts",
7375 srcs: [
7376 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7377 ],
7378 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007379
7380 filegroup {
7381 name: "some-non-updatable-apex-file_contexts",
7382 srcs: [
7383 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7384 ],
7385 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007386 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007387
Paul Duffin89f570a2021-06-16 01:42:33 +01007388 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007389}
7390
Paul Duffin89f570a2021-06-16 01:42:33 +01007391func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007392 t.Helper()
7393
Paul Duffin55607122021-03-30 23:32:51 +01007394 fs := android.MockFS{
7395 "a.java": nil,
7396 "a.jar": nil,
7397 "apex_manifest.json": nil,
7398 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007399 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007400 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7401 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7402 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007403 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007404 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007405
Paul Duffin55607122021-03-30 23:32:51 +01007406 errorHandler := android.FixtureExpectsNoErrors
7407 if errmsg != "" {
7408 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007409 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007410
Paul Duffin55607122021-03-30 23:32:51 +01007411 result := android.GroupFixturePreparers(
7412 cc.PrepareForTestWithCcDefaultModules,
7413 java.PrepareForTestWithHiddenApiBuildComponents,
7414 java.PrepareForTestWithJavaDefaultModules,
7415 java.PrepareForTestWithJavaSdkLibraryFiles,
7416 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007417 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007418 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007419 android.FixtureModifyMockFS(func(fs android.MockFS) {
7420 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7421 insert := ""
7422 for _, fragment := range fragments {
7423 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7424 }
7425 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7426 platform_bootclasspath {
7427 name: "platform-bootclasspath",
7428 fragments: [
7429 %s
7430 ],
7431 }
7432 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007433 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007434 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007435 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007436 ).
7437 ExtendWithErrorHandler(errorHandler).
7438 RunTestWithBp(t, bp)
7439
7440 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007441}
7442
Paul Duffin5556c5f2022-06-09 17:32:21 +00007443func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007444 preparers := android.GroupFixturePreparers(
7445 java.PrepareForTestWithJavaDefaultModules,
7446 PrepareForTestWithApexBuildComponents,
7447 ).
7448 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7449 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7450
7451 bpBase := `
7452 apex_set {
7453 name: "com.android.myapex",
7454 installable: true,
7455 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7456 set: "myapex.apks",
7457 }
7458
7459 apex_set {
7460 name: "com.mycompany.android.myapex",
7461 apex_name: "com.android.myapex",
7462 installable: true,
7463 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7464 set: "company-myapex.apks",
7465 }
7466
7467 prebuilt_bootclasspath_fragment {
7468 name: "my-bootclasspath-fragment",
7469 apex_available: ["com.android.myapex"],
7470 %s
7471 }
7472 `
7473
7474 t.Run("java_import", func(t *testing.T) {
7475 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7476 java_import {
7477 name: "libfoo",
7478 jars: ["libfoo.jar"],
7479 apex_available: ["com.android.myapex"],
7480 }
7481 `)
7482 })
7483
7484 t.Run("java_sdk_library_import", func(t *testing.T) {
7485 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7486 java_sdk_library_import {
7487 name: "libfoo",
7488 public: {
7489 jars: ["libbar.jar"],
7490 },
7491 apex_available: ["com.android.myapex"],
7492 }
7493 `)
7494 })
7495
7496 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7497 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7498 image_name: "art",
7499 contents: ["libfoo"],
7500 `)+`
7501 java_sdk_library_import {
7502 name: "libfoo",
7503 public: {
7504 jars: ["libbar.jar"],
7505 },
7506 apex_available: ["com.android.myapex"],
7507 }
7508 `)
7509 })
7510}
7511
Paul Duffin5556c5f2022-06-09 17:32:21 +00007512func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7513 preparers := android.GroupFixturePreparers(
7514 java.PrepareForTestWithJavaDefaultModules,
7515 PrepareForTestWithApexBuildComponents,
7516 )
7517
7518 bpBase := `
7519 apex_set {
7520 name: "com.android.myapex",
7521 installable: true,
7522 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7523 set: "myapex.apks",
7524 }
7525
7526 apex_set {
7527 name: "com.android.myapex_compressed",
7528 apex_name: "com.android.myapex",
7529 installable: true,
7530 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7531 set: "myapex_compressed.apks",
7532 }
7533
7534 prebuilt_bootclasspath_fragment {
7535 name: "my-bootclasspath-fragment",
7536 apex_available: [
7537 "com.android.myapex",
7538 "com.android.myapex_compressed",
7539 ],
7540 hidden_api: {
7541 annotation_flags: "annotation-flags.csv",
7542 metadata: "metadata.csv",
7543 index: "index.csv",
7544 signature_patterns: "signature_patterns.csv",
7545 },
7546 %s
7547 }
7548 `
7549
7550 t.Run("java_import", func(t *testing.T) {
7551 result := preparers.RunTestWithBp(t,
7552 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7553 java_import {
7554 name: "libfoo",
7555 jars: ["libfoo.jar"],
7556 apex_available: [
7557 "com.android.myapex",
7558 "com.android.myapex_compressed",
7559 ],
7560 }
7561 `)
7562
7563 module := result.Module("libfoo", "android_common_com.android.myapex")
7564 usesLibraryDep := module.(java.UsesLibraryDependency)
7565 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7566 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7567 usesLibraryDep.DexJarBuildPath().Path())
7568 })
7569
7570 t.Run("java_sdk_library_import", func(t *testing.T) {
7571 result := preparers.RunTestWithBp(t,
7572 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7573 java_sdk_library_import {
7574 name: "libfoo",
7575 public: {
7576 jars: ["libbar.jar"],
7577 },
7578 apex_available: [
7579 "com.android.myapex",
7580 "com.android.myapex_compressed",
7581 ],
7582 compile_dex: true,
7583 }
7584 `)
7585
7586 module := result.Module("libfoo", "android_common_com.android.myapex")
7587 usesLibraryDep := module.(java.UsesLibraryDependency)
7588 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7589 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7590 usesLibraryDep.DexJarBuildPath().Path())
7591 })
7592
7593 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7594 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7595 image_name: "art",
7596 contents: ["libfoo"],
7597 `)+`
7598 java_sdk_library_import {
7599 name: "libfoo",
7600 public: {
7601 jars: ["libbar.jar"],
7602 },
7603 apex_available: [
7604 "com.android.myapex",
7605 "com.android.myapex_compressed",
7606 ],
7607 compile_dex: true,
7608 }
7609 `)
7610 })
7611}
7612
Jooyung Han548640b2020-04-27 12:10:30 +09007613func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7614 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7615 apex {
7616 name: "myapex",
7617 key: "myapex.key",
7618 updatable: true,
7619 }
7620
7621 apex_key {
7622 name: "myapex.key",
7623 public_key: "testkey.avbpubkey",
7624 private_key: "testkey.pem",
7625 }
7626 `)
7627}
7628
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007629func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7630 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7631 apex {
7632 name: "myapex",
7633 key: "myapex.key",
7634 }
7635
7636 apex_key {
7637 name: "myapex.key",
7638 public_key: "testkey.avbpubkey",
7639 private_key: "testkey.pem",
7640 }
7641 `)
7642}
7643
Daniel Norman69109112021-12-02 12:52:42 -08007644func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7645 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7646 apex {
7647 name: "myapex",
7648 key: "myapex.key",
7649 updatable: true,
7650 soc_specific: true,
7651 }
7652
7653 apex_key {
7654 name: "myapex.key",
7655 public_key: "testkey.avbpubkey",
7656 private_key: "testkey.pem",
7657 }
7658 `)
7659}
7660
satayevb98371c2021-06-15 16:49:50 +01007661func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7662 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7663 apex {
7664 name: "myapex",
7665 key: "myapex.key",
7666 systemserverclasspath_fragments: [
7667 "mysystemserverclasspathfragment",
7668 ],
7669 min_sdk_version: "29",
7670 updatable: true,
7671 }
7672
7673 apex_key {
7674 name: "myapex.key",
7675 public_key: "testkey.avbpubkey",
7676 private_key: "testkey.pem",
7677 }
7678
7679 java_library {
7680 name: "foo",
7681 srcs: ["b.java"],
7682 min_sdk_version: "29",
7683 installable: true,
7684 apex_available: [
7685 "myapex",
7686 ],
7687 }
7688
7689 systemserverclasspath_fragment {
7690 name: "mysystemserverclasspathfragment",
7691 generate_classpaths_proto: false,
7692 contents: [
7693 "foo",
7694 ],
7695 apex_available: [
7696 "myapex",
7697 ],
7698 }
satayevabcd5972021-08-06 17:49:46 +01007699 `,
7700 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7701 )
satayevb98371c2021-06-15 16:49:50 +01007702}
7703
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007704func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007705 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7706 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7707 // modules to be included in the BootJars.
7708 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7709 return android.GroupFixturePreparers(
7710 dexpreopt.FixtureSetBootJars(bootJars...),
7711 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7712 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7713 }),
7714 )
7715 }
7716
7717 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7718 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7719 // specified in the ArtApexJars configuration.
7720 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7721 return android.GroupFixturePreparers(
7722 dexpreopt.FixtureSetArtBootJars(bootJars...),
7723 dexpreopt.FixtureSetBootJars(bootJars...),
7724 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7725 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7726 }),
7727 )
7728 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007729
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007730 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007731 preparer := android.GroupFixturePreparers(
7732 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7733 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7734 )
7735 fragments := []java.ApexVariantReference{
7736 {
7737 Apex: proptools.StringPtr("com.android.art.debug"),
7738 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7739 },
7740 {
7741 Apex: proptools.StringPtr("some-non-updatable-apex"),
7742 Module: proptools.StringPtr("some-non-updatable-fragment"),
7743 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007744 }
satayevabcd5972021-08-06 17:49:46 +01007745 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007746 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007747
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007748 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007749 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7750 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007751 preparer := android.GroupFixturePreparers(
7752 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7753 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7754 )
Paul Duffin60264a02021-04-12 20:02:36 +01007755 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007756 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007757
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007758 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 +01007759 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 +01007760 // Update the dexpreopt ArtApexJars directly.
7761 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7762 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007763 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007764
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007765 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 +01007766 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 +01007767 // Update the dexpreopt ArtApexJars directly.
7768 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7769 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007770 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007771
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007772 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 +01007773 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 +01007774 preparer := android.GroupFixturePreparers(
7775 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7776 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7777 )
Paul Duffin60264a02021-04-12 20:02:36 +01007778 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007779 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007780
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007781 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 +01007782 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007783 fragment := java.ApexVariantReference{
7784 Apex: proptools.StringPtr("some-non-updatable-apex"),
7785 Module: proptools.StringPtr("some-non-updatable-fragment"),
7786 }
7787 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007788 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007789
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007790 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007791 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007792 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7793 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007794 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007795
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007796 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007797 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007798 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7799 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007800 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007801
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007802 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007803 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007804 // Update the dexpreopt ArtApexJars directly.
7805 preparer := prepareSetArtJars("platform:some-platform-lib")
7806 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007807 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007808
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007809 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007810 preparer := android.GroupFixturePreparers(
7811 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7812 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7813 )
7814 fragments := []java.ApexVariantReference{
7815 {
7816 Apex: proptools.StringPtr("some-non-updatable-apex"),
7817 Module: proptools.StringPtr("some-non-updatable-fragment"),
7818 },
7819 }
7820 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007821 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007822}
7823
7824func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007825 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007826 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007827 fragment := java.ApexVariantReference{
7828 Apex: proptools.StringPtr("myapex"),
7829 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7830 }
7831
Paul Duffin064b70c2020-11-02 17:32:38 +00007832 testDexpreoptWithApexes(t, `
7833 prebuilt_apex {
7834 name: "myapex" ,
7835 arch: {
7836 arm64: {
7837 src: "myapex-arm64.apex",
7838 },
7839 arm: {
7840 src: "myapex-arm.apex",
7841 },
7842 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007843 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7844 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007845
Paul Duffin89f570a2021-06-16 01:42:33 +01007846 prebuilt_bootclasspath_fragment {
7847 name: "my-bootclasspath-fragment",
7848 contents: ["libfoo"],
7849 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007850 hidden_api: {
7851 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7852 metadata: "my-bootclasspath-fragment/metadata.csv",
7853 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007854 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7855 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7856 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007857 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007858 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007859
Paul Duffin89f570a2021-06-16 01:42:33 +01007860 java_import {
7861 name: "libfoo",
7862 jars: ["libfoo.jar"],
7863 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007864 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007865 }
7866 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007867 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007868}
7869
Spandan Dasf14e2542021-11-12 00:01:37 +00007870func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007871 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007872 bp += `
7873 apex_key {
7874 name: "myapex.key",
7875 public_key: "testkey.avbpubkey",
7876 private_key: "testkey.pem",
7877 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007878 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007879 "lib1/src/A.java": nil,
7880 "lib2/src/B.java": nil,
7881 "system/sepolicy/apex/myapex-file_contexts": nil,
7882 }
7883
Paul Duffin45338f02021-03-30 23:07:52 +01007884 errorHandler := android.FixtureExpectsNoErrors
7885 if errmsg != "" {
7886 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007887 }
Colin Crossae8600b2020-10-29 17:09:13 -07007888
Paul Duffin45338f02021-03-30 23:07:52 +01007889 android.GroupFixturePreparers(
7890 android.PrepareForTestWithAndroidBuildComponents,
7891 java.PrepareForTestWithJavaBuildComponents,
7892 PrepareForTestWithApexBuildComponents,
7893 android.PrepareForTestWithNeverallowRules(rules),
7894 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007895 apexBootJars := make([]string, 0, len(bootJars))
7896 for _, apexBootJar := range bootJars {
7897 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007898 }
satayevd604b212021-07-21 14:23:52 +01007899 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007900 }),
7901 fs.AddToFixture(),
7902 ).
7903 ExtendWithErrorHandler(errorHandler).
7904 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007905}
7906
7907func TestApexPermittedPackagesRules(t *testing.T) {
7908 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00007909 name string
7910 expectedError string
7911 bp string
7912 bootJars []string
7913 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01007914 }{
7915
7916 {
7917 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7918 expectedError: "",
7919 bp: `
7920 java_library {
7921 name: "bcp_lib1",
7922 srcs: ["lib1/src/*.java"],
7923 permitted_packages: ["foo.bar"],
7924 apex_available: ["myapex"],
7925 sdk_version: "none",
7926 system_modules: "none",
7927 }
7928 java_library {
7929 name: "nonbcp_lib2",
7930 srcs: ["lib2/src/*.java"],
7931 apex_available: ["myapex"],
7932 permitted_packages: ["a.b"],
7933 sdk_version: "none",
7934 system_modules: "none",
7935 }
7936 apex {
7937 name: "myapex",
7938 key: "myapex.key",
7939 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007940 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007941 }`,
7942 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007943 bcpPermittedPackages: map[string][]string{
7944 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007945 "foo.bar",
7946 },
7947 },
7948 },
7949 {
Anton Hanssone1b18362021-12-23 15:05:38 +00007950 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00007951 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 +01007952 bp: `
7953 java_library {
7954 name: "bcp_lib1",
7955 srcs: ["lib1/src/*.java"],
7956 apex_available: ["myapex"],
7957 permitted_packages: ["foo.bar"],
7958 sdk_version: "none",
7959 system_modules: "none",
7960 }
7961 java_library {
7962 name: "bcp_lib2",
7963 srcs: ["lib2/src/*.java"],
7964 apex_available: ["myapex"],
7965 permitted_packages: ["foo.bar", "bar.baz"],
7966 sdk_version: "none",
7967 system_modules: "none",
7968 }
7969 apex {
7970 name: "myapex",
7971 key: "myapex.key",
7972 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007973 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007974 }
7975 `,
7976 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007977 bcpPermittedPackages: map[string][]string{
7978 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007979 "foo.bar",
7980 },
Spandan Dasf14e2542021-11-12 00:01:37 +00007981 "bcp_lib2": []string{
7982 "foo.bar",
7983 },
7984 },
7985 },
7986 {
7987 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
7988 expectedError: "",
7989 bp: `
7990 java_library {
7991 name: "bcp_lib_restricted",
7992 srcs: ["lib1/src/*.java"],
7993 apex_available: ["myapex"],
7994 permitted_packages: ["foo.bar"],
7995 sdk_version: "none",
7996 min_sdk_version: "29",
7997 system_modules: "none",
7998 }
7999 java_library {
8000 name: "bcp_lib_unrestricted",
8001 srcs: ["lib2/src/*.java"],
8002 apex_available: ["myapex"],
8003 permitted_packages: ["foo.bar", "bar.baz"],
8004 sdk_version: "none",
8005 min_sdk_version: "29",
8006 system_modules: "none",
8007 }
8008 apex {
8009 name: "myapex",
8010 key: "myapex.key",
8011 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8012 updatable: true,
8013 min_sdk_version: "29",
8014 }
8015 `,
8016 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8017 bcpPermittedPackages: map[string][]string{
8018 "bcp_lib1_non_updateable": []string{
8019 "foo.bar",
8020 },
8021 // 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 +01008022 },
8023 },
8024 }
8025 for _, tc := range testcases {
8026 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008027 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8028 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008029 })
8030 }
8031}
8032
Jiyong Park62304bb2020-04-13 16:19:48 +09008033func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008034 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008035 apex {
8036 name: "myapex",
8037 key: "myapex.key",
8038 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008039 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008040 }
8041
8042 apex_key {
8043 name: "myapex.key",
8044 public_key: "testkey.avbpubkey",
8045 private_key: "testkey.pem",
8046 }
8047
8048 cc_library {
8049 name: "mylib",
8050 srcs: ["mylib.cpp"],
8051 system_shared_libs: [],
8052 stl: "none",
8053 stubs: {
8054 versions: ["1"],
8055 },
8056 apex_available: ["myapex"],
8057 }
8058
8059 cc_library {
8060 name: "myprivlib",
8061 srcs: ["mylib.cpp"],
8062 system_shared_libs: [],
8063 stl: "none",
8064 apex_available: ["myapex"],
8065 }
8066
8067
8068 cc_test {
8069 name: "mytest",
8070 gtest: false,
8071 srcs: ["mylib.cpp"],
8072 system_shared_libs: [],
8073 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008074 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008075 test_for: ["myapex"]
8076 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008077
8078 cc_library {
8079 name: "mytestlib",
8080 srcs: ["mylib.cpp"],
8081 system_shared_libs: [],
8082 shared_libs: ["mylib", "myprivlib"],
8083 stl: "none",
8084 test_for: ["myapex"],
8085 }
8086
8087 cc_benchmark {
8088 name: "mybench",
8089 srcs: ["mylib.cpp"],
8090 system_shared_libs: [],
8091 shared_libs: ["mylib", "myprivlib"],
8092 stl: "none",
8093 test_for: ["myapex"],
8094 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008095 `)
8096
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008097 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008098 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008099 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8100 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8101 }
8102
8103 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008104 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008105 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8106 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8107 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8108}
Jiyong Park46a512f2020-12-04 18:02:13 +09008109
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008110func TestIndirectTestFor(t *testing.T) {
8111 ctx := testApex(t, `
8112 apex {
8113 name: "myapex",
8114 key: "myapex.key",
8115 native_shared_libs: ["mylib", "myprivlib"],
8116 updatable: false,
8117 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008118
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008119 apex_key {
8120 name: "myapex.key",
8121 public_key: "testkey.avbpubkey",
8122 private_key: "testkey.pem",
8123 }
8124
8125 cc_library {
8126 name: "mylib",
8127 srcs: ["mylib.cpp"],
8128 system_shared_libs: [],
8129 stl: "none",
8130 stubs: {
8131 versions: ["1"],
8132 },
8133 apex_available: ["myapex"],
8134 }
8135
8136 cc_library {
8137 name: "myprivlib",
8138 srcs: ["mylib.cpp"],
8139 system_shared_libs: [],
8140 stl: "none",
8141 shared_libs: ["mylib"],
8142 apex_available: ["myapex"],
8143 }
8144
8145 cc_library {
8146 name: "mytestlib",
8147 srcs: ["mylib.cpp"],
8148 system_shared_libs: [],
8149 shared_libs: ["myprivlib"],
8150 stl: "none",
8151 test_for: ["myapex"],
8152 }
8153 `)
8154
8155 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008156 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008157 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8158 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8159 }
8160
8161 // The platform variant of mytestlib links to the platform variant of the
8162 // internal myprivlib.
8163 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8164
8165 // The platform variant of myprivlib links to the platform variant of mylib
8166 // and bypasses its stubs.
8167 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 +09008168}
8169
Martin Stjernholmec009002021-03-27 15:18:31 +00008170func TestTestForForLibInOtherApex(t *testing.T) {
8171 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8172 _ = testApex(t, `
8173 apex {
8174 name: "com.android.art",
8175 key: "myapex.key",
8176 native_shared_libs: ["mylib"],
8177 updatable: false,
8178 }
8179
8180 apex {
8181 name: "com.android.art.debug",
8182 key: "myapex.key",
8183 native_shared_libs: ["mylib", "mytestlib"],
8184 updatable: false,
8185 }
8186
8187 apex_key {
8188 name: "myapex.key",
8189 public_key: "testkey.avbpubkey",
8190 private_key: "testkey.pem",
8191 }
8192
8193 cc_library {
8194 name: "mylib",
8195 srcs: ["mylib.cpp"],
8196 system_shared_libs: [],
8197 stl: "none",
8198 stubs: {
8199 versions: ["1"],
8200 },
8201 apex_available: ["com.android.art", "com.android.art.debug"],
8202 }
8203
8204 cc_library {
8205 name: "mytestlib",
8206 srcs: ["mylib.cpp"],
8207 system_shared_libs: [],
8208 shared_libs: ["mylib"],
8209 stl: "none",
8210 apex_available: ["com.android.art.debug"],
8211 test_for: ["com.android.art"],
8212 }
8213 `,
8214 android.MockFS{
8215 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8216 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8217 }.AddToFixture())
8218}
8219
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008220// TODO(jungjw): Move this to proptools
8221func intPtr(i int) *int {
8222 return &i
8223}
8224
8225func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008226 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008227 apex_set {
8228 name: "myapex",
8229 set: "myapex.apks",
8230 filename: "foo_v2.apex",
8231 overrides: ["foo"],
8232 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008233 `,
8234 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8235 variables.Platform_sdk_version = intPtr(30)
8236 }),
8237 android.FixtureModifyConfig(func(config android.Config) {
8238 config.Targets[android.Android] = []android.Target{
8239 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8240 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8241 }
8242 }),
8243 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008244
Paul Duffin24704672021-04-06 16:09:30 +01008245 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008246
8247 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008248 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008249 actual := extractedApex.Args["abis"]
8250 expected := "ARMEABI_V7A,ARM64_V8A"
8251 if actual != expected {
8252 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8253 }
8254 actual = extractedApex.Args["sdk-version"]
8255 expected = "30"
8256 if actual != expected {
8257 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8258 }
8259
Paul Duffin6717d882021-06-15 19:09:41 +01008260 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008261 a := m.Module().(*ApexSet)
8262 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008263 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008264 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8265 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8266 }
8267}
8268
Jiyong Park7d95a512020-05-10 15:16:24 +09008269func TestNoStaticLinkingToStubsLib(t *testing.T) {
8270 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8271 apex {
8272 name: "myapex",
8273 key: "myapex.key",
8274 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008275 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008276 }
8277
8278 apex_key {
8279 name: "myapex.key",
8280 public_key: "testkey.avbpubkey",
8281 private_key: "testkey.pem",
8282 }
8283
8284 cc_library {
8285 name: "mylib",
8286 srcs: ["mylib.cpp"],
8287 static_libs: ["otherlib"],
8288 system_shared_libs: [],
8289 stl: "none",
8290 apex_available: [ "myapex" ],
8291 }
8292
8293 cc_library {
8294 name: "otherlib",
8295 srcs: ["mylib.cpp"],
8296 system_shared_libs: [],
8297 stl: "none",
8298 stubs: {
8299 versions: ["1", "2", "3"],
8300 },
8301 apex_available: [ "myapex" ],
8302 }
8303 `)
8304}
8305
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008306func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008307 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008308 apex {
8309 name: "myapex",
8310 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008311 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008312 custom_sign_tool: "sign_myapex",
8313 }
8314
8315 apex_key {
8316 name: "myapex.key",
8317 public_key: "testkey.avbpubkey",
8318 private_key: "testkey.pem",
8319 }
8320 `)
8321
8322 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8323 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8324 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"`)
8325}
8326
8327func TestApexKeysTxtOverrides(t *testing.T) {
8328 ctx := testApex(t, `
8329 apex {
8330 name: "myapex",
8331 key: "myapex.key",
8332 updatable: false,
8333 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008334 }
8335
8336 apex_key {
8337 name: "myapex.key",
8338 public_key: "testkey.avbpubkey",
8339 private_key: "testkey.pem",
8340 }
8341
8342 prebuilt_apex {
8343 name: "myapex",
8344 prefer: true,
8345 arch: {
8346 arm64: {
8347 src: "myapex-arm64.apex",
8348 },
8349 arm: {
8350 src: "myapex-arm.apex",
8351 },
8352 },
8353 }
8354
8355 apex_set {
8356 name: "myapex_set",
8357 set: "myapex.apks",
8358 filename: "myapex_set.apex",
8359 overrides: ["myapex"],
8360 }
8361 `)
8362
8363 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8364 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8365 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 +09008366 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 +09008367}
8368
Jooyung Han938b5932020-06-20 12:47:47 +09008369func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008370 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008371 apex {
8372 name: "myapex",
8373 key: "myapex.key",
8374 apps: ["app"],
8375 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008376 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008377 }
8378
8379 apex_key {
8380 name: "myapex.key",
8381 public_key: "testkey.avbpubkey",
8382 private_key: "testkey.pem",
8383 }
8384
8385 android_app {
8386 name: "app",
8387 srcs: ["foo/bar/MyClass.java"],
8388 package_name: "foo",
8389 sdk_version: "none",
8390 system_modules: "none",
8391 apex_available: [ "myapex" ],
8392 }
8393 `, withFiles(map[string][]byte{
8394 "sub/Android.bp": []byte(`
8395 override_apex {
8396 name: "override_myapex",
8397 base: "myapex",
8398 apps: ["override_app"],
8399 allowed_files: ":allowed",
8400 }
8401 // Overridable "path" property should be referenced indirectly
8402 filegroup {
8403 name: "allowed",
8404 srcs: ["allowed.txt"],
8405 }
8406 override_android_app {
8407 name: "override_app",
8408 base: "app",
8409 package_name: "bar",
8410 }
8411 `),
8412 }))
8413
8414 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8415 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8416 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8417 }
8418
8419 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8420 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8421 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8422 }
8423}
8424
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008425func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008426 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008427 apex {
8428 name: "myapex",
8429 key: "myapex.key",
8430 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008431 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008432 }
8433
8434 apex_key {
8435 name: "myapex.key",
8436 public_key: "testkey.avbpubkey",
8437 private_key: "testkey.pem",
8438 }
8439
8440 cc_library {
8441 name: "mylib",
8442 srcs: ["mylib.cpp"],
8443 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008444 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008445 },
8446 apex_available: ["myapex"],
8447 }
8448
8449 cc_prebuilt_library_shared {
8450 name: "mylib",
8451 prefer: false,
8452 srcs: ["prebuilt.so"],
8453 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008454 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008455 },
8456 apex_available: ["myapex"],
8457 }
8458 `)
8459}
8460
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008461func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008462 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008463 apex {
8464 name: "myapex",
8465 key: "myapex.key",
8466 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008467 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008468 }
8469 apex_key {
8470 name: "myapex.key",
8471 public_key: "testkey.avbpubkey",
8472 private_key: "testkey.pem",
8473 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008474 `,
8475 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8476 variables.CompressedApex = proptools.BoolPtr(true)
8477 }),
8478 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008479
8480 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8481 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8482
8483 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8484 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8485
8486 // Make sure output of bundle is .capex
8487 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8488 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8489
8490 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008491 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008492 var builder strings.Builder
8493 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8494 androidMk := builder.String()
8495 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8496}
8497
Martin Stjernholm2856c662020-12-02 15:03:42 +00008498func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008499 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008500 apex {
8501 name: "myapex",
8502 key: "myapex.key",
8503 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008504 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008505 }
8506
8507 apex_key {
8508 name: "myapex.key",
8509 public_key: "testkey.avbpubkey",
8510 private_key: "testkey.pem",
8511 }
8512
8513 cc_library {
8514 name: "mylib",
8515 srcs: ["mylib.cpp"],
8516 apex_available: ["myapex"],
8517 shared_libs: ["otherlib"],
8518 system_shared_libs: [],
8519 }
8520
8521 cc_library {
8522 name: "otherlib",
8523 srcs: ["mylib.cpp"],
8524 stubs: {
8525 versions: ["current"],
8526 },
8527 }
8528
8529 cc_prebuilt_library_shared {
8530 name: "otherlib",
8531 prefer: true,
8532 srcs: ["prebuilt.so"],
8533 stubs: {
8534 versions: ["current"],
8535 },
8536 }
8537 `)
8538
8539 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008540 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008541 var builder strings.Builder
8542 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8543 androidMk := builder.String()
8544
8545 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8546 // a thing there.
8547 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8548}
8549
Jiyong Parke3867542020-12-03 17:28:25 +09008550func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008551 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008552 apex {
8553 name: "myapex",
8554 key: "myapex.key",
8555 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008556 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008557 }
8558
8559 apex_key {
8560 name: "myapex.key",
8561 public_key: "testkey.avbpubkey",
8562 private_key: "testkey.pem",
8563 }
8564
8565 cc_library {
8566 name: "mylib",
8567 srcs: ["mylib.cpp"],
8568 system_shared_libs: [],
8569 stl: "none",
8570 apex_available: ["myapex"],
8571 shared_libs: ["mylib2"],
8572 target: {
8573 apex: {
8574 exclude_shared_libs: ["mylib2"],
8575 },
8576 },
8577 }
8578
8579 cc_library {
8580 name: "mylib2",
8581 srcs: ["mylib.cpp"],
8582 system_shared_libs: [],
8583 stl: "none",
8584 }
8585 `)
8586
8587 // Check if mylib is linked to mylib2 for the non-apex target
8588 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8589 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8590
8591 // Make sure that the link doesn't occur for the apex target
8592 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8593 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8594
8595 // It shouldn't appear in the copy cmd as well.
8596 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8597 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8598}
8599
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008600func TestPrebuiltStubLibDep(t *testing.T) {
8601 bpBase := `
8602 apex {
8603 name: "myapex",
8604 key: "myapex.key",
8605 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008606 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008607 }
8608 apex_key {
8609 name: "myapex.key",
8610 public_key: "testkey.avbpubkey",
8611 private_key: "testkey.pem",
8612 }
8613 cc_library {
8614 name: "mylib",
8615 srcs: ["mylib.cpp"],
8616 apex_available: ["myapex"],
8617 shared_libs: ["stublib"],
8618 system_shared_libs: [],
8619 }
8620 apex {
8621 name: "otherapex",
8622 enabled: %s,
8623 key: "myapex.key",
8624 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008625 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008626 }
8627 `
8628
8629 stublibSourceBp := `
8630 cc_library {
8631 name: "stublib",
8632 srcs: ["mylib.cpp"],
8633 apex_available: ["otherapex"],
8634 system_shared_libs: [],
8635 stl: "none",
8636 stubs: {
8637 versions: ["1"],
8638 },
8639 }
8640 `
8641
8642 stublibPrebuiltBp := `
8643 cc_prebuilt_library_shared {
8644 name: "stublib",
8645 srcs: ["prebuilt.so"],
8646 apex_available: ["otherapex"],
8647 stubs: {
8648 versions: ["1"],
8649 },
8650 %s
8651 }
8652 `
8653
8654 tests := []struct {
8655 name string
8656 stublibBp string
8657 usePrebuilt bool
8658 modNames []string // Modules to collect AndroidMkEntries for
8659 otherApexEnabled []string
8660 }{
8661 {
8662 name: "only_source",
8663 stublibBp: stublibSourceBp,
8664 usePrebuilt: false,
8665 modNames: []string{"stublib"},
8666 otherApexEnabled: []string{"true", "false"},
8667 },
8668 {
8669 name: "source_preferred",
8670 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8671 usePrebuilt: false,
8672 modNames: []string{"stublib", "prebuilt_stublib"},
8673 otherApexEnabled: []string{"true", "false"},
8674 },
8675 {
8676 name: "prebuilt_preferred",
8677 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8678 usePrebuilt: true,
8679 modNames: []string{"stublib", "prebuilt_stublib"},
8680 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8681 },
8682 {
8683 name: "only_prebuilt",
8684 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8685 usePrebuilt: true,
8686 modNames: []string{"stublib"},
8687 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8688 },
8689 }
8690
8691 for _, test := range tests {
8692 t.Run(test.name, func(t *testing.T) {
8693 for _, otherApexEnabled := range test.otherApexEnabled {
8694 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008695 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008696
8697 type modAndMkEntries struct {
8698 mod *cc.Module
8699 mkEntries android.AndroidMkEntries
8700 }
8701 entries := []*modAndMkEntries{}
8702
8703 // Gather shared lib modules that are installable
8704 for _, modName := range test.modNames {
8705 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8706 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8707 continue
8708 }
8709 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008710 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008711 continue
8712 }
Colin Crossaa255532020-07-03 13:18:24 -07008713 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008714 if ent.Disabled {
8715 continue
8716 }
8717 entries = append(entries, &modAndMkEntries{
8718 mod: mod,
8719 mkEntries: ent,
8720 })
8721 }
8722 }
8723 }
8724
8725 var entry *modAndMkEntries = nil
8726 for _, ent := range entries {
8727 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8728 if entry != nil {
8729 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8730 } else {
8731 entry = ent
8732 }
8733 }
8734 }
8735
8736 if entry == nil {
8737 t.Errorf("AndroidMk entry for \"stublib\" missing")
8738 } else {
8739 isPrebuilt := entry.mod.Prebuilt() != nil
8740 if isPrebuilt != test.usePrebuilt {
8741 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8742 }
8743 if !entry.mod.IsStubs() {
8744 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8745 }
8746 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8747 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8748 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008749 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008750 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008751 if !android.InList(expected, cflags) {
8752 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8753 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008754 }
8755 })
8756 }
8757 })
8758 }
8759}
8760
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008761func TestHostApexInHostOnlyBuild(t *testing.T) {
8762 testApex(t, `
8763 apex {
8764 name: "myapex",
8765 host_supported: true,
8766 key: "myapex.key",
8767 updatable: false,
8768 payload_type: "zip",
8769 }
8770 apex_key {
8771 name: "myapex.key",
8772 public_key: "testkey.avbpubkey",
8773 private_key: "testkey.pem",
8774 }
8775 `,
8776 android.FixtureModifyConfig(func(config android.Config) {
8777 // We may not have device targets in all builds, e.g. in
8778 // prebuilts/build-tools/build-prebuilts.sh
8779 config.Targets[android.Android] = []android.Target{}
8780 }))
8781}
8782
Colin Crossc33e5212021-05-25 18:16:02 -07008783func TestApexJavaCoverage(t *testing.T) {
8784 bp := `
8785 apex {
8786 name: "myapex",
8787 key: "myapex.key",
8788 java_libs: ["mylib"],
8789 bootclasspath_fragments: ["mybootclasspathfragment"],
8790 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8791 updatable: false,
8792 }
8793
8794 apex_key {
8795 name: "myapex.key",
8796 public_key: "testkey.avbpubkey",
8797 private_key: "testkey.pem",
8798 }
8799
8800 java_library {
8801 name: "mylib",
8802 srcs: ["mylib.java"],
8803 apex_available: ["myapex"],
8804 compile_dex: true,
8805 }
8806
8807 bootclasspath_fragment {
8808 name: "mybootclasspathfragment",
8809 contents: ["mybootclasspathlib"],
8810 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01008811 hidden_api: {
8812 split_packages: ["*"],
8813 },
Colin Crossc33e5212021-05-25 18:16:02 -07008814 }
8815
8816 java_library {
8817 name: "mybootclasspathlib",
8818 srcs: ["mybootclasspathlib.java"],
8819 apex_available: ["myapex"],
8820 compile_dex: true,
8821 }
8822
8823 systemserverclasspath_fragment {
8824 name: "mysystemserverclasspathfragment",
8825 contents: ["mysystemserverclasspathlib"],
8826 apex_available: ["myapex"],
8827 }
8828
8829 java_library {
8830 name: "mysystemserverclasspathlib",
8831 srcs: ["mysystemserverclasspathlib.java"],
8832 apex_available: ["myapex"],
8833 compile_dex: true,
8834 }
8835 `
8836
8837 result := android.GroupFixturePreparers(
8838 PrepareForTestWithApexBuildComponents,
8839 prepareForTestWithMyapex,
8840 java.PrepareForTestWithJavaDefaultModules,
8841 android.PrepareForTestWithAndroidBuildComponents,
8842 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008843 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8844 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008845 android.FixtureMergeEnv(map[string]string{
8846 "EMMA_INSTRUMENT": "true",
8847 }),
8848 ).RunTest(t)
8849
8850 // Make sure jacoco ran on both mylib and mybootclasspathlib
8851 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8852 t.Errorf("Failed to find jacoco rule for mylib")
8853 }
8854 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8855 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8856 }
8857 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8858 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8859 }
8860}
8861
Jiyong Park192600a2021-08-03 07:52:17 +00008862func TestProhibitStaticExecutable(t *testing.T) {
8863 testApexError(t, `executable mybin is static`, `
8864 apex {
8865 name: "myapex",
8866 key: "myapex.key",
8867 binaries: ["mybin"],
8868 min_sdk_version: "29",
8869 }
8870
8871 apex_key {
8872 name: "myapex.key",
8873 public_key: "testkey.avbpubkey",
8874 private_key: "testkey.pem",
8875 }
8876
8877 cc_binary {
8878 name: "mybin",
8879 srcs: ["mylib.cpp"],
8880 relative_install_path: "foo/bar",
8881 static_executable: true,
8882 system_shared_libs: [],
8883 stl: "none",
8884 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008885 min_sdk_version: "29",
8886 }
8887 `)
8888
8889 testApexError(t, `executable mybin.rust is static`, `
8890 apex {
8891 name: "myapex",
8892 key: "myapex.key",
8893 binaries: ["mybin.rust"],
8894 min_sdk_version: "29",
8895 }
8896
8897 apex_key {
8898 name: "myapex.key",
8899 public_key: "testkey.avbpubkey",
8900 private_key: "testkey.pem",
8901 }
8902
8903 rust_binary {
8904 name: "mybin.rust",
8905 srcs: ["foo.rs"],
8906 static_executable: true,
8907 apex_available: ["myapex"],
8908 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008909 }
8910 `)
8911}
8912
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008913func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8914 ctx := testApex(t, `
8915 apex {
8916 name: "myapex",
8917 key: "myapex.key",
8918 updatable: false,
8919 java_libs: ["foo"],
8920 }
8921
8922 apex_key {
8923 name: "myapex.key",
8924 public_key: "testkey.avbpubkey",
8925 private_key: "testkey.pem",
8926 }
8927
8928 java_library {
8929 name: "foo",
8930 srcs: ["foo.java"],
8931 apex_available: ["myapex"],
8932 installable: true,
8933 }
8934 `,
8935 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8936 )
8937
8938 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8939 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8940 var builder strings.Builder
8941 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8942 androidMk := builder.String()
8943 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")
8944}
8945
8946func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8947 ctx := testApex(t, `
8948 prebuilt_apex {
8949 name: "myapex",
8950 arch: {
8951 arm64: {
8952 src: "myapex-arm64.apex",
8953 },
8954 arm: {
8955 src: "myapex-arm.apex",
8956 },
8957 },
8958 exported_java_libs: ["foo"],
8959 }
8960
8961 java_import {
8962 name: "foo",
8963 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008964 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008965 }
8966 `,
8967 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8968 )
8969
8970 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8971 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8972 mainModuleEntries := entriesList[0]
8973 android.AssertArrayString(t,
8974 "LOCAL_REQUIRED_MODULES",
8975 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8976 []string{
8977 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8978 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8979 })
8980}
8981
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008982func TestAndroidMk_RequiredModules(t *testing.T) {
8983 ctx := testApex(t, `
8984 apex {
8985 name: "myapex",
8986 key: "myapex.key",
8987 updatable: false,
8988 java_libs: ["foo"],
8989 required: ["otherapex"],
8990 }
8991
8992 apex {
8993 name: "otherapex",
8994 key: "myapex.key",
8995 updatable: false,
8996 java_libs: ["foo"],
8997 required: ["otherapex"],
8998 }
8999
9000 apex_key {
9001 name: "myapex.key",
9002 public_key: "testkey.avbpubkey",
9003 private_key: "testkey.pem",
9004 }
9005
9006 java_library {
9007 name: "foo",
9008 srcs: ["foo.java"],
9009 apex_available: ["myapex", "otherapex"],
9010 installable: true,
9011 }
9012 `)
9013
9014 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9015 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9016 var builder strings.Builder
9017 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9018 androidMk := builder.String()
9019 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
9020}
9021
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009022func TestAndroidMk_RequiredDeps(t *testing.T) {
9023 ctx := testApex(t, `
9024 apex {
9025 name: "myapex",
9026 key: "myapex.key",
9027 updatable: false,
9028 }
9029
9030 apex_key {
9031 name: "myapex.key",
9032 public_key: "testkey.avbpubkey",
9033 private_key: "testkey.pem",
9034 }
9035 `)
9036
9037 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9038 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9039 data := android.AndroidMkDataForTest(t, ctx, bundle)
9040 var builder strings.Builder
9041 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9042 androidMk := builder.String()
9043 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
9044
9045 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9046 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9047 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9048 var flattenedBuilder strings.Builder
9049 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9050 flattenedAndroidMk := flattenedBuilder.String()
9051 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
9052}
9053
Jooyung Hana6d36672022-02-24 13:58:07 +09009054func TestApexOutputFileProducer(t *testing.T) {
9055 for _, tc := range []struct {
9056 name string
9057 ref string
9058 expected_data []string
9059 }{
9060 {
9061 name: "test_using_output",
9062 ref: ":myapex",
9063 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9064 },
9065 {
9066 name: "test_using_apex",
9067 ref: ":myapex{.apex}",
9068 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9069 },
9070 } {
9071 t.Run(tc.name, func(t *testing.T) {
9072 ctx := testApex(t, `
9073 apex {
9074 name: "myapex",
9075 key: "myapex.key",
9076 compressible: true,
9077 updatable: false,
9078 }
9079
9080 apex_key {
9081 name: "myapex.key",
9082 public_key: "testkey.avbpubkey",
9083 private_key: "testkey.pem",
9084 }
9085
9086 java_test {
9087 name: "`+tc.name+`",
9088 srcs: ["a.java"],
9089 data: ["`+tc.ref+`"],
9090 }
9091 `,
9092 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9093 variables.CompressedApex = proptools.BoolPtr(true)
9094 }))
9095 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9096 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9097 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9098 })
9099 }
9100}
9101
satayev758968a2021-12-06 11:42:40 +00009102func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9103 preparer := android.GroupFixturePreparers(
9104 PrepareForTestWithApexBuildComponents,
9105 prepareForTestWithMyapex,
9106 java.PrepareForTestWithJavaSdkLibraryFiles,
9107 java.PrepareForTestWithJavaDefaultModules,
9108 android.PrepareForTestWithAndroidBuildComponents,
9109 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9110 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9111 )
9112
9113 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9114 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9115 preparer.RunTestWithBp(t, `
9116 apex {
9117 name: "myapex",
9118 key: "myapex.key",
9119 bootclasspath_fragments: ["mybootclasspathfragment"],
9120 min_sdk_version: "30",
9121 updatable: false,
9122 }
9123
9124 apex_key {
9125 name: "myapex.key",
9126 public_key: "testkey.avbpubkey",
9127 private_key: "testkey.pem",
9128 }
9129
9130 bootclasspath_fragment {
9131 name: "mybootclasspathfragment",
9132 contents: ["mybootclasspathlib"],
9133 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009134 hidden_api: {
9135 split_packages: ["*"],
9136 },
satayev758968a2021-12-06 11:42:40 +00009137 }
9138
9139 java_sdk_library {
9140 name: "mybootclasspathlib",
9141 srcs: ["mybootclasspathlib.java"],
9142 apex_available: ["myapex"],
9143 compile_dex: true,
9144 unsafe_ignore_missing_latest_api: true,
9145 min_sdk_version: "31",
9146 static_libs: ["util"],
9147 }
9148
9149 java_library {
9150 name: "util",
9151 srcs: ["a.java"],
9152 apex_available: ["myapex"],
9153 min_sdk_version: "31",
9154 static_libs: ["another_util"],
9155 }
9156
9157 java_library {
9158 name: "another_util",
9159 srcs: ["a.java"],
9160 min_sdk_version: "31",
9161 apex_available: ["myapex"],
9162 }
9163 `)
9164 })
9165
9166 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9167 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9168 preparer.RunTestWithBp(t, `
9169 apex {
9170 name: "myapex",
9171 key: "myapex.key",
9172 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9173 min_sdk_version: "30",
9174 updatable: false,
9175 }
9176
9177 apex_key {
9178 name: "myapex.key",
9179 public_key: "testkey.avbpubkey",
9180 private_key: "testkey.pem",
9181 }
9182
9183 systemserverclasspath_fragment {
9184 name: "mysystemserverclasspathfragment",
9185 contents: ["mysystemserverclasspathlib"],
9186 apex_available: ["myapex"],
9187 }
9188
9189 java_sdk_library {
9190 name: "mysystemserverclasspathlib",
9191 srcs: ["mysystemserverclasspathlib.java"],
9192 apex_available: ["myapex"],
9193 compile_dex: true,
9194 min_sdk_version: "32",
9195 unsafe_ignore_missing_latest_api: true,
9196 static_libs: ["util"],
9197 }
9198
9199 java_library {
9200 name: "util",
9201 srcs: ["a.java"],
9202 apex_available: ["myapex"],
9203 min_sdk_version: "31",
9204 static_libs: ["another_util"],
9205 }
9206
9207 java_library {
9208 name: "another_util",
9209 srcs: ["a.java"],
9210 min_sdk_version: "31",
9211 apex_available: ["myapex"],
9212 }
9213 `)
9214 })
9215
9216 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9217 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9218 RunTestWithBp(t, `
9219 apex {
9220 name: "myapex",
9221 key: "myapex.key",
9222 bootclasspath_fragments: ["mybootclasspathfragment"],
9223 min_sdk_version: "30",
9224 updatable: false,
9225 }
9226
9227 apex_key {
9228 name: "myapex.key",
9229 public_key: "testkey.avbpubkey",
9230 private_key: "testkey.pem",
9231 }
9232
9233 bootclasspath_fragment {
9234 name: "mybootclasspathfragment",
9235 contents: ["mybootclasspathlib"],
9236 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009237 hidden_api: {
9238 split_packages: ["*"],
9239 },
satayev758968a2021-12-06 11:42:40 +00009240 }
9241
9242 java_sdk_library {
9243 name: "mybootclasspathlib",
9244 srcs: ["mybootclasspathlib.java"],
9245 apex_available: ["myapex"],
9246 compile_dex: true,
9247 unsafe_ignore_missing_latest_api: true,
9248 }
9249 `)
9250 })
9251
9252 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9253 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9254 RunTestWithBp(t, `
9255 apex {
9256 name: "myapex",
9257 key: "myapex.key",
9258 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9259 min_sdk_version: "30",
9260 updatable: false,
9261 }
9262
9263 apex_key {
9264 name: "myapex.key",
9265 public_key: "testkey.avbpubkey",
9266 private_key: "testkey.pem",
9267 }
9268
9269 systemserverclasspath_fragment {
9270 name: "mysystemserverclasspathfragment",
9271 contents: ["mysystemserverclasspathlib"],
9272 apex_available: ["myapex"],
9273 }
9274
9275 java_sdk_library {
9276 name: "mysystemserverclasspathlib",
9277 srcs: ["mysystemserverclasspathlib.java"],
9278 apex_available: ["myapex"],
9279 compile_dex: true,
9280 unsafe_ignore_missing_latest_api: true,
9281 }
9282 `)
9283 })
9284}
9285
Jiakai Zhang6decef92022-01-12 17:56:19 +00009286// Verifies that the APEX depends on all the Make modules in the list.
9287func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9288 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9289 for _, dep := range deps {
9290 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9291 }
9292}
9293
9294// Verifies that the APEX does not depend on any of the Make modules in the list.
9295func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9296 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9297 for _, dep := range deps {
9298 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9299 }
9300}
9301
Spandan Das66773252022-01-15 00:23:18 +00009302func TestApexStrictUpdtabilityLint(t *testing.T) {
9303 bpTemplate := `
9304 apex {
9305 name: "myapex",
9306 key: "myapex.key",
9307 java_libs: ["myjavalib"],
9308 updatable: %v,
9309 min_sdk_version: "29",
9310 }
9311 apex_key {
9312 name: "myapex.key",
9313 }
9314 java_library {
9315 name: "myjavalib",
9316 srcs: ["MyClass.java"],
9317 apex_available: [ "myapex" ],
9318 lint: {
9319 strict_updatability_linting: %v,
9320 },
9321 sdk_version: "current",
9322 min_sdk_version: "29",
9323 }
9324 `
9325 fs := android.MockFS{
9326 "lint-baseline.xml": nil,
9327 }
9328
9329 testCases := []struct {
9330 testCaseName string
9331 apexUpdatable bool
9332 javaStrictUpdtabilityLint bool
9333 lintFileExists bool
9334 disallowedFlagExpected bool
9335 }{
9336 {
9337 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9338 apexUpdatable: true,
9339 javaStrictUpdtabilityLint: true,
9340 lintFileExists: false,
9341 disallowedFlagExpected: false,
9342 },
9343 {
9344 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9345 apexUpdatable: false,
9346 javaStrictUpdtabilityLint: false,
9347 lintFileExists: true,
9348 disallowedFlagExpected: false,
9349 },
9350 {
9351 testCaseName: "non-updatable apex respects strict updatability of javalib",
9352 apexUpdatable: false,
9353 javaStrictUpdtabilityLint: true,
9354 lintFileExists: true,
9355 disallowedFlagExpected: true,
9356 },
9357 {
9358 testCaseName: "updatable apex sets strict updatability of javalib to true",
9359 apexUpdatable: true,
9360 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9361 lintFileExists: true,
9362 disallowedFlagExpected: true,
9363 },
9364 }
9365
9366 for _, testCase := range testCases {
9367 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9368 fixtures := []android.FixturePreparer{}
9369 if testCase.lintFileExists {
9370 fixtures = append(fixtures, fs.AddToFixture())
9371 }
9372
9373 result := testApex(t, bp, fixtures...)
9374 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9375 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9376 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9377
9378 if disallowedFlagActual != testCase.disallowedFlagExpected {
9379 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9380 }
9381 }
9382}
9383
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009384func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9385 bp := `
9386 apex {
9387 name: "myapex",
9388 key: "myapex.key",
9389 java_libs: ["myjavalib"],
9390 updatable: true,
9391 min_sdk_version: "29",
9392 }
9393 apex_key {
9394 name: "myapex.key",
9395 }
9396 java_library {
9397 name: "myjavalib",
9398 srcs: ["MyClass.java"],
9399 apex_available: [ "myapex" ],
9400 sdk_version: "current",
9401 min_sdk_version: "29",
9402 }
9403 `
9404
9405 testCases := []struct {
9406 testCaseName string
9407 moduleDirectory string
9408 disallowedFlagExpected bool
9409 }{
9410 {
9411 testCaseName: "lintable module defined outside libcore",
9412 moduleDirectory: "",
9413 disallowedFlagExpected: true,
9414 },
9415 {
9416 testCaseName: "lintable module defined in libcore root directory",
9417 moduleDirectory: "libcore/",
9418 disallowedFlagExpected: false,
9419 },
9420 {
9421 testCaseName: "lintable module defined in libcore child directory",
9422 moduleDirectory: "libcore/childdir/",
9423 disallowedFlagExpected: true,
9424 },
9425 }
9426
9427 for _, testCase := range testCases {
9428 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9429 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9430 result := testApex(t, "", lintFileCreator, bpFileCreator)
9431 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9432 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9433 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9434 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9435
9436 if disallowedFlagActual != testCase.disallowedFlagExpected {
9437 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9438 }
9439 }
9440}
9441
Spandan Das66773252022-01-15 00:23:18 +00009442// checks transtive deps of an apex coming from bootclasspath_fragment
9443func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9444 bp := `
9445 apex {
9446 name: "myapex",
9447 key: "myapex.key",
9448 bootclasspath_fragments: ["mybootclasspathfragment"],
9449 updatable: true,
9450 min_sdk_version: "29",
9451 }
9452 apex_key {
9453 name: "myapex.key",
9454 }
9455 bootclasspath_fragment {
9456 name: "mybootclasspathfragment",
9457 contents: ["myjavalib"],
9458 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009459 hidden_api: {
9460 split_packages: ["*"],
9461 },
Spandan Das66773252022-01-15 00:23:18 +00009462 }
9463 java_library {
9464 name: "myjavalib",
9465 srcs: ["MyClass.java"],
9466 apex_available: [ "myapex" ],
9467 sdk_version: "current",
9468 min_sdk_version: "29",
9469 compile_dex: true,
9470 }
9471 `
9472 fs := android.MockFS{
9473 "lint-baseline.xml": nil,
9474 }
9475
9476 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9477 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9478 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9479 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9480 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9481 }
9482}
9483
Spandan Das42e89502022-05-06 22:12:55 +00009484// updatable apexes should propagate updatable=true to its apps
9485func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9486 bp := `
9487 apex {
9488 name: "myapex",
9489 key: "myapex.key",
9490 updatable: %v,
9491 apps: [
9492 "myapp",
9493 ],
9494 min_sdk_version: "30",
9495 }
9496 apex_key {
9497 name: "myapex.key",
9498 }
9499 android_app {
9500 name: "myapp",
9501 updatable: %v,
9502 apex_available: [
9503 "myapex",
9504 ],
9505 sdk_version: "current",
9506 min_sdk_version: "30",
9507 }
9508 `
9509 testCases := []struct {
9510 name string
9511 apex_is_updatable_bp bool
9512 app_is_updatable_bp bool
9513 app_is_updatable_expected bool
9514 }{
9515 {
9516 name: "Non-updatable apex respects updatable property of non-updatable app",
9517 apex_is_updatable_bp: false,
9518 app_is_updatable_bp: false,
9519 app_is_updatable_expected: false,
9520 },
9521 {
9522 name: "Non-updatable apex respects updatable property of updatable app",
9523 apex_is_updatable_bp: false,
9524 app_is_updatable_bp: true,
9525 app_is_updatable_expected: true,
9526 },
9527 {
9528 name: "Updatable apex respects updatable property of updatable app",
9529 apex_is_updatable_bp: true,
9530 app_is_updatable_bp: true,
9531 app_is_updatable_expected: true,
9532 },
9533 {
9534 name: "Updatable apex sets updatable=true on non-updatable app",
9535 apex_is_updatable_bp: true,
9536 app_is_updatable_bp: false,
9537 app_is_updatable_expected: true,
9538 },
9539 }
9540 for _, testCase := range testCases {
9541 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9542 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9543 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9544 }
9545}
9546
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009547func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009548 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009549}