blob: 10adf8dc8c0220595c00d100a1e527585e99a1ef [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"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "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 Park9918e1a2020-03-17 19:16:40 +0900446 static_libs: ["libstatic"],
447 // TODO: remove //apex_available:platform
448 apex_available: [
449 "//apex_available:platform",
450 "myapex",
451 ],
452 }
453
Paul Duffindddd5462020-04-07 15:25:44 +0100454 cc_prebuilt_library_shared {
455 name: "mylib2",
456 srcs: ["prebuilt.so"],
457 // TODO: remove //apex_available:platform
458 apex_available: [
459 "//apex_available:platform",
460 "myapex",
461 ],
462 }
463
Jiyong Park9918e1a2020-03-17 19:16:40 +0900464 cc_library_static {
465 name: "libstatic",
466 srcs: ["mylib.cpp"],
467 system_shared_libs: [],
468 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000469 // TODO: remove //apex_available:platform
470 apex_available: [
471 "//apex_available:platform",
472 "myapex",
473 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900474 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900475
476 java_library {
477 name: "myjar",
478 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900479 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900480 sdk_version: "none",
481 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900482 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900483 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000484 // TODO: remove //apex_available:platform
485 apex_available: [
486 "//apex_available:platform",
487 "myapex",
488 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 }
490
Jiyong Park77acec62020-06-01 21:39:15 +0900491 dex_import {
492 name: "myjar_dex",
493 jars: ["prebuilt.jar"],
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
498 }
499
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 java_library {
501 name: "myotherjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900505 // TODO: remove //apex_available:platform
506 apex_available: [
507 "//apex_available:platform",
508 "myapex",
509 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900511
512 java_library {
513 name: "mysharedjar",
514 srcs: ["foo/bar/MyClass.java"],
515 sdk_version: "none",
516 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900517 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900518 `)
519
Paul Duffina71a67a2021-03-29 00:42:57 +0100520 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900521
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900522 // Make sure that Android.mk is created
523 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700524 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 var builder strings.Builder
526 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
527
528 androidMk := builder.String()
529 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
530 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
531
Jiyong Park42cca6c2019-04-01 11:15:50 +0900532 optFlags := apexRule.Args["opt_flags"]
533 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700534 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100535 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536
Jiyong Park25fc6a92018-11-18 18:02:45 +0900537 copyCmds := apexRule.Args["copy_commands"]
538
539 // Ensure that main rule creates an output
540 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
541
542 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700543 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
544 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900548
549 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
551 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900552 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900556
557 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800558 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
559 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900560 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900562 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
564 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900566 // .. but not for java libs
567 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900568 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800569
Colin Cross7113d202019-11-20 16:39:12 -0800570 // Ensure that the platform variant ends with _shared or _common
571 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900573 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
574 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
576
577 // Ensure that dynamic dependency to java libs are not included
578 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800579
580 // Ensure that all symlinks are present.
581 found_foo_link_64 := false
582 found_foo := false
583 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900584 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800585 if strings.HasSuffix(cmd, "bin/foo") {
586 found_foo = true
587 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
588 found_foo_link_64 = true
589 }
590 }
591 }
592 good := found_foo && found_foo_link_64
593 if !good {
594 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
595 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900596
Artur Satayeva8bd1132020-04-27 18:07:06 +0100597 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
600 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
601 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100602
603 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
606 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800608}
609
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800611 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612 apex_defaults {
613 name: "myapex-defaults",
614 key: "myapex.key",
615 prebuilts: ["myetc"],
616 native_shared_libs: ["mylib"],
617 java_libs: ["myjar"],
618 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900619 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800620 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000621 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900622 }
623
624 prebuilt_etc {
625 name: "myetc",
626 src: "myprebuilt",
627 }
628
629 apex {
630 name: "myapex",
631 defaults: ["myapex-defaults"],
632 }
633
634 apex_key {
635 name: "myapex.key",
636 public_key: "testkey.avbpubkey",
637 private_key: "testkey.pem",
638 }
639
640 cc_library {
641 name: "mylib",
642 system_shared_libs: [],
643 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000644 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900645 }
646
647 java_library {
648 name: "myjar",
649 srcs: ["foo/bar/MyClass.java"],
650 sdk_version: "none",
651 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000652 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900653 }
654
655 android_app {
656 name: "AppFoo",
657 srcs: ["foo/bar/MyClass.java"],
658 sdk_version: "none",
659 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000660 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900662
663 runtime_resource_overlay {
664 name: "rro",
665 theme: "blue",
666 }
667
markchien2f59ec92020-09-02 16:23:38 +0800668 bpf {
669 name: "bpf",
670 srcs: ["bpf.c", "bpf2.c"],
671 }
672
Ken Chenfad7f9d2021-11-10 22:02:57 +0800673 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800674 name: "netdTest",
675 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 sub_dir: "netd",
677 }
678
Jooyung Hanf21c7972019-12-16 22:32:06 +0900679 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000680 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900681 "etc/myetc",
682 "javalib/myjar.jar",
683 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000684 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900685 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800686 "etc/bpf/bpf.o",
687 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800688 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900689 })
690}
691
Jooyung Han01a3ee22019-11-02 02:52:25 +0900692func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800693 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 apex {
695 name: "myapex",
696 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000697 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 }
699
700 apex_key {
701 name: "myapex.key",
702 public_key: "testkey.avbpubkey",
703 private_key: "testkey.pem",
704 }
705 `)
706
707 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900708 args := module.Rule("apexRule").Args
709 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
710 t.Error("manifest should be apex_manifest.pb, but " + manifest)
711 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900712}
713
Liz Kammer4854a7d2021-05-27 14:28:27 -0400714func TestApexManifestMinSdkVersion(t *testing.T) {
715 ctx := testApex(t, `
716 apex_defaults {
717 name: "my_defaults",
718 key: "myapex.key",
719 product_specific: true,
720 file_contexts: ":my-file-contexts",
721 updatable: false,
722 }
723 apex {
724 name: "myapex_30",
725 min_sdk_version: "30",
726 defaults: ["my_defaults"],
727 }
728
729 apex {
730 name: "myapex_current",
731 min_sdk_version: "current",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_none",
737 defaults: ["my_defaults"],
738 }
739
740 apex_key {
741 name: "myapex.key",
742 public_key: "testkey.avbpubkey",
743 private_key: "testkey.pem",
744 }
745
746 filegroup {
747 name: "my-file-contexts",
748 srcs: ["product_specific_file_contexts"],
749 }
750 `, withFiles(map[string][]byte{
751 "product_specific_file_contexts": nil,
752 }), android.FixtureModifyProductVariables(
753 func(variables android.FixtureProductVariables) {
754 variables.Unbundled_build = proptools.BoolPtr(true)
755 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
756 }), android.FixtureMergeEnv(map[string]string{
757 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
758 }))
759
760 testCases := []struct {
761 module string
762 minSdkVersion string
763 }{
764 {
765 module: "myapex_30",
766 minSdkVersion: "30",
767 },
768 {
769 module: "myapex_current",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 {
773 module: "myapex_none",
774 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
775 },
776 }
777 for _, tc := range testCases {
778 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
779 args := module.Rule("apexRule").Args
780 optFlags := args["opt_flags"]
781 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
782 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
783 }
784 }
785}
786
Alex Light5098a612018-11-29 17:12:15 -0800787func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800788 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800789 apex {
790 name: "myapex",
791 key: "myapex.key",
792 payload_type: "zip",
793 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000794 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800795 }
796
797 apex_key {
798 name: "myapex.key",
799 public_key: "testkey.avbpubkey",
800 private_key: "testkey.pem",
801 }
802
803 cc_library {
804 name: "mylib",
805 srcs: ["mylib.cpp"],
806 shared_libs: ["mylib2"],
807 system_shared_libs: [],
808 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000809 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800810 }
811
812 cc_library {
813 name: "mylib2",
814 srcs: ["mylib.cpp"],
815 system_shared_libs: [],
816 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000817 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800818 }
819 `)
820
Sundong Ahnabb64432019-10-22 13:58:29 +0900821 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800822 copyCmds := zipApexRule.Args["copy_commands"]
823
824 // Ensure that main rule creates an output
825 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
826
827 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700828 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800829
830 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700831 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800832
833 // Ensure that both direct and indirect deps are copied into apex
834 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
835 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900836}
837
838func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800839 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900840 apex {
841 name: "myapex",
842 key: "myapex.key",
843 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900844 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000845 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900846 }
847
848 apex_key {
849 name: "myapex.key",
850 public_key: "testkey.avbpubkey",
851 private_key: "testkey.pem",
852 }
853
854 cc_library {
855 name: "mylib",
856 srcs: ["mylib.cpp"],
857 shared_libs: ["mylib2", "mylib3"],
858 system_shared_libs: [],
859 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000860 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900861 }
862
863 cc_library {
864 name: "mylib2",
865 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900866 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 system_shared_libs: [],
868 stl: "none",
869 stubs: {
870 versions: ["1", "2", "3"],
871 },
872 }
873
874 cc_library {
875 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900876 srcs: ["mylib.cpp"],
877 shared_libs: ["mylib4"],
878 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900879 stl: "none",
880 stubs: {
881 versions: ["10", "11", "12"],
882 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000883 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900884 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900885
886 cc_library {
887 name: "mylib4",
888 srcs: ["mylib.cpp"],
889 system_shared_libs: [],
890 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000891 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900892 }
Jiyong Park105dc322021-06-11 17:22:09 +0900893
894 rust_binary {
895 name: "foo.rust",
896 srcs: ["foo.rs"],
897 shared_libs: ["libfoo.shared_from_rust"],
898 prefer_rlib: true,
899 apex_available: ["myapex"],
900 }
901
902 cc_library_shared {
903 name: "libfoo.shared_from_rust",
904 srcs: ["mylib.cpp"],
905 system_shared_libs: [],
906 stl: "none",
907 stubs: {
908 versions: ["10", "11", "12"],
909 },
910 }
911
Jiyong Park25fc6a92018-11-18 18:02:45 +0900912 `)
913
Sundong Ahnabb64432019-10-22 13:58:29 +0900914 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 copyCmds := apexRule.Args["copy_commands"]
916
917 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800918 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919
920 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800921 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922
923 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800924 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900925
Colin Crossaede88c2020-08-11 12:17:01 -0700926 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927
928 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900929 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900930 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900931 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932
933 // 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 -0700934 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700936 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900937
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700938 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
939 // is replaced by sharing of "cFlags" in cc/builder.go.
940 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
941 // module variable representing "cflags". So it was not detected by ensureNotContains.
942 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
943 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
944 // including the original cflags's "-include mylib.h".
945 //
Jiyong Park64379952018-12-13 18:37:29 +0900946 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700947 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
948 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900949
Jiyong Park85cc35a2022-07-17 11:30:47 +0900950 // Ensure that genstub for platform-provided lib is invoked with --systemapi
951 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
952 // Ensure that genstub for apex-provided lib is invoked with --apex
953 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
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
Jiyong Park85cc35a2022-07-17 11:30:47 +09001137 // Ensure that genstub is invoked with --systemapi
1138 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
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
Colin Cross8ca61c12022-10-06 21:00:14 -07002193func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2194 // Tests that an apex dependency with min_sdk_version higher than the
2195 // min_sdk_version of the apex is allowed as long as the dependency's
2196 // min_sdk_version is less than or equal to the api level that the
2197 // architecture was introduced in. In this case, arm64 didn't exist
2198 // until api level 21, so the arm64 code will never need to run on
2199 // an api level 20 device, even if other architectures of the apex
2200 // will.
2201 testApex(t, `
2202 apex {
2203 name: "myapex",
2204 key: "myapex.key",
2205 native_shared_libs: ["libfoo"],
2206 min_sdk_version: "20",
2207 }
2208
2209 apex_key {
2210 name: "myapex.key",
2211 public_key: "testkey.avbpubkey",
2212 private_key: "testkey.pem",
2213 }
2214
2215 cc_library {
2216 name: "libfoo",
2217 srcs: ["mylib.cpp"],
2218 apex_available: ["myapex"],
2219 min_sdk_version: "21",
2220 stl: "none",
2221 }
2222 `)
2223}
2224
Artur Satayev8cf899a2020-04-15 17:29:42 +01002225func TestJavaStableSdkVersion(t *testing.T) {
2226 testCases := []struct {
2227 name string
2228 expectedError string
2229 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002230 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002231 }{
2232 {
2233 name: "Non-updatable apex with non-stable dep",
2234 bp: `
2235 apex {
2236 name: "myapex",
2237 java_libs: ["myjar"],
2238 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002239 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002240 }
2241 apex_key {
2242 name: "myapex.key",
2243 public_key: "testkey.avbpubkey",
2244 private_key: "testkey.pem",
2245 }
2246 java_library {
2247 name: "myjar",
2248 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002249 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002250 apex_available: ["myapex"],
2251 }
2252 `,
2253 },
2254 {
2255 name: "Updatable apex with stable dep",
2256 bp: `
2257 apex {
2258 name: "myapex",
2259 java_libs: ["myjar"],
2260 key: "myapex.key",
2261 updatable: true,
2262 min_sdk_version: "29",
2263 }
2264 apex_key {
2265 name: "myapex.key",
2266 public_key: "testkey.avbpubkey",
2267 private_key: "testkey.pem",
2268 }
2269 java_library {
2270 name: "myjar",
2271 srcs: ["foo/bar/MyClass.java"],
2272 sdk_version: "current",
2273 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002274 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002275 }
2276 `,
2277 },
2278 {
2279 name: "Updatable apex with non-stable dep",
2280 expectedError: "cannot depend on \"myjar\"",
2281 bp: `
2282 apex {
2283 name: "myapex",
2284 java_libs: ["myjar"],
2285 key: "myapex.key",
2286 updatable: true,
2287 }
2288 apex_key {
2289 name: "myapex.key",
2290 public_key: "testkey.avbpubkey",
2291 private_key: "testkey.pem",
2292 }
2293 java_library {
2294 name: "myjar",
2295 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002296 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002297 apex_available: ["myapex"],
2298 }
2299 `,
2300 },
2301 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002302 name: "Updatable apex with non-stable legacy core platform dep",
2303 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2304 bp: `
2305 apex {
2306 name: "myapex",
2307 java_libs: ["myjar-uses-legacy"],
2308 key: "myapex.key",
2309 updatable: true,
2310 }
2311 apex_key {
2312 name: "myapex.key",
2313 public_key: "testkey.avbpubkey",
2314 private_key: "testkey.pem",
2315 }
2316 java_library {
2317 name: "myjar-uses-legacy",
2318 srcs: ["foo/bar/MyClass.java"],
2319 sdk_version: "core_platform",
2320 apex_available: ["myapex"],
2321 }
2322 `,
2323 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2324 },
2325 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002326 name: "Updatable apex with non-stable transitive dep",
2327 // This is not actually detecting that the transitive dependency is unstable, rather it is
2328 // detecting that the transitive dependency is building against a wider API surface than the
2329 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002330 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002331 bp: `
2332 apex {
2333 name: "myapex",
2334 java_libs: ["myjar"],
2335 key: "myapex.key",
2336 updatable: true,
2337 }
2338 apex_key {
2339 name: "myapex.key",
2340 public_key: "testkey.avbpubkey",
2341 private_key: "testkey.pem",
2342 }
2343 java_library {
2344 name: "myjar",
2345 srcs: ["foo/bar/MyClass.java"],
2346 sdk_version: "current",
2347 apex_available: ["myapex"],
2348 static_libs: ["transitive-jar"],
2349 }
2350 java_library {
2351 name: "transitive-jar",
2352 srcs: ["foo/bar/MyClass.java"],
2353 sdk_version: "core_platform",
2354 apex_available: ["myapex"],
2355 }
2356 `,
2357 },
2358 }
2359
2360 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002361 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2362 continue
2363 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002364 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002365 errorHandler := android.FixtureExpectsNoErrors
2366 if test.expectedError != "" {
2367 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002368 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002369 android.GroupFixturePreparers(
2370 java.PrepareForTestWithJavaDefaultModules,
2371 PrepareForTestWithApexBuildComponents,
2372 prepareForTestWithMyapex,
2373 android.OptionalFixturePreparer(test.preparer),
2374 ).
2375 ExtendWithErrorHandler(errorHandler).
2376 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002377 })
2378 }
2379}
2380
Jooyung Han749dc692020-04-15 11:03:39 +09002381func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2382 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2383 apex {
2384 name: "myapex",
2385 key: "myapex.key",
2386 native_shared_libs: ["mylib"],
2387 min_sdk_version: "29",
2388 }
2389
2390 apex_key {
2391 name: "myapex.key",
2392 public_key: "testkey.avbpubkey",
2393 private_key: "testkey.pem",
2394 }
2395
2396 cc_library {
2397 name: "mylib",
2398 srcs: ["mylib.cpp"],
2399 shared_libs: ["mylib2"],
2400 system_shared_libs: [],
2401 stl: "none",
2402 apex_available: [
2403 "myapex",
2404 ],
2405 min_sdk_version: "29",
2406 }
2407
2408 // indirect part of the apex
2409 cc_library {
2410 name: "mylib2",
2411 srcs: ["mylib.cpp"],
2412 system_shared_libs: [],
2413 stl: "none",
2414 apex_available: [
2415 "myapex",
2416 ],
2417 min_sdk_version: "30",
2418 }
2419 `)
2420}
2421
2422func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2423 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2424 apex {
2425 name: "myapex",
2426 key: "myapex.key",
2427 apps: ["AppFoo"],
2428 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002429 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002430 }
2431
2432 apex_key {
2433 name: "myapex.key",
2434 public_key: "testkey.avbpubkey",
2435 private_key: "testkey.pem",
2436 }
2437
2438 android_app {
2439 name: "AppFoo",
2440 srcs: ["foo/bar/MyClass.java"],
2441 sdk_version: "current",
2442 min_sdk_version: "29",
2443 system_modules: "none",
2444 stl: "none",
2445 static_libs: ["bar"],
2446 apex_available: [ "myapex" ],
2447 }
2448
2449 java_library {
2450 name: "bar",
2451 sdk_version: "current",
2452 srcs: ["a.java"],
2453 apex_available: [ "myapex" ],
2454 }
2455 `)
2456}
2457
2458func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002459 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002460 apex {
2461 name: "myapex",
2462 key: "myapex.key",
2463 native_shared_libs: ["mylib"],
2464 min_sdk_version: "29",
2465 }
2466
2467 apex_key {
2468 name: "myapex.key",
2469 public_key: "testkey.avbpubkey",
2470 private_key: "testkey.pem",
2471 }
2472
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002473 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002474 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2475 cc_library {
2476 name: "mylib",
2477 srcs: ["mylib.cpp"],
2478 shared_libs: ["mylib2"],
2479 system_shared_libs: [],
2480 stl: "none",
2481 apex_available: ["myapex", "otherapex"],
2482 min_sdk_version: "29",
2483 }
2484
2485 cc_library {
2486 name: "mylib2",
2487 srcs: ["mylib.cpp"],
2488 system_shared_libs: [],
2489 stl: "none",
2490 apex_available: ["otherapex"],
2491 stubs: { versions: ["29", "30"] },
2492 min_sdk_version: "30",
2493 }
2494
2495 apex {
2496 name: "otherapex",
2497 key: "myapex.key",
2498 native_shared_libs: ["mylib", "mylib2"],
2499 min_sdk_version: "30",
2500 }
2501 `)
2502 expectLink := func(from, from_variant, to, to_variant string) {
2503 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2504 libFlags := ld.Args["libFlags"]
2505 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2506 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002507 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002508 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002509}
2510
Jooyung Haned124c32021-01-26 11:43:46 +09002511func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002512 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2513 func(variables android.FixtureProductVariables) {
2514 variables.Platform_sdk_codename = proptools.StringPtr("S")
2515 variables.Platform_version_active_codenames = []string{"S"}
2516 },
2517 )
Jooyung Haned124c32021-01-26 11:43:46 +09002518 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2519 apex {
2520 name: "myapex",
2521 key: "myapex.key",
2522 native_shared_libs: ["libfoo"],
2523 min_sdk_version: "S",
2524 }
2525 apex_key {
2526 name: "myapex.key",
2527 public_key: "testkey.avbpubkey",
2528 private_key: "testkey.pem",
2529 }
2530 cc_library {
2531 name: "libfoo",
2532 shared_libs: ["libbar"],
2533 apex_available: ["myapex"],
2534 min_sdk_version: "29",
2535 }
2536 cc_library {
2537 name: "libbar",
2538 apex_available: ["myapex"],
2539 }
2540 `, withSAsActiveCodeNames)
2541}
2542
2543func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002544 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2545 variables.Platform_sdk_codename = proptools.StringPtr("S")
2546 variables.Platform_version_active_codenames = []string{"S", "T"}
2547 })
Colin Cross1c460562021-02-16 17:55:47 -08002548 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002549 apex {
2550 name: "myapex",
2551 key: "myapex.key",
2552 native_shared_libs: ["libfoo"],
2553 min_sdk_version: "S",
2554 }
2555 apex_key {
2556 name: "myapex.key",
2557 public_key: "testkey.avbpubkey",
2558 private_key: "testkey.pem",
2559 }
2560 cc_library {
2561 name: "libfoo",
2562 shared_libs: ["libbar"],
2563 apex_available: ["myapex"],
2564 min_sdk_version: "S",
2565 }
2566 cc_library {
2567 name: "libbar",
2568 stubs: {
2569 symbol_file: "libbar.map.txt",
2570 versions: ["30", "S", "T"],
2571 },
2572 }
2573 `, withSAsActiveCodeNames)
2574
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002575 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002576 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2577 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002578 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002579}
2580
Jiyong Park7c2ee712018-12-07 00:42:25 +09002581func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002582 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002583 apex {
2584 name: "myapex",
2585 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002586 native_shared_libs: ["mylib"],
2587 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002588 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002589 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002590 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002591 }
2592
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598
2599 prebuilt_etc {
2600 name: "myetc",
2601 src: "myprebuilt",
2602 sub_dir: "foo/bar",
2603 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002604
2605 cc_library {
2606 name: "mylib",
2607 srcs: ["mylib.cpp"],
2608 relative_install_path: "foo/bar",
2609 system_shared_libs: [],
2610 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002611 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002612 }
2613
2614 cc_binary {
2615 name: "mybin",
2616 srcs: ["mylib.cpp"],
2617 relative_install_path: "foo/bar",
2618 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002619 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002620 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002621 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002622 `)
2623
Sundong Ahnabb64432019-10-22 13:58:29 +09002624 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002625 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002626
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002627 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002628 ensureContains(t, cmd, "/etc ")
2629 ensureContains(t, cmd, "/etc/foo ")
2630 ensureContains(t, cmd, "/etc/foo/bar ")
2631 ensureContains(t, cmd, "/lib64 ")
2632 ensureContains(t, cmd, "/lib64/foo ")
2633 ensureContains(t, cmd, "/lib64/foo/bar ")
2634 ensureContains(t, cmd, "/lib ")
2635 ensureContains(t, cmd, "/lib/foo ")
2636 ensureContains(t, cmd, "/lib/foo/bar ")
2637 ensureContains(t, cmd, "/bin ")
2638 ensureContains(t, cmd, "/bin/foo ")
2639 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002640}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002641
Jooyung Han35155c42020-02-06 17:33:20 +09002642func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002643 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002644 apex {
2645 name: "myapex",
2646 key: "myapex.key",
2647 multilib: {
2648 both: {
2649 native_shared_libs: ["mylib"],
2650 binaries: ["mybin"],
2651 },
2652 },
2653 compile_multilib: "both",
2654 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002655 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002656 }
2657
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663
2664 cc_library {
2665 name: "mylib",
2666 relative_install_path: "foo/bar",
2667 system_shared_libs: [],
2668 stl: "none",
2669 apex_available: [ "myapex" ],
2670 native_bridge_supported: true,
2671 }
2672
2673 cc_binary {
2674 name: "mybin",
2675 relative_install_path: "foo/bar",
2676 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002677 stl: "none",
2678 apex_available: [ "myapex" ],
2679 native_bridge_supported: true,
2680 compile_multilib: "both", // default is "first" for binary
2681 multilib: {
2682 lib64: {
2683 suffix: "64",
2684 },
2685 },
2686 }
2687 `, withNativeBridgeEnabled)
2688 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2689 "bin/foo/bar/mybin",
2690 "bin/foo/bar/mybin64",
2691 "bin/arm/foo/bar/mybin",
2692 "bin/arm64/foo/bar/mybin64",
2693 "lib/foo/bar/mylib.so",
2694 "lib/arm/foo/bar/mylib.so",
2695 "lib64/foo/bar/mylib.so",
2696 "lib64/arm64/foo/bar/mylib.so",
2697 })
2698}
2699
Jooyung Han85d61762020-06-24 23:50:26 +09002700func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002701 result := android.GroupFixturePreparers(
2702 prepareForApexTest,
2703 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2704 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002705 apex {
2706 name: "myapex",
2707 key: "myapex.key",
2708 binaries: ["mybin"],
2709 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002710 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002711 }
2712 apex_key {
2713 name: "myapex.key",
2714 public_key: "testkey.avbpubkey",
2715 private_key: "testkey.pem",
2716 }
2717 cc_binary {
2718 name: "mybin",
2719 vendor: true,
2720 shared_libs: ["libfoo"],
2721 }
2722 cc_library {
2723 name: "libfoo",
2724 proprietary: true,
2725 }
2726 `)
2727
Colin Crossc68db4b2021-11-11 18:59:15 -08002728 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002729 "bin/mybin",
2730 "lib64/libfoo.so",
2731 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2732 "lib64/libc++.so",
2733 })
2734
Colin Crossc68db4b2021-11-11 18:59:15 -08002735 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2736 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002737 name := apexBundle.BaseModuleName()
2738 prefix := "TARGET_"
2739 var builder strings.Builder
2740 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002741 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002742 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002743 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002744
Colin Crossc68db4b2021-11-11 18:59:15 -08002745 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002746 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2747 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002748}
2749
Jooyung Hanc5a96762022-02-04 11:54:50 +09002750func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2751 testApexError(t, `Trying to include a VNDK library`, `
2752 apex {
2753 name: "myapex",
2754 key: "myapex.key",
2755 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2756 vendor: true,
2757 use_vndk_as_stable: true,
2758 updatable: false,
2759 }
2760 apex_key {
2761 name: "myapex.key",
2762 public_key: "testkey.avbpubkey",
2763 private_key: "testkey.pem",
2764 }`)
2765}
2766
Jooyung Handf78e212020-07-22 15:54:47 +09002767func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002768 // myapex myapex2
2769 // | |
2770 // mybin ------. mybin2
2771 // \ \ / |
2772 // (stable) .---\--------` |
2773 // \ / \ |
2774 // \ / \ /
2775 // libvndk libvendor
2776 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002777 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002778 apex {
2779 name: "myapex",
2780 key: "myapex.key",
2781 binaries: ["mybin"],
2782 vendor: true,
2783 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002784 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002785 }
2786 apex_key {
2787 name: "myapex.key",
2788 public_key: "testkey.avbpubkey",
2789 private_key: "testkey.pem",
2790 }
2791 cc_binary {
2792 name: "mybin",
2793 vendor: true,
2794 shared_libs: ["libvndk", "libvendor"],
2795 }
2796 cc_library {
2797 name: "libvndk",
2798 vndk: {
2799 enabled: true,
2800 },
2801 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002802 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002803 }
2804 cc_library {
2805 name: "libvendor",
2806 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002807 stl: "none",
2808 }
2809 apex {
2810 name: "myapex2",
2811 key: "myapex.key",
2812 binaries: ["mybin2"],
2813 vendor: true,
2814 use_vndk_as_stable: false,
2815 updatable: false,
2816 }
2817 cc_binary {
2818 name: "mybin2",
2819 vendor: true,
2820 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002821 }
2822 `)
2823
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002824 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002825
Jooyung Han91f92032022-02-04 12:36:33 +09002826 for _, tc := range []struct {
2827 name string
2828 apexName string
2829 moduleName string
2830 moduleVariant string
2831 libs []string
2832 contents []string
2833 requireVndkNamespace bool
2834 }{
2835 {
2836 name: "use_vndk_as_stable",
2837 apexName: "myapex",
2838 moduleName: "mybin",
2839 moduleVariant: vendorVariant + "_apex10000",
2840 libs: []string{
2841 // should link with vendor variants of VNDK libs(libvndk/libc++)
2842 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2843 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2844 // unstable Vendor libs as APEX variant
2845 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2846 },
2847 contents: []string{
2848 "bin/mybin",
2849 "lib64/libvendor.so",
2850 // VNDK libs (libvndk/libc++) are not included
2851 },
2852 requireVndkNamespace: true,
2853 },
2854 {
2855 name: "!use_vndk_as_stable",
2856 apexName: "myapex2",
2857 moduleName: "mybin2",
2858 moduleVariant: vendorVariant + "_myapex2",
2859 libs: []string{
2860 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2861 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2862 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2863 // unstable vendor libs have "merged" APEX variants
2864 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2865 },
2866 contents: []string{
2867 "bin/mybin2",
2868 "lib64/libvendor.so",
2869 // VNDK libs are included as well
2870 "lib64/libvndk.so",
2871 "lib64/libc++.so",
2872 },
2873 requireVndkNamespace: false,
2874 },
2875 } {
2876 t.Run(tc.name, func(t *testing.T) {
2877 // Check linked libs
2878 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2879 libs := names(ldRule.Args["libFlags"])
2880 for _, lib := range tc.libs {
2881 ensureListContains(t, libs, lib)
2882 }
2883 // Check apex contents
2884 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002885
Jooyung Han91f92032022-02-04 12:36:33 +09002886 // Check "requireNativeLibs"
2887 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2888 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2889 if tc.requireVndkNamespace {
2890 ensureListContains(t, requireNativeLibs, ":vndk")
2891 } else {
2892 ensureListNotContains(t, requireNativeLibs, ":vndk")
2893 }
2894 })
2895 }
Jooyung Handf78e212020-07-22 15:54:47 +09002896}
2897
Justin Yun13decfb2021-03-08 19:25:55 +09002898func TestProductVariant(t *testing.T) {
2899 ctx := testApex(t, `
2900 apex {
2901 name: "myapex",
2902 key: "myapex.key",
2903 updatable: false,
2904 product_specific: true,
2905 binaries: ["foo"],
2906 }
2907
2908 apex_key {
2909 name: "myapex.key",
2910 public_key: "testkey.avbpubkey",
2911 private_key: "testkey.pem",
2912 }
2913
2914 cc_binary {
2915 name: "foo",
2916 product_available: true,
2917 apex_available: ["myapex"],
2918 srcs: ["foo.cpp"],
2919 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002920 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2921 variables.ProductVndkVersion = proptools.StringPtr("current")
2922 }),
2923 )
Justin Yun13decfb2021-03-08 19:25:55 +09002924
2925 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002926 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002927 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2928 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2929 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2930 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2931}
2932
Jooyung Han8e5685d2020-09-21 11:02:57 +09002933func TestApex_withPrebuiltFirmware(t *testing.T) {
2934 testCases := []struct {
2935 name string
2936 additionalProp string
2937 }{
2938 {"system apex with prebuilt_firmware", ""},
2939 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2940 }
2941 for _, tc := range testCases {
2942 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002943 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002944 apex {
2945 name: "myapex",
2946 key: "myapex.key",
2947 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002948 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002949 `+tc.additionalProp+`
2950 }
2951 apex_key {
2952 name: "myapex.key",
2953 public_key: "testkey.avbpubkey",
2954 private_key: "testkey.pem",
2955 }
2956 prebuilt_firmware {
2957 name: "myfirmware",
2958 src: "myfirmware.bin",
2959 filename_from_src: true,
2960 `+tc.additionalProp+`
2961 }
2962 `)
2963 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2964 "etc/firmware/myfirmware.bin",
2965 })
2966 })
2967 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002968}
2969
Jooyung Hanefb184e2020-06-25 17:14:25 +09002970func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002971 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002972 apex {
2973 name: "myapex",
2974 key: "myapex.key",
2975 vendor: true,
2976 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002977 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002978 }
2979
2980 apex_key {
2981 name: "myapex.key",
2982 public_key: "testkey.avbpubkey",
2983 private_key: "testkey.pem",
2984 }
2985
2986 cc_library {
2987 name: "mylib",
2988 vendor_available: true,
2989 }
2990 `)
2991
2992 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002993 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002994 name := apexBundle.BaseModuleName()
2995 prefix := "TARGET_"
2996 var builder strings.Builder
2997 data.Custom(&builder, name, prefix, "", data)
2998 androidMk := builder.String()
2999 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
3000}
3001
Jooyung Han2ed99d02020-06-24 23:26:26 +09003002func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003003 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003004 apex {
3005 name: "myapex",
3006 key: "myapex.key",
3007 vintf_fragments: ["fragment.xml"],
3008 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003009 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003010 }
3011 apex_key {
3012 name: "myapex.key",
3013 public_key: "testkey.avbpubkey",
3014 private_key: "testkey.pem",
3015 }
3016 cc_binary {
3017 name: "mybin",
3018 }
3019 `)
3020
3021 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003022 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003023 name := apexBundle.BaseModuleName()
3024 prefix := "TARGET_"
3025 var builder strings.Builder
3026 data.Custom(&builder, name, prefix, "", data)
3027 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003028 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003029 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003030}
3031
Jiyong Park16e91a02018-12-20 18:18:08 +09003032func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003033 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003034 apex {
3035 name: "myapex",
3036 key: "myapex.key",
3037 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003038 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003039 }
3040
3041 apex_key {
3042 name: "myapex.key",
3043 public_key: "testkey.avbpubkey",
3044 private_key: "testkey.pem",
3045 }
3046
3047 cc_library {
3048 name: "mylib",
3049 srcs: ["mylib.cpp"],
3050 system_shared_libs: [],
3051 stl: "none",
3052 stubs: {
3053 versions: ["1", "2", "3"],
3054 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003055 apex_available: [
3056 "//apex_available:platform",
3057 "myapex",
3058 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003059 }
3060
3061 cc_binary {
3062 name: "not_in_apex",
3063 srcs: ["mylib.cpp"],
3064 static_libs: ["mylib"],
3065 static_executable: true,
3066 system_shared_libs: [],
3067 stl: "none",
3068 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003069 `)
3070
Colin Cross7113d202019-11-20 16:39:12 -08003071 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003072
3073 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003074 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003075}
Jiyong Park9335a262018-12-24 11:31:58 +09003076
3077func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003078 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003079 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003080 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003081 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003082 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003083 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003084 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003085 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003086 }
3087
3088 cc_library {
3089 name: "mylib",
3090 srcs: ["mylib.cpp"],
3091 system_shared_libs: [],
3092 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003093 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003094 }
3095
3096 apex_key {
3097 name: "myapex.key",
3098 public_key: "testkey.avbpubkey",
3099 private_key: "testkey.pem",
3100 }
3101
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003102 android_app_certificate {
3103 name: "myapex.certificate",
3104 certificate: "testkey",
3105 }
3106
3107 android_app_certificate {
3108 name: "myapex.certificate.override",
3109 certificate: "testkey.override",
3110 }
3111
Jiyong Park9335a262018-12-24 11:31:58 +09003112 `)
3113
3114 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003115 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003116
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003117 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3118 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003119 "vendor/foo/devkeys/testkey.avbpubkey")
3120 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003121 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3122 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003123 "vendor/foo/devkeys/testkey.pem")
3124 }
3125
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003126 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003127 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003128 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003129 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003130 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003131 }
3132}
Jiyong Park58e364a2019-01-19 19:24:06 +09003133
Jooyung Hanf121a652019-12-17 14:30:11 +09003134func TestCertificate(t *testing.T) {
3135 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003136 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003137 apex {
3138 name: "myapex",
3139 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003140 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003141 }
3142 apex_key {
3143 name: "myapex.key",
3144 public_key: "testkey.avbpubkey",
3145 private_key: "testkey.pem",
3146 }`)
3147 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3148 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3149 if actual := rule.Args["certificates"]; actual != expected {
3150 t.Errorf("certificates should be %q, not %q", expected, actual)
3151 }
3152 })
3153 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003154 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003155 apex {
3156 name: "myapex_keytest",
3157 key: "myapex.key",
3158 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003159 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003160 }
3161 apex_key {
3162 name: "myapex.key",
3163 public_key: "testkey.avbpubkey",
3164 private_key: "testkey.pem",
3165 }
3166 android_app_certificate {
3167 name: "myapex.certificate.override",
3168 certificate: "testkey.override",
3169 }`)
3170 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3171 expected := "testkey.override.x509.pem testkey.override.pk8"
3172 if actual := rule.Args["certificates"]; actual != expected {
3173 t.Errorf("certificates should be %q, not %q", expected, actual)
3174 }
3175 })
3176 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003177 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003178 apex {
3179 name: "myapex",
3180 key: "myapex.key",
3181 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003182 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003183 }
3184 apex_key {
3185 name: "myapex.key",
3186 public_key: "testkey.avbpubkey",
3187 private_key: "testkey.pem",
3188 }
3189 android_app_certificate {
3190 name: "myapex.certificate",
3191 certificate: "testkey",
3192 }`)
3193 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3194 expected := "testkey.x509.pem testkey.pk8"
3195 if actual := rule.Args["certificates"]; actual != expected {
3196 t.Errorf("certificates should be %q, not %q", expected, actual)
3197 }
3198 })
3199 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003200 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003201 apex {
3202 name: "myapex_keytest",
3203 key: "myapex.key",
3204 file_contexts: ":myapex-file_contexts",
3205 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003206 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003207 }
3208 apex_key {
3209 name: "myapex.key",
3210 public_key: "testkey.avbpubkey",
3211 private_key: "testkey.pem",
3212 }
3213 android_app_certificate {
3214 name: "myapex.certificate.override",
3215 certificate: "testkey.override",
3216 }`)
3217 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3218 expected := "testkey.override.x509.pem testkey.override.pk8"
3219 if actual := rule.Args["certificates"]; actual != expected {
3220 t.Errorf("certificates should be %q, not %q", expected, actual)
3221 }
3222 })
3223 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003224 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003225 apex {
3226 name: "myapex",
3227 key: "myapex.key",
3228 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003229 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003230 }
3231 apex_key {
3232 name: "myapex.key",
3233 public_key: "testkey.avbpubkey",
3234 private_key: "testkey.pem",
3235 }`)
3236 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3237 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3238 if actual := rule.Args["certificates"]; actual != expected {
3239 t.Errorf("certificates should be %q, not %q", expected, actual)
3240 }
3241 })
3242 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003243 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003244 apex {
3245 name: "myapex_keytest",
3246 key: "myapex.key",
3247 file_contexts: ":myapex-file_contexts",
3248 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003249 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003250 }
3251 apex_key {
3252 name: "myapex.key",
3253 public_key: "testkey.avbpubkey",
3254 private_key: "testkey.pem",
3255 }
3256 android_app_certificate {
3257 name: "myapex.certificate.override",
3258 certificate: "testkey.override",
3259 }`)
3260 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3261 expected := "testkey.override.x509.pem testkey.override.pk8"
3262 if actual := rule.Args["certificates"]; actual != expected {
3263 t.Errorf("certificates should be %q, not %q", expected, actual)
3264 }
3265 })
3266}
3267
Jiyong Park58e364a2019-01-19 19:24:06 +09003268func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003269 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003270 apex {
3271 name: "myapex",
3272 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003273 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003274 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003275 }
3276
3277 apex {
3278 name: "otherapex",
3279 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003280 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003281 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003282 }
3283
3284 apex_key {
3285 name: "myapex.key",
3286 public_key: "testkey.avbpubkey",
3287 private_key: "testkey.pem",
3288 }
3289
3290 cc_library {
3291 name: "mylib",
3292 srcs: ["mylib.cpp"],
3293 system_shared_libs: [],
3294 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003295 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003296 "myapex",
3297 "otherapex",
3298 ],
Jooyung Han24282772020-03-21 23:20:55 +09003299 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003300 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003301 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003302 cc_library {
3303 name: "mylib2",
3304 srcs: ["mylib.cpp"],
3305 system_shared_libs: [],
3306 stl: "none",
3307 apex_available: [
3308 "myapex",
3309 "otherapex",
3310 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003311 static_libs: ["mylib3"],
3312 recovery_available: true,
3313 min_sdk_version: "29",
3314 }
3315 cc_library {
3316 name: "mylib3",
3317 srcs: ["mylib.cpp"],
3318 system_shared_libs: [],
3319 stl: "none",
3320 apex_available: [
3321 "myapex",
3322 "otherapex",
3323 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003324 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003325 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003326 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003327 `)
3328
Jooyung Hanc87a0592020-03-02 17:44:33 +09003329 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003330 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003331 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003332 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003333
Jooyung Hanccce2f22020-03-07 03:45:53 +09003334 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003335 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003336 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003337 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003338
Jooyung Hanccce2f22020-03-07 03:45:53 +09003339 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003340 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003341 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003342 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003343
Colin Crossaede88c2020-08-11 12:17:01 -07003344 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3345 // each variant defines additional macros to distinguish which apex variant it is built for
3346
3347 // non-APEX variant does not have __ANDROID_APEX__ defined
3348 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3349 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3350
Dan Albertb19953d2020-11-17 15:29:36 -08003351 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003352 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3353 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003354 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003355
Jooyung Hanc87a0592020-03-02 17:44:33 +09003356 // non-APEX variant does not have __ANDROID_APEX__ defined
3357 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3358 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3359
Dan Albertb19953d2020-11-17 15:29:36 -08003360 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003361 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003362 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003363 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003364}
Jiyong Park7e636d02019-01-28 16:16:54 +09003365
3366func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003367 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003368 apex {
3369 name: "myapex",
3370 key: "myapex.key",
3371 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003372 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003373 }
3374
3375 apex_key {
3376 name: "myapex.key",
3377 public_key: "testkey.avbpubkey",
3378 private_key: "testkey.pem",
3379 }
3380
3381 cc_library_headers {
3382 name: "mylib_headers",
3383 export_include_dirs: ["my_include"],
3384 system_shared_libs: [],
3385 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003386 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003387 }
3388
3389 cc_library {
3390 name: "mylib",
3391 srcs: ["mylib.cpp"],
3392 system_shared_libs: [],
3393 stl: "none",
3394 header_libs: ["mylib_headers"],
3395 export_header_lib_headers: ["mylib_headers"],
3396 stubs: {
3397 versions: ["1", "2", "3"],
3398 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003399 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003400 }
3401
3402 cc_library {
3403 name: "otherlib",
3404 srcs: ["mylib.cpp"],
3405 system_shared_libs: [],
3406 stl: "none",
3407 shared_libs: ["mylib"],
3408 }
3409 `)
3410
Colin Cross7113d202019-11-20 16:39:12 -08003411 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003412
3413 // Ensure that the include path of the header lib is exported to 'otherlib'
3414 ensureContains(t, cFlags, "-Imy_include")
3415}
Alex Light9670d332019-01-29 18:07:33 -08003416
Jiyong Park7cd10e32020-01-14 09:22:18 +09003417type fileInApex struct {
3418 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003419 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003420 isLink bool
3421}
3422
Jooyung Hana57af4a2020-01-23 05:36:59 +00003423func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003424 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003425 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003426 copyCmds := apexRule.Args["copy_commands"]
3427 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003428 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003429 for _, cmd := range strings.Split(copyCmds, "&&") {
3430 cmd = strings.TrimSpace(cmd)
3431 if cmd == "" {
3432 continue
3433 }
3434 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003435 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003436 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003437 switch terms[0] {
3438 case "mkdir":
3439 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003440 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003441 t.Fatal("copyCmds contains invalid cp command", cmd)
3442 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003443 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003444 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003445 isLink = false
3446 case "ln":
3447 if len(terms) != 3 && len(terms) != 4 {
3448 // ln LINK TARGET or ln -s LINK TARGET
3449 t.Fatal("copyCmds contains invalid ln command", cmd)
3450 }
3451 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003452 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003453 isLink = true
3454 default:
3455 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3456 }
3457 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003458 index := strings.Index(dst, imageApexDir)
3459 if index == -1 {
3460 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3461 }
3462 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003463 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003464 }
3465 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003466 return ret
3467}
3468
Jooyung Hana57af4a2020-01-23 05:36:59 +00003469func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3470 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003471 var failed bool
3472 var surplus []string
3473 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003474 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003475 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003476 for _, expected := range files {
3477 if matched, _ := path.Match(expected, file.path); matched {
3478 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003479 mactchFound = true
3480 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003481 }
3482 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003483 if !mactchFound {
3484 surplus = append(surplus, file.path)
3485 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003486 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003487
Jooyung Han31c470b2019-10-18 16:26:59 +09003488 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003489 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003490 t.Log("surplus files", surplus)
3491 failed = true
3492 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003493
3494 if len(files) > len(filesMatched) {
3495 var missing []string
3496 for _, expected := range files {
3497 if !filesMatched[expected] {
3498 missing = append(missing, expected)
3499 }
3500 }
3501 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003502 t.Log("missing files", missing)
3503 failed = true
3504 }
3505 if failed {
3506 t.Fail()
3507 }
3508}
3509
Jooyung Han344d5432019-08-23 11:17:39 +09003510func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003511 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003512 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003513 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003514 "etc/llndk.libraries.29.txt",
3515 "etc/vndkcore.libraries.29.txt",
3516 "etc/vndksp.libraries.29.txt",
3517 "etc/vndkprivate.libraries.29.txt",
3518 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003519 }
3520 testCases := []struct {
3521 vndkVersion string
3522 expectedFiles []string
3523 }{
3524 {
3525 vndkVersion: "current",
3526 expectedFiles: append(commonFiles,
3527 "lib/libvndk.so",
3528 "lib/libvndksp.so",
3529 "lib64/libvndk.so",
3530 "lib64/libvndksp.so"),
3531 },
3532 {
3533 vndkVersion: "",
3534 expectedFiles: append(commonFiles,
3535 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3536 "lib/libvndksp.so",
3537 "lib64/libvndksp.so"),
3538 },
3539 }
3540 for _, tc := range testCases {
3541 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3542 ctx := testApex(t, `
3543 apex_vndk {
3544 name: "com.android.vndk.current",
3545 key: "com.android.vndk.current.key",
3546 updatable: false,
3547 }
3548
3549 apex_key {
3550 name: "com.android.vndk.current.key",
3551 public_key: "testkey.avbpubkey",
3552 private_key: "testkey.pem",
3553 }
3554
3555 cc_library {
3556 name: "libvndk",
3557 srcs: ["mylib.cpp"],
3558 vendor_available: true,
3559 product_available: true,
3560 vndk: {
3561 enabled: true,
3562 },
3563 system_shared_libs: [],
3564 stl: "none",
3565 apex_available: [ "com.android.vndk.current" ],
3566 }
3567
3568 cc_library {
3569 name: "libvndksp",
3570 srcs: ["mylib.cpp"],
3571 vendor_available: true,
3572 product_available: true,
3573 vndk: {
3574 enabled: true,
3575 support_system_process: true,
3576 },
3577 system_shared_libs: [],
3578 stl: "none",
3579 apex_available: [ "com.android.vndk.current" ],
3580 }
3581
3582 // VNDK-Ext should not cause any problems
3583
3584 cc_library {
3585 name: "libvndk.ext",
3586 srcs: ["mylib2.cpp"],
3587 vendor: true,
3588 vndk: {
3589 enabled: true,
3590 extends: "libvndk",
3591 },
3592 system_shared_libs: [],
3593 stl: "none",
3594 }
3595
3596 cc_library {
3597 name: "libvndksp.ext",
3598 srcs: ["mylib2.cpp"],
3599 vendor: true,
3600 vndk: {
3601 enabled: true,
3602 support_system_process: true,
3603 extends: "libvndksp",
3604 },
3605 system_shared_libs: [],
3606 stl: "none",
3607 }
3608 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3609 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3610 }))
3611 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3612 })
3613 }
Jooyung Han344d5432019-08-23 11:17:39 +09003614}
3615
3616func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003617 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003618 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003619 name: "com.android.vndk.current",
3620 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003621 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003622 }
3623
3624 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003625 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003626 public_key: "testkey.avbpubkey",
3627 private_key: "testkey.pem",
3628 }
3629
3630 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003631 name: "libvndk",
3632 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003633 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003634 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003635 vndk: {
3636 enabled: true,
3637 },
3638 system_shared_libs: [],
3639 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003640 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003641 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003642
3643 cc_prebuilt_library_shared {
3644 name: "libvndk.arm",
3645 srcs: ["libvndk.arm.so"],
3646 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003647 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003648 vndk: {
3649 enabled: true,
3650 },
3651 enabled: false,
3652 arch: {
3653 arm: {
3654 enabled: true,
3655 },
3656 },
3657 system_shared_libs: [],
3658 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003659 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003660 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003661 `+vndkLibrariesTxtFiles("current"),
3662 withFiles(map[string][]byte{
3663 "libvndk.so": nil,
3664 "libvndk.arm.so": nil,
3665 }))
Colin Cross2807f002021-03-02 10:15:29 -08003666 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003667 "lib/libvndk.so",
3668 "lib/libvndk.arm.so",
3669 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003670 "lib/libc++.so",
3671 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003672 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003673 })
Jooyung Han344d5432019-08-23 11:17:39 +09003674}
3675
Jooyung Han39edb6c2019-11-06 16:53:07 +09003676func vndkLibrariesTxtFiles(vers ...string) (result string) {
3677 for _, v := range vers {
3678 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003679 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003680 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003681 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003682 name: "` + txt + `.libraries.txt",
3683 }
3684 `
3685 }
3686 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003687 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003688 result += `
3689 prebuilt_etc {
3690 name: "` + txt + `.libraries.` + v + `.txt",
3691 src: "dummy.txt",
3692 }
3693 `
3694 }
3695 }
3696 }
3697 return
3698}
3699
Jooyung Han344d5432019-08-23 11:17:39 +09003700func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003701 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003702 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003703 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003704 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003705 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003706 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003707 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003708 }
3709
3710 apex_key {
3711 name: "myapex.key",
3712 public_key: "testkey.avbpubkey",
3713 private_key: "testkey.pem",
3714 }
3715
Jooyung Han31c470b2019-10-18 16:26:59 +09003716 vndk_prebuilt_shared {
3717 name: "libvndk27",
3718 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003719 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003720 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003721 vndk: {
3722 enabled: true,
3723 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003724 target_arch: "arm64",
3725 arch: {
3726 arm: {
3727 srcs: ["libvndk27_arm.so"],
3728 },
3729 arm64: {
3730 srcs: ["libvndk27_arm64.so"],
3731 },
3732 },
Colin Cross2807f002021-03-02 10:15:29 -08003733 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003734 }
3735
3736 vndk_prebuilt_shared {
3737 name: "libvndk27",
3738 version: "27",
3739 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003740 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003741 vndk: {
3742 enabled: true,
3743 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003744 target_arch: "x86_64",
3745 arch: {
3746 x86: {
3747 srcs: ["libvndk27_x86.so"],
3748 },
3749 x86_64: {
3750 srcs: ["libvndk27_x86_64.so"],
3751 },
3752 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003753 }
3754 `+vndkLibrariesTxtFiles("27"),
3755 withFiles(map[string][]byte{
3756 "libvndk27_arm.so": nil,
3757 "libvndk27_arm64.so": nil,
3758 "libvndk27_x86.so": nil,
3759 "libvndk27_x86_64.so": nil,
3760 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003761
Colin Cross2807f002021-03-02 10:15:29 -08003762 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003763 "lib/libvndk27_arm.so",
3764 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003765 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003766 })
Jooyung Han344d5432019-08-23 11:17:39 +09003767}
3768
Jooyung Han90eee022019-10-01 20:02:42 +09003769func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003770 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003771 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003772 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003773 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003774 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003775 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003776 }
3777 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003778 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003779 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003780 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003781 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003782 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003783 }
3784 apex_key {
3785 name: "myapex.key",
3786 public_key: "testkey.avbpubkey",
3787 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003788 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003789
3790 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003791 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003792 actual := proptools.String(bundle.properties.Apex_name)
3793 if !reflect.DeepEqual(actual, expected) {
3794 t.Errorf("Got '%v', expected '%v'", actual, expected)
3795 }
3796 }
3797
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003798 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003799 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003800}
3801
Jooyung Han344d5432019-08-23 11:17:39 +09003802func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003803 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003804 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003805 name: "com.android.vndk.current",
3806 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003807 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003808 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003809 }
3810
3811 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003812 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003813 public_key: "testkey.avbpubkey",
3814 private_key: "testkey.pem",
3815 }
3816
3817 cc_library {
3818 name: "libvndk",
3819 srcs: ["mylib.cpp"],
3820 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003821 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003822 native_bridge_supported: true,
3823 host_supported: true,
3824 vndk: {
3825 enabled: true,
3826 },
3827 system_shared_libs: [],
3828 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003829 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003830 }
Colin Cross2807f002021-03-02 10:15:29 -08003831 `+vndkLibrariesTxtFiles("current"),
3832 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003833
Colin Cross2807f002021-03-02 10:15:29 -08003834 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003835 "lib/libvndk.so",
3836 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003837 "lib/libc++.so",
3838 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003839 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003840 })
Jooyung Han344d5432019-08-23 11:17:39 +09003841}
3842
3843func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003844 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003845 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003846 name: "com.android.vndk.current",
3847 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003848 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003849 native_bridge_supported: true,
3850 }
3851
3852 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003853 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003854 public_key: "testkey.avbpubkey",
3855 private_key: "testkey.pem",
3856 }
3857
3858 cc_library {
3859 name: "libvndk",
3860 srcs: ["mylib.cpp"],
3861 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003862 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003863 native_bridge_supported: true,
3864 host_supported: true,
3865 vndk: {
3866 enabled: true,
3867 },
3868 system_shared_libs: [],
3869 stl: "none",
3870 }
3871 `)
3872}
3873
Jooyung Han31c470b2019-10-18 16:26:59 +09003874func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003875 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003876 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003877 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003878 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003879 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003880 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003881 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003882 }
3883
3884 apex_key {
3885 name: "myapex.key",
3886 public_key: "testkey.avbpubkey",
3887 private_key: "testkey.pem",
3888 }
3889
3890 vndk_prebuilt_shared {
3891 name: "libvndk27",
3892 version: "27",
3893 target_arch: "arm",
3894 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003895 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003896 vndk: {
3897 enabled: true,
3898 },
3899 arch: {
3900 arm: {
3901 srcs: ["libvndk27.so"],
3902 }
3903 },
3904 }
3905
3906 vndk_prebuilt_shared {
3907 name: "libvndk27",
3908 version: "27",
3909 target_arch: "arm",
3910 binder32bit: true,
3911 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003912 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003913 vndk: {
3914 enabled: true,
3915 },
3916 arch: {
3917 arm: {
3918 srcs: ["libvndk27binder32.so"],
3919 }
3920 },
Colin Cross2807f002021-03-02 10:15:29 -08003921 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003922 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003923 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003924 withFiles(map[string][]byte{
3925 "libvndk27.so": nil,
3926 "libvndk27binder32.so": nil,
3927 }),
3928 withBinder32bit,
3929 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003930 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003931 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3932 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003933 },
3934 }),
3935 )
3936
Colin Cross2807f002021-03-02 10:15:29 -08003937 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003938 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003939 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003940 })
3941}
3942
Jooyung Han45a96772020-06-15 14:59:42 +09003943func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003944 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003945 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003946 name: "com.android.vndk.current",
3947 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003948 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003949 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003950 }
3951
3952 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003953 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003954 public_key: "testkey.avbpubkey",
3955 private_key: "testkey.pem",
3956 }
3957
3958 cc_library {
3959 name: "libz",
3960 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003961 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003962 vndk: {
3963 enabled: true,
3964 },
3965 stubs: {
3966 symbol_file: "libz.map.txt",
3967 versions: ["30"],
3968 }
3969 }
3970 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3971 "libz.map.txt": nil,
3972 }))
3973
Colin Cross2807f002021-03-02 10:15:29 -08003974 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003975 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3976 ensureListEmpty(t, provideNativeLibs)
3977}
3978
Jooyung Hane1633032019-08-01 17:41:43 +09003979func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003980 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003981 apex {
3982 name: "myapex_nodep",
3983 key: "myapex.key",
3984 native_shared_libs: ["lib_nodep"],
3985 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003986 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003987 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003988 }
3989
3990 apex {
3991 name: "myapex_dep",
3992 key: "myapex.key",
3993 native_shared_libs: ["lib_dep"],
3994 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003995 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003996 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003997 }
3998
3999 apex {
4000 name: "myapex_provider",
4001 key: "myapex.key",
4002 native_shared_libs: ["libfoo"],
4003 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004004 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004005 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004006 }
4007
4008 apex {
4009 name: "myapex_selfcontained",
4010 key: "myapex.key",
4011 native_shared_libs: ["lib_dep", "libfoo"],
4012 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004013 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004014 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004015 }
4016
4017 apex_key {
4018 name: "myapex.key",
4019 public_key: "testkey.avbpubkey",
4020 private_key: "testkey.pem",
4021 }
4022
4023 cc_library {
4024 name: "lib_nodep",
4025 srcs: ["mylib.cpp"],
4026 system_shared_libs: [],
4027 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004028 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004029 }
4030
4031 cc_library {
4032 name: "lib_dep",
4033 srcs: ["mylib.cpp"],
4034 shared_libs: ["libfoo"],
4035 system_shared_libs: [],
4036 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004037 apex_available: [
4038 "myapex_dep",
4039 "myapex_provider",
4040 "myapex_selfcontained",
4041 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004042 }
4043
4044 cc_library {
4045 name: "libfoo",
4046 srcs: ["mytest.cpp"],
4047 stubs: {
4048 versions: ["1"],
4049 },
4050 system_shared_libs: [],
4051 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004052 apex_available: [
4053 "myapex_provider",
4054 "myapex_selfcontained",
4055 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004056 }
4057 `)
4058
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004059 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004060 var provideNativeLibs, requireNativeLibs []string
4061
Sundong Ahnabb64432019-10-22 13:58:29 +09004062 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004063 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4064 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004065 ensureListEmpty(t, provideNativeLibs)
4066 ensureListEmpty(t, requireNativeLibs)
4067
Sundong Ahnabb64432019-10-22 13:58:29 +09004068 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004069 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4070 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004071 ensureListEmpty(t, provideNativeLibs)
4072 ensureListContains(t, requireNativeLibs, "libfoo.so")
4073
Sundong Ahnabb64432019-10-22 13:58:29 +09004074 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004075 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4076 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004077 ensureListContains(t, provideNativeLibs, "libfoo.so")
4078 ensureListEmpty(t, requireNativeLibs)
4079
Sundong Ahnabb64432019-10-22 13:58:29 +09004080 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004081 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4082 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004083 ensureListContains(t, provideNativeLibs, "libfoo.so")
4084 ensureListEmpty(t, requireNativeLibs)
4085}
4086
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004087func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004088 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004089 apex {
4090 name: "myapex",
4091 key: "myapex.key",
4092 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004093 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004094 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004095 }
4096
4097 apex_key {
4098 name: "myapex.key",
4099 public_key: "testkey.avbpubkey",
4100 private_key: "testkey.pem",
4101 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004102
4103 cc_library {
4104 name: "mylib",
4105 srcs: ["mylib.cpp"],
4106 system_shared_libs: [],
4107 stl: "none",
4108 apex_available: [
4109 "//apex_available:platform",
4110 "myapex",
4111 ],
4112 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004113 `)
4114
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004115 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004116 apexManifestRule := module.Rule("apexManifestRule")
4117 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4118 apexRule := module.Rule("apexRule")
4119 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004120
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004121 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004122 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004123 name := apexBundle.BaseModuleName()
4124 prefix := "TARGET_"
4125 var builder strings.Builder
4126 data.Custom(&builder, name, prefix, "", data)
4127 androidMk := builder.String()
4128 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4129 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004130}
4131
Vinh Tran8f5310f2022-10-07 18:16:47 -04004132func TestCompileMultilibProp(t *testing.T) {
4133 testCases := []struct {
4134 compileMultiLibProp string
4135 containedLibs []string
4136 notContainedLibs []string
4137 }{
4138 {
4139 containedLibs: []string{
4140 "image.apex/lib64/mylib.so",
4141 "image.apex/lib/mylib.so",
4142 },
4143 compileMultiLibProp: `compile_multilib: "both",`,
4144 },
4145 {
4146 containedLibs: []string{"image.apex/lib64/mylib.so"},
4147 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4148 compileMultiLibProp: `compile_multilib: "first",`,
4149 },
4150 {
4151 containedLibs: []string{"image.apex/lib64/mylib.so"},
4152 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4153 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4154 },
4155 {
4156 containedLibs: []string{"image.apex/lib64/mylib.so"},
4157 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4158 compileMultiLibProp: `compile_multilib: "64",`,
4159 },
4160 {
4161 containedLibs: []string{"image.apex/lib/mylib.so"},
4162 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4163 compileMultiLibProp: `compile_multilib: "32",`,
4164 },
4165 }
4166 for _, testCase := range testCases {
4167 ctx := testApex(t, fmt.Sprintf(`
4168 apex {
4169 name: "myapex",
4170 key: "myapex.key",
4171 %s
4172 native_shared_libs: ["mylib"],
4173 updatable: false,
4174 }
4175 apex_key {
4176 name: "myapex.key",
4177 public_key: "testkey.avbpubkey",
4178 private_key: "testkey.pem",
4179 }
4180 cc_library {
4181 name: "mylib",
4182 srcs: ["mylib.cpp"],
4183 apex_available: [
4184 "//apex_available:platform",
4185 "myapex",
4186 ],
4187 }
4188 `, testCase.compileMultiLibProp),
4189 )
4190 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4191 apexRule := module.Rule("apexRule")
4192 copyCmds := apexRule.Args["copy_commands"]
4193 for _, containedLib := range testCase.containedLibs {
4194 ensureContains(t, copyCmds, containedLib)
4195 }
4196 for _, notContainedLib := range testCase.notContainedLibs {
4197 ensureNotContains(t, copyCmds, notContainedLib)
4198 }
4199 }
4200}
4201
Alex Light0851b882019-02-07 13:20:53 -08004202func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004203 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004204 apex {
4205 name: "myapex",
4206 key: "myapex.key",
4207 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004208 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004209 }
4210
4211 apex_key {
4212 name: "myapex.key",
4213 public_key: "testkey.avbpubkey",
4214 private_key: "testkey.pem",
4215 }
4216
4217 cc_library {
4218 name: "mylib_common",
4219 srcs: ["mylib.cpp"],
4220 system_shared_libs: [],
4221 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004222 apex_available: [
4223 "//apex_available:platform",
4224 "myapex",
4225 ],
Alex Light0851b882019-02-07 13:20:53 -08004226 }
4227 `)
4228
Sundong Ahnabb64432019-10-22 13:58:29 +09004229 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004230 apexRule := module.Rule("apexRule")
4231 copyCmds := apexRule.Args["copy_commands"]
4232
4233 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4234 t.Log("Apex was a test apex!")
4235 t.Fail()
4236 }
4237 // Ensure that main rule creates an output
4238 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4239
4240 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004241 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004242
4243 // Ensure that both direct and indirect deps are copied into apex
4244 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4245
Colin Cross7113d202019-11-20 16:39:12 -08004246 // Ensure that the platform variant ends with _shared
4247 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004248
Colin Cross56a83212020-09-15 18:30:11 -07004249 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004250 t.Log("Found mylib_common not in any apex!")
4251 t.Fail()
4252 }
4253}
4254
4255func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004256 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004257 apex_test {
4258 name: "myapex",
4259 key: "myapex.key",
4260 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004261 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004262 }
4263
4264 apex_key {
4265 name: "myapex.key",
4266 public_key: "testkey.avbpubkey",
4267 private_key: "testkey.pem",
4268 }
4269
4270 cc_library {
4271 name: "mylib_common_test",
4272 srcs: ["mylib.cpp"],
4273 system_shared_libs: [],
4274 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004275 // TODO: remove //apex_available:platform
4276 apex_available: [
4277 "//apex_available:platform",
4278 "myapex",
4279 ],
Alex Light0851b882019-02-07 13:20:53 -08004280 }
4281 `)
4282
Sundong Ahnabb64432019-10-22 13:58:29 +09004283 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004284 apexRule := module.Rule("apexRule")
4285 copyCmds := apexRule.Args["copy_commands"]
4286
4287 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4288 t.Log("Apex was not a test apex!")
4289 t.Fail()
4290 }
4291 // Ensure that main rule creates an output
4292 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4293
4294 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004295 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004296
4297 // Ensure that both direct and indirect deps are copied into apex
4298 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4299
Colin Cross7113d202019-11-20 16:39:12 -08004300 // Ensure that the platform variant ends with _shared
4301 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004302}
4303
Alex Light9670d332019-01-29 18:07:33 -08004304func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004305 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004306 apex {
4307 name: "myapex",
4308 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004309 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004310 multilib: {
4311 first: {
4312 native_shared_libs: ["mylib_common"],
4313 }
4314 },
4315 target: {
4316 android: {
4317 multilib: {
4318 first: {
4319 native_shared_libs: ["mylib"],
4320 }
4321 }
4322 },
4323 host: {
4324 multilib: {
4325 first: {
4326 native_shared_libs: ["mylib2"],
4327 }
4328 }
4329 }
4330 }
4331 }
4332
4333 apex_key {
4334 name: "myapex.key",
4335 public_key: "testkey.avbpubkey",
4336 private_key: "testkey.pem",
4337 }
4338
4339 cc_library {
4340 name: "mylib",
4341 srcs: ["mylib.cpp"],
4342 system_shared_libs: [],
4343 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004344 // TODO: remove //apex_available:platform
4345 apex_available: [
4346 "//apex_available:platform",
4347 "myapex",
4348 ],
Alex Light9670d332019-01-29 18:07:33 -08004349 }
4350
4351 cc_library {
4352 name: "mylib_common",
4353 srcs: ["mylib.cpp"],
4354 system_shared_libs: [],
4355 stl: "none",
4356 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004357 // TODO: remove //apex_available:platform
4358 apex_available: [
4359 "//apex_available:platform",
4360 "myapex",
4361 ],
Alex Light9670d332019-01-29 18:07:33 -08004362 }
4363
4364 cc_library {
4365 name: "mylib2",
4366 srcs: ["mylib.cpp"],
4367 system_shared_libs: [],
4368 stl: "none",
4369 compile_multilib: "first",
4370 }
4371 `)
4372
Sundong Ahnabb64432019-10-22 13:58:29 +09004373 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004374 copyCmds := apexRule.Args["copy_commands"]
4375
4376 // Ensure that main rule creates an output
4377 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4378
4379 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004380 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4381 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4382 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004383
4384 // Ensure that both direct and indirect deps are copied into apex
4385 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4386 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4387 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4388
Colin Cross7113d202019-11-20 16:39:12 -08004389 // Ensure that the platform variant ends with _shared
4390 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4391 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4392 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004393}
Jiyong Park04480cf2019-02-06 00:16:29 +09004394
Jiyong Park59140302020-12-14 18:44:04 +09004395func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004396 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004397 apex {
4398 name: "myapex",
4399 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004400 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004401 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004402 arch: {
4403 arm64: {
4404 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004405 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004406 },
4407 x86_64: {
4408 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004409 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004410 },
4411 }
4412 }
4413
4414 apex_key {
4415 name: "myapex.key",
4416 public_key: "testkey.avbpubkey",
4417 private_key: "testkey.pem",
4418 }
4419
4420 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004421 name: "mylib.generic",
4422 srcs: ["mylib.cpp"],
4423 system_shared_libs: [],
4424 stl: "none",
4425 // TODO: remove //apex_available:platform
4426 apex_available: [
4427 "//apex_available:platform",
4428 "myapex",
4429 ],
4430 }
4431
4432 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004433 name: "mylib.arm64",
4434 srcs: ["mylib.cpp"],
4435 system_shared_libs: [],
4436 stl: "none",
4437 // TODO: remove //apex_available:platform
4438 apex_available: [
4439 "//apex_available:platform",
4440 "myapex",
4441 ],
4442 }
4443
4444 cc_library {
4445 name: "mylib.x64",
4446 srcs: ["mylib.cpp"],
4447 system_shared_libs: [],
4448 stl: "none",
4449 // TODO: remove //apex_available:platform
4450 apex_available: [
4451 "//apex_available:platform",
4452 "myapex",
4453 ],
4454 }
4455 `)
4456
4457 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4458 copyCmds := apexRule.Args["copy_commands"]
4459
4460 // Ensure that apex variant is created for the direct dep
4461 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004462 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004463 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4464
4465 // Ensure that both direct and indirect deps are copied into apex
4466 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4467 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4468}
4469
Jiyong Park04480cf2019-02-06 00:16:29 +09004470func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004471 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004472 apex {
4473 name: "myapex",
4474 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004475 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004476 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004477 }
4478
4479 apex_key {
4480 name: "myapex.key",
4481 public_key: "testkey.avbpubkey",
4482 private_key: "testkey.pem",
4483 }
4484
4485 sh_binary {
4486 name: "myscript",
4487 src: "mylib.cpp",
4488 filename: "myscript.sh",
4489 sub_dir: "script",
4490 }
4491 `)
4492
Sundong Ahnabb64432019-10-22 13:58:29 +09004493 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004494 copyCmds := apexRule.Args["copy_commands"]
4495
4496 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4497}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004498
Jooyung Han91df2082019-11-20 01:49:42 +09004499func TestApexInVariousPartition(t *testing.T) {
4500 testcases := []struct {
4501 propName, parition, flattenedPartition string
4502 }{
4503 {"", "system", "system_ext"},
4504 {"product_specific: true", "product", "product"},
4505 {"soc_specific: true", "vendor", "vendor"},
4506 {"proprietary: true", "vendor", "vendor"},
4507 {"vendor: true", "vendor", "vendor"},
4508 {"system_ext_specific: true", "system_ext", "system_ext"},
4509 }
4510 for _, tc := range testcases {
4511 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004512 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004513 apex {
4514 name: "myapex",
4515 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004516 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004517 `+tc.propName+`
4518 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004519
Jooyung Han91df2082019-11-20 01:49:42 +09004520 apex_key {
4521 name: "myapex.key",
4522 public_key: "testkey.avbpubkey",
4523 private_key: "testkey.pem",
4524 }
4525 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004526
Jooyung Han91df2082019-11-20 01:49:42 +09004527 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004528 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4529 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004530 if actual != expected {
4531 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4532 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004533
Jooyung Han91df2082019-11-20 01:49:42 +09004534 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004535 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4536 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004537 if actual != expected {
4538 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4539 }
4540 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004541 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004542}
Jiyong Park67882562019-03-21 01:11:21 +09004543
Jooyung Han580eb4f2020-06-24 19:33:06 +09004544func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004545 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004546 apex {
4547 name: "myapex",
4548 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004549 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004550 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004551
Jooyung Han580eb4f2020-06-24 19:33:06 +09004552 apex_key {
4553 name: "myapex.key",
4554 public_key: "testkey.avbpubkey",
4555 private_key: "testkey.pem",
4556 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004557 `)
4558 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004559 rule := module.Output("file_contexts")
4560 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4561}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004562
Jooyung Han580eb4f2020-06-24 19:33:06 +09004563func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004564 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004565 apex {
4566 name: "myapex",
4567 key: "myapex.key",
4568 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004569 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004570 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004571
Jooyung Han580eb4f2020-06-24 19:33:06 +09004572 apex_key {
4573 name: "myapex.key",
4574 public_key: "testkey.avbpubkey",
4575 private_key: "testkey.pem",
4576 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004577 `, withFiles(map[string][]byte{
4578 "my_own_file_contexts": nil,
4579 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004580}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004581
Jooyung Han580eb4f2020-06-24 19:33:06 +09004582func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004583 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004584 apex {
4585 name: "myapex",
4586 key: "myapex.key",
4587 product_specific: true,
4588 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004589 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004590 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004591
Jooyung Han580eb4f2020-06-24 19:33:06 +09004592 apex_key {
4593 name: "myapex.key",
4594 public_key: "testkey.avbpubkey",
4595 private_key: "testkey.pem",
4596 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004597 `)
4598
Colin Cross1c460562021-02-16 17:55:47 -08004599 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004600 apex {
4601 name: "myapex",
4602 key: "myapex.key",
4603 product_specific: true,
4604 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004605 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004606 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004607
Jooyung Han580eb4f2020-06-24 19:33:06 +09004608 apex_key {
4609 name: "myapex.key",
4610 public_key: "testkey.avbpubkey",
4611 private_key: "testkey.pem",
4612 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004613 `, withFiles(map[string][]byte{
4614 "product_specific_file_contexts": nil,
4615 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004616 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4617 rule := module.Output("file_contexts")
4618 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4619}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004620
Jooyung Han580eb4f2020-06-24 19:33:06 +09004621func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004622 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004623 apex {
4624 name: "myapex",
4625 key: "myapex.key",
4626 product_specific: true,
4627 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004628 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004629 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004630
Jooyung Han580eb4f2020-06-24 19:33:06 +09004631 apex_key {
4632 name: "myapex.key",
4633 public_key: "testkey.avbpubkey",
4634 private_key: "testkey.pem",
4635 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004636
Jooyung Han580eb4f2020-06-24 19:33:06 +09004637 filegroup {
4638 name: "my-file-contexts",
4639 srcs: ["product_specific_file_contexts"],
4640 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004641 `, withFiles(map[string][]byte{
4642 "product_specific_file_contexts": nil,
4643 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004644 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4645 rule := module.Output("file_contexts")
4646 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004647}
4648
Jiyong Park67882562019-03-21 01:11:21 +09004649func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004650 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004651 apex_key {
4652 name: "myapex.key",
4653 public_key: ":my.avbpubkey",
4654 private_key: ":my.pem",
4655 product_specific: true,
4656 }
4657
4658 filegroup {
4659 name: "my.avbpubkey",
4660 srcs: ["testkey2.avbpubkey"],
4661 }
4662
4663 filegroup {
4664 name: "my.pem",
4665 srcs: ["testkey2.pem"],
4666 }
4667 `)
4668
4669 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4670 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004671 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004672 if actual_pubkey != expected_pubkey {
4673 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4674 }
4675 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004676 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004677 if actual_privkey != expected_privkey {
4678 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4679 }
4680}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004681
4682func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004683 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004684 prebuilt_apex {
4685 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004686 arch: {
4687 arm64: {
4688 src: "myapex-arm64.apex",
4689 },
4690 arm: {
4691 src: "myapex-arm.apex",
4692 },
4693 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004694 }
4695 `)
4696
Wei Li340ee8e2022-03-18 17:33:24 -07004697 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4698 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004699
Jiyong Parkc95714e2019-03-29 14:23:10 +09004700 expectedInput := "myapex-arm64.apex"
4701 if prebuilt.inputApex.String() != expectedInput {
4702 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4703 }
Wei Li340ee8e2022-03-18 17:33:24 -07004704 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4705 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4706 rule := testingModule.Rule("genProvenanceMetaData")
4707 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4708 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4709 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4710 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004711}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004712
Paul Duffinc0609c62021-03-01 17:27:16 +00004713func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004714 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004715 prebuilt_apex {
4716 name: "myapex",
4717 }
4718 `)
4719}
4720
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004721func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004722 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004723 prebuilt_apex {
4724 name: "myapex",
4725 src: "myapex-arm.apex",
4726 filename: "notmyapex.apex",
4727 }
4728 `)
4729
Wei Li340ee8e2022-03-18 17:33:24 -07004730 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4731 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004732
4733 expected := "notmyapex.apex"
4734 if p.installFilename != expected {
4735 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4736 }
Wei Li340ee8e2022-03-18 17:33:24 -07004737 rule := testingModule.Rule("genProvenanceMetaData")
4738 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4739 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4740 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4741 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004742}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004743
Samiul Islam7c02e262021-09-08 17:48:28 +01004744func TestApexSetFilenameOverride(t *testing.T) {
4745 testApex(t, `
4746 apex_set {
4747 name: "com.company.android.myapex",
4748 apex_name: "com.android.myapex",
4749 set: "company-myapex.apks",
4750 filename: "com.company.android.myapex.apex"
4751 }
4752 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4753
4754 testApex(t, `
4755 apex_set {
4756 name: "com.company.android.myapex",
4757 apex_name: "com.android.myapex",
4758 set: "company-myapex.apks",
4759 filename: "com.company.android.myapex.capex"
4760 }
4761 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4762
4763 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4764 apex_set {
4765 name: "com.company.android.myapex",
4766 apex_name: "com.android.myapex",
4767 set: "company-myapex.apks",
4768 filename: "some-random-suffix"
4769 }
4770 `)
4771}
4772
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004773func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004774 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004775 prebuilt_apex {
4776 name: "myapex.prebuilt",
4777 src: "myapex-arm.apex",
4778 overrides: [
4779 "myapex",
4780 ],
4781 }
4782 `)
4783
Wei Li340ee8e2022-03-18 17:33:24 -07004784 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4785 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004786
4787 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004788 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004789 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004790 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004791 }
Wei Li340ee8e2022-03-18 17:33:24 -07004792 rule := testingModule.Rule("genProvenanceMetaData")
4793 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4794 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4795 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4796 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004797}
4798
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004799func TestPrebuiltApexName(t *testing.T) {
4800 testApex(t, `
4801 prebuilt_apex {
4802 name: "com.company.android.myapex",
4803 apex_name: "com.android.myapex",
4804 src: "company-myapex-arm.apex",
4805 }
4806 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4807
4808 testApex(t, `
4809 apex_set {
4810 name: "com.company.android.myapex",
4811 apex_name: "com.android.myapex",
4812 set: "company-myapex.apks",
4813 }
4814 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4815}
4816
4817func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4818 _ = android.GroupFixturePreparers(
4819 java.PrepareForTestWithJavaDefaultModules,
4820 PrepareForTestWithApexBuildComponents,
4821 android.FixtureWithRootAndroidBp(`
4822 platform_bootclasspath {
4823 name: "platform-bootclasspath",
4824 fragments: [
4825 {
4826 apex: "com.android.art",
4827 module: "art-bootclasspath-fragment",
4828 },
4829 ],
4830 }
4831
4832 prebuilt_apex {
4833 name: "com.company.android.art",
4834 apex_name: "com.android.art",
4835 src: "com.company.android.art-arm.apex",
4836 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4837 }
4838
4839 prebuilt_bootclasspath_fragment {
4840 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004841 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004842 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004843 hidden_api: {
4844 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4845 metadata: "my-bootclasspath-fragment/metadata.csv",
4846 index: "my-bootclasspath-fragment/index.csv",
4847 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4848 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4849 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004850 }
4851
4852 java_import {
4853 name: "core-oj",
4854 jars: ["prebuilt.jar"],
4855 }
4856 `),
4857 ).RunTest(t)
4858}
4859
Paul Duffin092153d2021-01-26 11:42:39 +00004860// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4861// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004862func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004863 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004864
Paul Duffin89886cb2021-02-05 16:44:03 +00004865 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004866 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004867 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004868 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004869 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004870 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004871 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4872 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4873 android.NormalizePathForTesting(dexJarBuildPath))
4874 }
4875
4876 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004877 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004878 // Make sure the import has been given the correct path to the dex jar.
4879 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4880 dexJarBuildPath := p.DexJarInstallPath()
4881 stem := android.RemoveOptionalPrebuiltPrefix(name)
4882 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4883 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4884 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004885 }
4886
Paul Duffin39853512021-02-26 11:09:39 +00004887 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004888 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004889 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004890 android.AssertArrayString(t, "Check if there is no source variant",
4891 []string{"android_common"},
4892 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004893 }
4894
4895 t.Run("prebuilt only", func(t *testing.T) {
4896 bp := `
4897 prebuilt_apex {
4898 name: "myapex",
4899 arch: {
4900 arm64: {
4901 src: "myapex-arm64.apex",
4902 },
4903 arm: {
4904 src: "myapex-arm.apex",
4905 },
4906 },
Paul Duffin39853512021-02-26 11:09:39 +00004907 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004908 }
4909
4910 java_import {
4911 name: "libfoo",
4912 jars: ["libfoo.jar"],
4913 }
Paul Duffin39853512021-02-26 11:09:39 +00004914
4915 java_sdk_library_import {
4916 name: "libbar",
4917 public: {
4918 jars: ["libbar.jar"],
4919 },
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
Martin Stjernholm44825602021-09-17 01:44:12 +01004926 deapexerName := deapexerModuleName("myapex")
4927 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4928
Paul Duffinf6932af2021-02-26 18:21:56 +00004929 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004930 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004931 rule := deapexer.Rule("deapexer")
4932 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4933 t.Errorf("expected: %q, found: %q", expected, actual)
4934 }
4935
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004936 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004937 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004938 rule = prebuiltApex.Rule("android/soong/android.Cp")
4939 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4940 t.Errorf("expected: %q, found: %q", expected, actual)
4941 }
4942
Paul Duffin89886cb2021-02-05 16:44:03 +00004943 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004944 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004945
4946 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004947 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004948 })
4949
4950 t.Run("prebuilt with source preferred", func(t *testing.T) {
4951
4952 bp := `
4953 prebuilt_apex {
4954 name: "myapex",
4955 arch: {
4956 arm64: {
4957 src: "myapex-arm64.apex",
4958 },
4959 arm: {
4960 src: "myapex-arm.apex",
4961 },
4962 },
Paul Duffin39853512021-02-26 11:09:39 +00004963 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004964 }
4965
4966 java_import {
4967 name: "libfoo",
4968 jars: ["libfoo.jar"],
4969 }
4970
4971 java_library {
4972 name: "libfoo",
4973 }
Paul Duffin39853512021-02-26 11:09:39 +00004974
4975 java_sdk_library_import {
4976 name: "libbar",
4977 public: {
4978 jars: ["libbar.jar"],
4979 },
4980 }
4981
4982 java_sdk_library {
4983 name: "libbar",
4984 srcs: ["foo/bar/MyClass.java"],
4985 unsafe_ignore_missing_latest_api: true,
4986 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004987 `
4988
4989 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4990 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4991
Paul Duffin89886cb2021-02-05 16:44:03 +00004992 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004993 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004994 ensureNoSourceVariant(t, ctx, "libfoo")
4995
4996 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004997 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004998 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004999 })
5000
5001 t.Run("prebuilt preferred with source", func(t *testing.T) {
5002 bp := `
5003 prebuilt_apex {
5004 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005005 arch: {
5006 arm64: {
5007 src: "myapex-arm64.apex",
5008 },
5009 arm: {
5010 src: "myapex-arm.apex",
5011 },
5012 },
Paul Duffin39853512021-02-26 11:09:39 +00005013 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005014 }
5015
5016 java_import {
5017 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005018 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005019 jars: ["libfoo.jar"],
5020 }
5021
5022 java_library {
5023 name: "libfoo",
5024 }
Paul Duffin39853512021-02-26 11:09:39 +00005025
5026 java_sdk_library_import {
5027 name: "libbar",
5028 prefer: true,
5029 public: {
5030 jars: ["libbar.jar"],
5031 },
5032 }
5033
5034 java_sdk_library {
5035 name: "libbar",
5036 srcs: ["foo/bar/MyClass.java"],
5037 unsafe_ignore_missing_latest_api: true,
5038 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005039 `
5040
5041 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5042 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5043
Paul Duffin89886cb2021-02-05 16:44:03 +00005044 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005045 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005046 ensureNoSourceVariant(t, ctx, "libfoo")
5047
5048 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005049 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005050 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005051 })
5052}
5053
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005054func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005055 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005056 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005057 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5058 // is disabled.
5059 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5060 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005061
Paul Duffin37856732021-02-26 14:24:15 +00005062 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5063 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005064 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005065 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005066 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005067 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005068 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005069 foundLibfooJar = true
5070 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005071 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005072 }
5073 }
5074 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005075 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 +00005076 }
5077 }
5078
Paul Duffin40a3f652021-07-19 13:11:24 +01005079 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005080 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005081 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005082 var rule android.TestingBuildParams
5083
5084 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5085 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005086 }
5087
Paul Duffin40a3f652021-07-19 13:11:24 +01005088 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5089 t.Helper()
5090 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5091 var rule android.TestingBuildParams
5092
5093 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5094 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5095 }
5096
Paul Duffin89f570a2021-06-16 01:42:33 +01005097 fragment := java.ApexVariantReference{
5098 Apex: proptools.StringPtr("myapex"),
5099 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5100 }
5101
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005102 t.Run("prebuilt only", func(t *testing.T) {
5103 bp := `
5104 prebuilt_apex {
5105 name: "myapex",
5106 arch: {
5107 arm64: {
5108 src: "myapex-arm64.apex",
5109 },
5110 arm: {
5111 src: "myapex-arm.apex",
5112 },
5113 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005114 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5115 }
5116
5117 prebuilt_bootclasspath_fragment {
5118 name: "my-bootclasspath-fragment",
5119 contents: ["libfoo", "libbar"],
5120 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005121 hidden_api: {
5122 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5123 metadata: "my-bootclasspath-fragment/metadata.csv",
5124 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005125 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5126 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5127 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005128 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005129 }
5130
5131 java_import {
5132 name: "libfoo",
5133 jars: ["libfoo.jar"],
5134 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005135 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005136 }
Paul Duffin37856732021-02-26 14:24:15 +00005137
5138 java_sdk_library_import {
5139 name: "libbar",
5140 public: {
5141 jars: ["libbar.jar"],
5142 },
5143 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005144 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005145 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005146 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005147 `
5148
Paul Duffin89f570a2021-06-16 01:42:33 +01005149 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005150 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5151 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005152
Paul Duffin537ea3d2021-05-14 10:38:00 +01005153 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005154 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005155 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005156 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005157 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5158 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005159 })
5160
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005161 t.Run("apex_set only", func(t *testing.T) {
5162 bp := `
5163 apex_set {
5164 name: "myapex",
5165 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005166 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5167 }
5168
5169 prebuilt_bootclasspath_fragment {
5170 name: "my-bootclasspath-fragment",
5171 contents: ["libfoo", "libbar"],
5172 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005173 hidden_api: {
5174 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5175 metadata: "my-bootclasspath-fragment/metadata.csv",
5176 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005177 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5178 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5179 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005180 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005181 }
5182
5183 java_import {
5184 name: "libfoo",
5185 jars: ["libfoo.jar"],
5186 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005187 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005188 }
5189
5190 java_sdk_library_import {
5191 name: "libbar",
5192 public: {
5193 jars: ["libbar.jar"],
5194 },
5195 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005196 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005197 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005198 }
5199 `
5200
Paul Duffin89f570a2021-06-16 01:42:33 +01005201 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005202 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5203 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5204
Paul Duffin537ea3d2021-05-14 10:38:00 +01005205 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005206 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005207 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005208 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005209 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5210 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005211 })
5212
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005213 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5214 bp := `
5215 prebuilt_apex {
5216 name: "myapex",
5217 arch: {
5218 arm64: {
5219 src: "myapex-arm64.apex",
5220 },
5221 arm: {
5222 src: "myapex-arm.apex",
5223 },
5224 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005225 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5226 }
5227
5228 prebuilt_bootclasspath_fragment {
5229 name: "my-bootclasspath-fragment",
5230 contents: ["libfoo", "libbar"],
5231 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005232 hidden_api: {
5233 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5234 metadata: "my-bootclasspath-fragment/metadata.csv",
5235 index: "my-bootclasspath-fragment/index.csv",
5236 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5237 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5238 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005239 }
5240
5241 java_import {
5242 name: "libfoo",
5243 jars: ["libfoo.jar"],
5244 apex_available: ["myapex"],
5245 }
5246
5247 java_library {
5248 name: "libfoo",
5249 srcs: ["foo/bar/MyClass.java"],
5250 apex_available: ["myapex"],
5251 }
Paul Duffin37856732021-02-26 14:24:15 +00005252
5253 java_sdk_library_import {
5254 name: "libbar",
5255 public: {
5256 jars: ["libbar.jar"],
5257 },
5258 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005259 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005260 }
5261
5262 java_sdk_library {
5263 name: "libbar",
5264 srcs: ["foo/bar/MyClass.java"],
5265 unsafe_ignore_missing_latest_api: true,
5266 apex_available: ["myapex"],
5267 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005268 `
5269
5270 // In this test the source (java_library) libfoo is active since the
5271 // prebuilt (java_import) defaults to prefer:false. However the
5272 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5273 // find the dex boot jar in it. We either need to disable the source libfoo
5274 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005275 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005276 // dexbootjar check is skipped if AllowMissingDependencies is true
5277 preparerAllowMissingDeps := android.GroupFixturePreparers(
5278 preparer,
5279 android.PrepareForTestWithAllowMissingDependencies,
5280 )
5281 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005282 })
5283
5284 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5285 bp := `
5286 prebuilt_apex {
5287 name: "myapex",
5288 arch: {
5289 arm64: {
5290 src: "myapex-arm64.apex",
5291 },
5292 arm: {
5293 src: "myapex-arm.apex",
5294 },
5295 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005296 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5297 }
5298
5299 prebuilt_bootclasspath_fragment {
5300 name: "my-bootclasspath-fragment",
5301 contents: ["libfoo", "libbar"],
5302 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005303 hidden_api: {
5304 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5305 metadata: "my-bootclasspath-fragment/metadata.csv",
5306 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005307 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5308 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5309 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005310 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005311 }
5312
5313 java_import {
5314 name: "libfoo",
5315 prefer: true,
5316 jars: ["libfoo.jar"],
5317 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005318 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005319 }
5320
5321 java_library {
5322 name: "libfoo",
5323 srcs: ["foo/bar/MyClass.java"],
5324 apex_available: ["myapex"],
5325 }
Paul Duffin37856732021-02-26 14:24:15 +00005326
5327 java_sdk_library_import {
5328 name: "libbar",
5329 prefer: true,
5330 public: {
5331 jars: ["libbar.jar"],
5332 },
5333 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005334 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005335 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005336 }
5337
5338 java_sdk_library {
5339 name: "libbar",
5340 srcs: ["foo/bar/MyClass.java"],
5341 unsafe_ignore_missing_latest_api: true,
5342 apex_available: ["myapex"],
5343 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005344 `
5345
Paul Duffin89f570a2021-06-16 01:42:33 +01005346 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005347 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5348 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005349
Paul Duffin537ea3d2021-05-14 10:38:00 +01005350 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005351 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005352 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005353 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005354 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5355 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005356 })
5357
5358 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5359 bp := `
5360 apex {
5361 name: "myapex",
5362 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005363 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005364 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005365 }
5366
5367 apex_key {
5368 name: "myapex.key",
5369 public_key: "testkey.avbpubkey",
5370 private_key: "testkey.pem",
5371 }
5372
5373 prebuilt_apex {
5374 name: "myapex",
5375 arch: {
5376 arm64: {
5377 src: "myapex-arm64.apex",
5378 },
5379 arm: {
5380 src: "myapex-arm.apex",
5381 },
5382 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005383 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5384 }
5385
5386 prebuilt_bootclasspath_fragment {
5387 name: "my-bootclasspath-fragment",
5388 contents: ["libfoo", "libbar"],
5389 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005390 hidden_api: {
5391 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5392 metadata: "my-bootclasspath-fragment/metadata.csv",
5393 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005394 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5395 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5396 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005397 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005398 }
5399
5400 java_import {
5401 name: "libfoo",
5402 jars: ["libfoo.jar"],
5403 apex_available: ["myapex"],
5404 }
5405
5406 java_library {
5407 name: "libfoo",
5408 srcs: ["foo/bar/MyClass.java"],
5409 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005410 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005411 }
Paul Duffin37856732021-02-26 14:24:15 +00005412
5413 java_sdk_library_import {
5414 name: "libbar",
5415 public: {
5416 jars: ["libbar.jar"],
5417 },
5418 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005419 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005420 }
5421
5422 java_sdk_library {
5423 name: "libbar",
5424 srcs: ["foo/bar/MyClass.java"],
5425 unsafe_ignore_missing_latest_api: true,
5426 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005427 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005428 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005429 `
5430
Paul Duffin89f570a2021-06-16 01:42:33 +01005431 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005432 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5433 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005434
Paul Duffin537ea3d2021-05-14 10:38:00 +01005435 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005436 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005437 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005438 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005439 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5440 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005441 })
5442
5443 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5444 bp := `
5445 apex {
5446 name: "myapex",
5447 enabled: false,
5448 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005449 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005450 }
5451
5452 apex_key {
5453 name: "myapex.key",
5454 public_key: "testkey.avbpubkey",
5455 private_key: "testkey.pem",
5456 }
5457
5458 prebuilt_apex {
5459 name: "myapex",
5460 arch: {
5461 arm64: {
5462 src: "myapex-arm64.apex",
5463 },
5464 arm: {
5465 src: "myapex-arm.apex",
5466 },
5467 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005468 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5469 }
5470
5471 prebuilt_bootclasspath_fragment {
5472 name: "my-bootclasspath-fragment",
5473 contents: ["libfoo", "libbar"],
5474 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005475 hidden_api: {
5476 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5477 metadata: "my-bootclasspath-fragment/metadata.csv",
5478 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005479 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5480 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5481 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005482 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005483 }
5484
5485 java_import {
5486 name: "libfoo",
5487 prefer: true,
5488 jars: ["libfoo.jar"],
5489 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005490 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005491 }
5492
5493 java_library {
5494 name: "libfoo",
5495 srcs: ["foo/bar/MyClass.java"],
5496 apex_available: ["myapex"],
5497 }
Paul Duffin37856732021-02-26 14:24:15 +00005498
5499 java_sdk_library_import {
5500 name: "libbar",
5501 prefer: true,
5502 public: {
5503 jars: ["libbar.jar"],
5504 },
5505 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005506 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005507 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005508 }
5509
5510 java_sdk_library {
5511 name: "libbar",
5512 srcs: ["foo/bar/MyClass.java"],
5513 unsafe_ignore_missing_latest_api: true,
5514 apex_available: ["myapex"],
5515 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005516 `
5517
Paul Duffin89f570a2021-06-16 01:42:33 +01005518 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005519 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5520 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005521
Paul Duffin537ea3d2021-05-14 10:38:00 +01005522 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005523 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005524 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005525 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005526 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5527 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005528 })
5529}
5530
Roland Levillain630846d2019-06-26 12:48:34 +01005531func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005532 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005533 apex_test {
5534 name: "myapex",
5535 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005536 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005537 tests: [
5538 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005539 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005540 ],
5541 }
5542
5543 apex_key {
5544 name: "myapex.key",
5545 public_key: "testkey.avbpubkey",
5546 private_key: "testkey.pem",
5547 }
5548
Liz Kammer1c14a212020-05-12 15:26:55 -07005549 filegroup {
5550 name: "fg",
5551 srcs: [
5552 "baz",
5553 "bar/baz"
5554 ],
5555 }
5556
Roland Levillain630846d2019-06-26 12:48:34 +01005557 cc_test {
5558 name: "mytest",
5559 gtest: false,
5560 srcs: ["mytest.cpp"],
5561 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005562 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005563 system_shared_libs: [],
5564 static_executable: true,
5565 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005566 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005567 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005568
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005569 cc_library {
5570 name: "mylib",
5571 srcs: ["mylib.cpp"],
5572 system_shared_libs: [],
5573 stl: "none",
5574 }
5575
Liz Kammer5bd365f2020-05-27 15:15:11 -07005576 filegroup {
5577 name: "fg2",
5578 srcs: [
5579 "testdata/baz"
5580 ],
5581 }
5582
Roland Levillain9b5fde92019-06-28 15:41:19 +01005583 cc_test {
5584 name: "mytests",
5585 gtest: false,
5586 srcs: [
5587 "mytest1.cpp",
5588 "mytest2.cpp",
5589 "mytest3.cpp",
5590 ],
5591 test_per_src: true,
5592 relative_install_path: "test",
5593 system_shared_libs: [],
5594 static_executable: true,
5595 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005596 data: [
5597 ":fg",
5598 ":fg2",
5599 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005600 }
Roland Levillain630846d2019-06-26 12:48:34 +01005601 `)
5602
Sundong Ahnabb64432019-10-22 13:58:29 +09005603 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005604 copyCmds := apexRule.Args["copy_commands"]
5605
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005606 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005607 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005608 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005609
Liz Kammer1c14a212020-05-12 15:26:55 -07005610 //Ensure that test data are copied into apex.
5611 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5612 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5613
Roland Levillain9b5fde92019-06-28 15:41:19 +01005614 // Ensure that test deps built with `test_per_src` are copied into apex.
5615 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5616 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5617 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005618
5619 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005620 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005621 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005622 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005623 prefix := "TARGET_"
5624 var builder strings.Builder
5625 data.Custom(&builder, name, prefix, "", data)
5626 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005627 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5628 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5629 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5630 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005631 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005632 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005633 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005634
5635 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005636 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005637 data.Custom(&builder, name, prefix, "", data)
5638 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005639 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5640 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005641}
5642
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005643func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005644 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005645 apex {
5646 name: "myapex",
5647 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005648 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005649 }
5650 apex_key {
5651 name: "myapex.key",
5652 public_key: "testkey.avbpubkey",
5653 private_key: "testkey.pem",
5654 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005655 `,
5656 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5657 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5658 }),
5659 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005660 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005661 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005662 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005663 var builder strings.Builder
5664 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5665 androidMk := builder.String()
5666 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5667}
5668
Jooyung Hand48f3c32019-08-23 11:18:57 +09005669func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5670 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5671 apex {
5672 name: "myapex",
5673 key: "myapex.key",
5674 native_shared_libs: ["libfoo"],
5675 }
5676
5677 apex_key {
5678 name: "myapex.key",
5679 public_key: "testkey.avbpubkey",
5680 private_key: "testkey.pem",
5681 }
5682
5683 cc_library {
5684 name: "libfoo",
5685 stl: "none",
5686 system_shared_libs: [],
5687 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005688 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005689 }
5690 `)
5691 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5692 apex {
5693 name: "myapex",
5694 key: "myapex.key",
5695 java_libs: ["myjar"],
5696 }
5697
5698 apex_key {
5699 name: "myapex.key",
5700 public_key: "testkey.avbpubkey",
5701 private_key: "testkey.pem",
5702 }
5703
5704 java_library {
5705 name: "myjar",
5706 srcs: ["foo/bar/MyClass.java"],
5707 sdk_version: "none",
5708 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005709 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005710 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005711 }
5712 `)
5713}
5714
Bill Peckhama41a6962021-01-11 10:58:54 -08005715func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005716 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005717 apex {
5718 name: "myapex",
5719 key: "myapex.key",
5720 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005721 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005722 }
5723
5724 apex_key {
5725 name: "myapex.key",
5726 public_key: "testkey.avbpubkey",
5727 private_key: "testkey.pem",
5728 }
5729
5730 java_import {
5731 name: "myjavaimport",
5732 apex_available: ["myapex"],
5733 jars: ["my.jar"],
5734 compile_dex: true,
5735 }
5736 `)
5737
5738 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5739 apexRule := module.Rule("apexRule")
5740 copyCmds := apexRule.Args["copy_commands"]
5741 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5742}
5743
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005744func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005745 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005746 apex {
5747 name: "myapex",
5748 key: "myapex.key",
5749 apps: [
5750 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005751 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005752 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005753 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005754 }
5755
5756 apex_key {
5757 name: "myapex.key",
5758 public_key: "testkey.avbpubkey",
5759 private_key: "testkey.pem",
5760 }
5761
5762 android_app {
5763 name: "AppFoo",
5764 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005765 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005766 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005767 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005768 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005769 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005770 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005771
5772 android_app {
5773 name: "AppFooPriv",
5774 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005775 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005776 system_modules: "none",
5777 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005778 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005779 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005780 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005781
5782 cc_library_shared {
5783 name: "libjni",
5784 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005785 shared_libs: ["libfoo"],
5786 stl: "none",
5787 system_shared_libs: [],
5788 apex_available: [ "myapex" ],
5789 sdk_version: "current",
5790 }
5791
5792 cc_library_shared {
5793 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005794 stl: "none",
5795 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005796 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005797 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005798 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005799 `)
5800
Sundong Ahnabb64432019-10-22 13:58:29 +09005801 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005802 apexRule := module.Rule("apexRule")
5803 copyCmds := apexRule.Args["copy_commands"]
5804
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005805 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5806 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005807
Colin Crossaede88c2020-08-11 12:17:01 -07005808 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005809 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005810 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005811 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005812 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005813 // JNI libraries including transitive deps are
5814 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005815 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005816 // ... embedded inside APK (jnilibs.zip)
5817 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5818 // ... and not directly inside the APEX
5819 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5820 }
Dario Frenicde2a032019-10-27 00:29:22 +01005821}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005822
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005823func TestApexWithAppImportBuildId(t *testing.T) {
5824 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5825 for _, id := range invalidBuildIds {
5826 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5827 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5828 variables.BuildId = proptools.StringPtr(id)
5829 })
5830 testApexError(t, message, `apex {
5831 name: "myapex",
5832 key: "myapex.key",
5833 apps: ["AppFooPrebuilt"],
5834 updatable: false,
5835 }
5836
5837 apex_key {
5838 name: "myapex.key",
5839 public_key: "testkey.avbpubkey",
5840 private_key: "testkey.pem",
5841 }
5842
5843 android_app_import {
5844 name: "AppFooPrebuilt",
5845 apk: "PrebuiltAppFoo.apk",
5846 presigned: true,
5847 apex_available: ["myapex"],
5848 }
5849 `, fixture)
5850 }
5851}
5852
Dario Frenicde2a032019-10-27 00:29:22 +01005853func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005854 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005855 apex {
5856 name: "myapex",
5857 key: "myapex.key",
5858 apps: [
5859 "AppFooPrebuilt",
5860 "AppFooPrivPrebuilt",
5861 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005862 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005863 }
5864
5865 apex_key {
5866 name: "myapex.key",
5867 public_key: "testkey.avbpubkey",
5868 private_key: "testkey.pem",
5869 }
5870
5871 android_app_import {
5872 name: "AppFooPrebuilt",
5873 apk: "PrebuiltAppFoo.apk",
5874 presigned: true,
5875 dex_preopt: {
5876 enabled: false,
5877 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005878 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005879 }
5880
5881 android_app_import {
5882 name: "AppFooPrivPrebuilt",
5883 apk: "PrebuiltAppFooPriv.apk",
5884 privileged: true,
5885 presigned: true,
5886 dex_preopt: {
5887 enabled: false,
5888 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005889 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005890 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005891 }
5892 `)
5893
Sundong Ahnabb64432019-10-22 13:58:29 +09005894 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005895 apexRule := module.Rule("apexRule")
5896 copyCmds := apexRule.Args["copy_commands"]
5897
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005898 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5899 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005900}
5901
5902func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005903 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005904 apex {
5905 name: "myapex",
5906 key: "myapex.key",
5907 apps: [
5908 "AppFoo",
5909 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005910 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005911 }
5912
5913 apex_key {
5914 name: "myapex.key",
5915 public_key: "testkey.avbpubkey",
5916 private_key: "testkey.pem",
5917 }
5918
5919 android_app {
5920 name: "AppFoo",
5921 srcs: ["foo/bar/MyClass.java"],
5922 sdk_version: "none",
5923 system_modules: "none",
5924 apex_available: [ "myapex" ],
5925 }
5926
5927 android_app_import {
5928 name: "AppFoo",
5929 apk: "AppFooPrebuilt.apk",
5930 filename: "AppFooPrebuilt.apk",
5931 presigned: true,
5932 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005933 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005934 }
5935 `, withFiles(map[string][]byte{
5936 "AppFooPrebuilt.apk": nil,
5937 }))
5938
5939 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005940 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005941 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005942}
5943
Dario Freni6f3937c2019-12-20 22:58:03 +00005944func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005945 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005946 apex {
5947 name: "myapex",
5948 key: "myapex.key",
5949 apps: [
5950 "TesterHelpAppFoo",
5951 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005952 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005953 }
5954
5955 apex_key {
5956 name: "myapex.key",
5957 public_key: "testkey.avbpubkey",
5958 private_key: "testkey.pem",
5959 }
5960
5961 android_test_helper_app {
5962 name: "TesterHelpAppFoo",
5963 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005964 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005965 }
5966
5967 `)
5968
5969 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5970 apexRule := module.Rule("apexRule")
5971 copyCmds := apexRule.Args["copy_commands"]
5972
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005973 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00005974}
5975
Jooyung Han18020ea2019-11-13 10:50:48 +09005976func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5977 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005978 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005979 apex {
5980 name: "myapex",
5981 key: "myapex.key",
5982 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005983 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005984 }
5985
5986 apex_key {
5987 name: "myapex.key",
5988 public_key: "testkey.avbpubkey",
5989 private_key: "testkey.pem",
5990 }
5991
5992 apex {
5993 name: "otherapex",
5994 key: "myapex.key",
5995 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005996 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005997 }
5998
5999 cc_defaults {
6000 name: "libfoo-defaults",
6001 apex_available: ["otherapex"],
6002 }
6003
6004 cc_library {
6005 name: "libfoo",
6006 defaults: ["libfoo-defaults"],
6007 stl: "none",
6008 system_shared_libs: [],
6009 }`)
6010}
6011
Paul Duffine52e66f2020-03-30 17:54:29 +01006012func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006013 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006014 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006015 apex {
6016 name: "myapex",
6017 key: "myapex.key",
6018 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006019 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006020 }
6021
6022 apex_key {
6023 name: "myapex.key",
6024 public_key: "testkey.avbpubkey",
6025 private_key: "testkey.pem",
6026 }
6027
6028 apex {
6029 name: "otherapex",
6030 key: "otherapex.key",
6031 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006032 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006033 }
6034
6035 apex_key {
6036 name: "otherapex.key",
6037 public_key: "testkey.avbpubkey",
6038 private_key: "testkey.pem",
6039 }
6040
6041 cc_library {
6042 name: "libfoo",
6043 stl: "none",
6044 system_shared_libs: [],
6045 apex_available: ["otherapex"],
6046 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006047}
Jiyong Park127b40b2019-09-30 16:04:35 +09006048
Paul Duffine52e66f2020-03-30 17:54:29 +01006049func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006050 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006051 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006052.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006053.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006054.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006055.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006056.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006057.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006058 apex {
6059 name: "myapex",
6060 key: "myapex.key",
6061 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006062 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006063 }
6064
6065 apex_key {
6066 name: "myapex.key",
6067 public_key: "testkey.avbpubkey",
6068 private_key: "testkey.pem",
6069 }
6070
Jiyong Park127b40b2019-09-30 16:04:35 +09006071 cc_library {
6072 name: "libfoo",
6073 stl: "none",
6074 shared_libs: ["libbar"],
6075 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006076 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006077 }
6078
6079 cc_library {
6080 name: "libbar",
6081 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006082 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006083 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006084 apex_available: ["myapex"],
6085 }
6086
6087 cc_library {
6088 name: "libbaz",
6089 stl: "none",
6090 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006091 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006092}
Jiyong Park127b40b2019-09-30 16:04:35 +09006093
Paul Duffine52e66f2020-03-30 17:54:29 +01006094func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006095 testApexError(t, "\"otherapex\" is not a valid module name", `
6096 apex {
6097 name: "myapex",
6098 key: "myapex.key",
6099 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006100 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006101 }
6102
6103 apex_key {
6104 name: "myapex.key",
6105 public_key: "testkey.avbpubkey",
6106 private_key: "testkey.pem",
6107 }
6108
6109 cc_library {
6110 name: "libfoo",
6111 stl: "none",
6112 system_shared_libs: [],
6113 apex_available: ["otherapex"],
6114 }`)
6115
Paul Duffine52e66f2020-03-30 17:54:29 +01006116 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006117 apex {
6118 name: "myapex",
6119 key: "myapex.key",
6120 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006121 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006122 }
6123
6124 apex_key {
6125 name: "myapex.key",
6126 public_key: "testkey.avbpubkey",
6127 private_key: "testkey.pem",
6128 }
6129
6130 cc_library {
6131 name: "libfoo",
6132 stl: "none",
6133 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006134 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006135 apex_available: ["myapex"],
6136 }
6137
6138 cc_library {
6139 name: "libbar",
6140 stl: "none",
6141 system_shared_libs: [],
6142 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006143 }
6144
6145 cc_library {
6146 name: "libbaz",
6147 stl: "none",
6148 system_shared_libs: [],
6149 stubs: {
6150 versions: ["10", "20", "30"],
6151 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006152 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006153}
Jiyong Park127b40b2019-09-30 16:04:35 +09006154
Jiyong Park89e850a2020-04-07 16:37:39 +09006155func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006156 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006157 apex {
6158 name: "myapex",
6159 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006160 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006161 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006162 }
6163
6164 apex_key {
6165 name: "myapex.key",
6166 public_key: "testkey.avbpubkey",
6167 private_key: "testkey.pem",
6168 }
6169
6170 cc_library {
6171 name: "libfoo",
6172 stl: "none",
6173 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006174 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006175 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006176 }
6177
6178 cc_library {
6179 name: "libfoo2",
6180 stl: "none",
6181 system_shared_libs: [],
6182 shared_libs: ["libbaz"],
6183 apex_available: ["//apex_available:platform"],
6184 }
6185
6186 cc_library {
6187 name: "libbar",
6188 stl: "none",
6189 system_shared_libs: [],
6190 apex_available: ["myapex"],
6191 }
6192
6193 cc_library {
6194 name: "libbaz",
6195 stl: "none",
6196 system_shared_libs: [],
6197 apex_available: ["myapex"],
6198 stubs: {
6199 versions: ["1"],
6200 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006201 }`)
6202
Jiyong Park89e850a2020-04-07 16:37:39 +09006203 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6204 // because it depends on libbar which isn't available to platform
6205 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6206 if libfoo.NotAvailableForPlatform() != true {
6207 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6208 }
6209
6210 // libfoo2 however can be available to platform because it depends on libbaz which provides
6211 // stubs
6212 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6213 if libfoo2.NotAvailableForPlatform() == true {
6214 t.Errorf("%q should be available to platform", libfoo2.String())
6215 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006216}
Jiyong Parka90ca002019-10-07 15:47:24 +09006217
Paul Duffine52e66f2020-03-30 17:54:29 +01006218func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006219 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006220 apex {
6221 name: "myapex",
6222 key: "myapex.key",
6223 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006224 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006225 }
6226
6227 apex_key {
6228 name: "myapex.key",
6229 public_key: "testkey.avbpubkey",
6230 private_key: "testkey.pem",
6231 }
6232
6233 cc_library {
6234 name: "libfoo",
6235 stl: "none",
6236 system_shared_libs: [],
6237 apex_available: ["myapex"],
6238 static: {
6239 apex_available: ["//apex_available:platform"],
6240 },
6241 }`)
6242
Jiyong Park89e850a2020-04-07 16:37:39 +09006243 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6244 if libfooShared.NotAvailableForPlatform() != true {
6245 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6246 }
6247 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6248 if libfooStatic.NotAvailableForPlatform() != false {
6249 t.Errorf("%q should be available to platform", libfooStatic.String())
6250 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006251}
6252
Jiyong Park5d790c32019-11-15 18:40:32 +09006253func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006254 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006255 apex {
6256 name: "myapex",
6257 key: "myapex.key",
6258 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006259 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006260 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006261 bootclasspath_fragments: ["mybootclasspath_fragment"],
6262 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6263 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006264 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006265 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006266 }
6267
6268 override_apex {
6269 name: "override_myapex",
6270 base: "myapex",
6271 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006272 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006273 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006274 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6275 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6276 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006277 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006278 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006279 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006280 key: "mynewapex.key",
6281 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006282 }
6283
6284 apex_key {
6285 name: "myapex.key",
6286 public_key: "testkey.avbpubkey",
6287 private_key: "testkey.pem",
6288 }
6289
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006290 apex_key {
6291 name: "mynewapex.key",
6292 public_key: "testkey2.avbpubkey",
6293 private_key: "testkey2.pem",
6294 }
6295
6296 android_app_certificate {
6297 name: "myapex.certificate",
6298 certificate: "testkey",
6299 }
6300
Jiyong Park5d790c32019-11-15 18:40:32 +09006301 android_app {
6302 name: "app",
6303 srcs: ["foo/bar/MyClass.java"],
6304 package_name: "foo",
6305 sdk_version: "none",
6306 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006307 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006308 }
6309
6310 override_android_app {
6311 name: "override_app",
6312 base: "app",
6313 package_name: "bar",
6314 }
markchien7c803b82021-08-26 22:10:06 +08006315
6316 bpf {
6317 name: "bpf",
6318 srcs: ["bpf.c"],
6319 }
6320
6321 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006322 name: "overrideBpf",
6323 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006324 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006325
6326 prebuilt_etc {
6327 name: "myetc",
6328 src: "myprebuilt",
6329 }
6330
6331 prebuilt_etc {
6332 name: "override_myetc",
6333 src: "override_myprebuilt",
6334 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006335
6336 java_library {
6337 name: "bcplib",
6338 srcs: ["a.java"],
6339 compile_dex: true,
6340 apex_available: ["myapex"],
6341 permitted_packages: ["bcp.lib"],
6342 }
6343
6344 bootclasspath_fragment {
6345 name: "mybootclasspath_fragment",
6346 contents: ["bcplib"],
6347 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006348 hidden_api: {
6349 split_packages: ["*"],
6350 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006351 }
6352
6353 java_library {
6354 name: "override_bcplib",
6355 srcs: ["a.java"],
6356 compile_dex: true,
6357 apex_available: ["myapex"],
6358 permitted_packages: ["override.bcp.lib"],
6359 }
6360
6361 bootclasspath_fragment {
6362 name: "override_bootclasspath_fragment",
6363 contents: ["override_bcplib"],
6364 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01006365 hidden_api: {
6366 split_packages: ["*"],
6367 },
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006368 }
6369
6370 java_library {
6371 name: "systemserverlib",
6372 srcs: ["a.java"],
6373 apex_available: ["myapex"],
6374 }
6375
6376 systemserverclasspath_fragment {
6377 name: "mysystemserverclasspath_fragment",
6378 standalone_contents: ["systemserverlib"],
6379 apex_available: ["myapex"],
6380 }
6381
6382 java_library {
6383 name: "override_systemserverlib",
6384 srcs: ["a.java"],
6385 apex_available: ["myapex"],
6386 }
6387
6388 systemserverclasspath_fragment {
6389 name: "override_systemserverclasspath_fragment",
6390 standalone_contents: ["override_systemserverlib"],
6391 apex_available: ["myapex"],
6392 }
6393
6394 java_library {
6395 name: "myjava_library",
6396 srcs: ["a.java"],
6397 compile_dex: true,
6398 apex_available: ["myapex"],
6399 }
6400
6401 java_library {
6402 name: "override_java_library",
6403 srcs: ["a.java"],
6404 compile_dex: true,
6405 apex_available: ["myapex"],
6406 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006407 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006408
Jiyong Park317645e2019-12-05 13:20:58 +09006409 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6410 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6411 if originalVariant.GetOverriddenBy() != "" {
6412 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6413 }
6414 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6415 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6416 }
6417
Jiyong Park5d790c32019-11-15 18:40:32 +09006418 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6419 apexRule := module.Rule("apexRule")
6420 copyCmds := apexRule.Args["copy_commands"]
6421
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006422 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6423 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006424
markchien7c803b82021-08-26 22:10:06 +08006425 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006426 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006427
Daniel Norman5a3ce132021-08-26 15:44:43 -07006428 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6429 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6430
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006431 apexBundle := module.Module().(*apexBundle)
6432 name := apexBundle.Name()
6433 if name != "override_myapex" {
6434 t.Errorf("name should be \"override_myapex\", but was %q", name)
6435 }
6436
Baligh Uddin004d7172020-02-19 21:29:28 -08006437 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6438 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6439 }
6440
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006441 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6442 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6443 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6444 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6445 android.AssertArrayString(t, "Java_libs does not match",
6446 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6447
Jiyong Park20bacab2020-03-03 11:45:41 +09006448 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006449 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006450 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6451
6452 signApkRule := module.Rule("signapk")
6453 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006454
Colin Crossaa255532020-07-03 13:18:24 -07006455 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006456 var builder strings.Builder
6457 data.Custom(&builder, name, "TARGET_", "", data)
6458 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006459 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Ken Chen5372a242022-07-07 17:48:06 +08006460 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006461 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006462 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6463 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6464 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006465 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006466 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006467 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006468 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006469 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006470 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006471 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6472 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6473 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006474 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006475}
6476
Albert Martineefabcf2022-03-21 20:11:16 +00006477func TestMinSdkVersionOverride(t *testing.T) {
6478 // Override from 29 to 31
6479 minSdkOverride31 := "31"
6480 ctx := testApex(t, `
6481 apex {
6482 name: "myapex",
6483 key: "myapex.key",
6484 native_shared_libs: ["mylib"],
6485 updatable: true,
6486 min_sdk_version: "29"
6487 }
6488
6489 override_apex {
6490 name: "override_myapex",
6491 base: "myapex",
6492 logging_parent: "com.foo.bar",
6493 package_name: "test.overridden.package"
6494 }
6495
6496 apex_key {
6497 name: "myapex.key",
6498 public_key: "testkey.avbpubkey",
6499 private_key: "testkey.pem",
6500 }
6501
6502 cc_library {
6503 name: "mylib",
6504 srcs: ["mylib.cpp"],
6505 runtime_libs: ["libbar"],
6506 system_shared_libs: [],
6507 stl: "none",
6508 apex_available: [ "myapex" ],
6509 min_sdk_version: "apex_inherit"
6510 }
6511
6512 cc_library {
6513 name: "libbar",
6514 srcs: ["mylib.cpp"],
6515 system_shared_libs: [],
6516 stl: "none",
6517 apex_available: [ "myapex" ],
6518 min_sdk_version: "apex_inherit"
6519 }
6520
6521 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6522
6523 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6524 copyCmds := apexRule.Args["copy_commands"]
6525
6526 // Ensure that direct non-stubs dep is always included
6527 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6528
6529 // Ensure that runtime_libs dep in included
6530 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6531
6532 // Ensure libraries target overridden min_sdk_version value
6533 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6534}
6535
6536func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6537 // Attempt to override from 31 to 29, should be a NOOP
6538 minSdkOverride29 := "29"
6539 ctx := testApex(t, `
6540 apex {
6541 name: "myapex",
6542 key: "myapex.key",
6543 native_shared_libs: ["mylib"],
6544 updatable: true,
6545 min_sdk_version: "31"
6546 }
6547
6548 override_apex {
6549 name: "override_myapex",
6550 base: "myapex",
6551 logging_parent: "com.foo.bar",
6552 package_name: "test.overridden.package"
6553 }
6554
6555 apex_key {
6556 name: "myapex.key",
6557 public_key: "testkey.avbpubkey",
6558 private_key: "testkey.pem",
6559 }
6560
6561 cc_library {
6562 name: "mylib",
6563 srcs: ["mylib.cpp"],
6564 runtime_libs: ["libbar"],
6565 system_shared_libs: [],
6566 stl: "none",
6567 apex_available: [ "myapex" ],
6568 min_sdk_version: "apex_inherit"
6569 }
6570
6571 cc_library {
6572 name: "libbar",
6573 srcs: ["mylib.cpp"],
6574 system_shared_libs: [],
6575 stl: "none",
6576 apex_available: [ "myapex" ],
6577 min_sdk_version: "apex_inherit"
6578 }
6579
6580 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6581
6582 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6583 copyCmds := apexRule.Args["copy_commands"]
6584
6585 // Ensure that direct non-stubs dep is always included
6586 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6587
6588 // Ensure that runtime_libs dep in included
6589 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6590
6591 // Ensure libraries target the original min_sdk_version value rather than the overridden
6592 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6593}
6594
Jooyung Han214bf372019-11-12 13:03:50 +09006595func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006596 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006597 apex {
6598 name: "myapex",
6599 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006600 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006601 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006602 }
6603
6604 apex_key {
6605 name: "myapex.key",
6606 public_key: "testkey.avbpubkey",
6607 private_key: "testkey.pem",
6608 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006609
6610 cc_library {
6611 name: "mylib",
6612 srcs: ["mylib.cpp"],
6613 stl: "libc++",
6614 system_shared_libs: [],
6615 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006616 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006617 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006618 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006619
6620 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6621 args := module.Rule("apexRule").Args
6622 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006623 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006624
6625 // The copies of the libraries in the apex should have one more dependency than
6626 // the ones outside the apex, namely the unwinder. Ideally we should check
6627 // the dependency names directly here but for some reason the names are blank in
6628 // this test.
6629 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006630 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006631 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6632 if len(apexImplicits) != len(nonApexImplicits)+1 {
6633 t.Errorf("%q missing unwinder dep", lib)
6634 }
6635 }
Jooyung Han214bf372019-11-12 13:03:50 +09006636}
6637
Paul Duffine05480a2021-03-08 15:07:14 +00006638var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006639 "api/current.txt": nil,
6640 "api/removed.txt": nil,
6641 "api/system-current.txt": nil,
6642 "api/system-removed.txt": nil,
6643 "api/test-current.txt": nil,
6644 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006645
Anton Hanssondff2c782020-12-21 17:10:01 +00006646 "100/public/api/foo.txt": nil,
6647 "100/public/api/foo-removed.txt": nil,
6648 "100/system/api/foo.txt": nil,
6649 "100/system/api/foo-removed.txt": nil,
6650
Paul Duffineedc5d52020-06-12 17:46:39 +01006651 // For java_sdk_library_import
6652 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006653}
6654
Jooyung Han58f26ab2019-12-18 15:34:32 +09006655func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006656 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006657 apex {
6658 name: "myapex",
6659 key: "myapex.key",
6660 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006661 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006662 }
6663
6664 apex_key {
6665 name: "myapex.key",
6666 public_key: "testkey.avbpubkey",
6667 private_key: "testkey.pem",
6668 }
6669
6670 java_sdk_library {
6671 name: "foo",
6672 srcs: ["a.java"],
6673 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006674 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006675 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006676
6677 prebuilt_apis {
6678 name: "sdk",
6679 api_dirs: ["100"],
6680 }
Paul Duffin9b879592020-05-26 13:21:35 +01006681 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006682
6683 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006684 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006685 "javalib/foo.jar",
6686 "etc/permissions/foo.xml",
6687 })
6688 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006689 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006690 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 +09006691}
6692
Paul Duffin9b879592020-05-26 13:21:35 +01006693func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006694 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006695 apex {
6696 name: "myapex",
6697 key: "myapex.key",
6698 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006699 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006700 }
6701
6702 apex_key {
6703 name: "myapex.key",
6704 public_key: "testkey.avbpubkey",
6705 private_key: "testkey.pem",
6706 }
6707
6708 java_sdk_library {
6709 name: "foo",
6710 srcs: ["a.java"],
6711 api_packages: ["foo"],
6712 apex_available: ["myapex"],
6713 sdk_version: "none",
6714 system_modules: "none",
6715 }
6716
6717 java_library {
6718 name: "bar",
6719 srcs: ["a.java"],
6720 libs: ["foo"],
6721 apex_available: ["myapex"],
6722 sdk_version: "none",
6723 system_modules: "none",
6724 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006725
6726 prebuilt_apis {
6727 name: "sdk",
6728 api_dirs: ["100"],
6729 }
Paul Duffin9b879592020-05-26 13:21:35 +01006730 `, withFiles(filesForSdkLibrary))
6731
6732 // java_sdk_library installs both impl jar and permission XML
6733 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6734 "javalib/bar.jar",
6735 "javalib/foo.jar",
6736 "etc/permissions/foo.xml",
6737 })
6738
6739 // The bar library should depend on the implementation jar.
6740 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006741 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006742 t.Errorf("expected %q, found %#q", expected, actual)
6743 }
6744}
6745
6746func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006747 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006748 apex {
6749 name: "myapex",
6750 key: "myapex.key",
6751 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006752 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006753 }
6754
6755 apex_key {
6756 name: "myapex.key",
6757 public_key: "testkey.avbpubkey",
6758 private_key: "testkey.pem",
6759 }
6760
6761 java_sdk_library {
6762 name: "foo",
6763 srcs: ["a.java"],
6764 api_packages: ["foo"],
6765 apex_available: ["myapex"],
6766 sdk_version: "none",
6767 system_modules: "none",
6768 }
6769
6770 java_library {
6771 name: "bar",
6772 srcs: ["a.java"],
6773 libs: ["foo"],
6774 sdk_version: "none",
6775 system_modules: "none",
6776 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006777
6778 prebuilt_apis {
6779 name: "sdk",
6780 api_dirs: ["100"],
6781 }
Paul Duffin9b879592020-05-26 13:21:35 +01006782 `, withFiles(filesForSdkLibrary))
6783
6784 // java_sdk_library installs both impl jar and permission XML
6785 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6786 "javalib/foo.jar",
6787 "etc/permissions/foo.xml",
6788 })
6789
6790 // The bar library should depend on the stubs jar.
6791 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006792 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006793 t.Errorf("expected %q, found %#q", expected, actual)
6794 }
6795}
6796
Paul Duffineedc5d52020-06-12 17:46:39 +01006797func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006798 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006799 prebuilt_apis {
6800 name: "sdk",
6801 api_dirs: ["100"],
6802 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006803 withFiles(map[string][]byte{
6804 "apex/a.java": nil,
6805 "apex/apex_manifest.json": nil,
6806 "apex/Android.bp": []byte(`
6807 package {
6808 default_visibility: ["//visibility:private"],
6809 }
6810
6811 apex {
6812 name: "myapex",
6813 key: "myapex.key",
6814 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006815 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006816 }
6817
6818 apex_key {
6819 name: "myapex.key",
6820 public_key: "testkey.avbpubkey",
6821 private_key: "testkey.pem",
6822 }
6823
6824 java_library {
6825 name: "bar",
6826 srcs: ["a.java"],
6827 libs: ["foo"],
6828 apex_available: ["myapex"],
6829 sdk_version: "none",
6830 system_modules: "none",
6831 }
6832`),
6833 "source/a.java": nil,
6834 "source/api/current.txt": nil,
6835 "source/api/removed.txt": nil,
6836 "source/Android.bp": []byte(`
6837 package {
6838 default_visibility: ["//visibility:private"],
6839 }
6840
6841 java_sdk_library {
6842 name: "foo",
6843 visibility: ["//apex"],
6844 srcs: ["a.java"],
6845 api_packages: ["foo"],
6846 apex_available: ["myapex"],
6847 sdk_version: "none",
6848 system_modules: "none",
6849 public: {
6850 enabled: true,
6851 },
6852 }
6853`),
6854 "prebuilt/a.jar": nil,
6855 "prebuilt/Android.bp": []byte(`
6856 package {
6857 default_visibility: ["//visibility:private"],
6858 }
6859
6860 java_sdk_library_import {
6861 name: "foo",
6862 visibility: ["//apex", "//source"],
6863 apex_available: ["myapex"],
6864 prefer: true,
6865 public: {
6866 jars: ["a.jar"],
6867 },
6868 }
6869`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006870 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006871 )
6872
6873 // java_sdk_library installs both impl jar and permission XML
6874 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6875 "javalib/bar.jar",
6876 "javalib/foo.jar",
6877 "etc/permissions/foo.xml",
6878 })
6879
6880 // The bar library should depend on the implementation jar.
6881 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006882 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006883 t.Errorf("expected %q, found %#q", expected, actual)
6884 }
6885}
6886
6887func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6888 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6889 apex {
6890 name: "myapex",
6891 key: "myapex.key",
6892 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006893 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006894 }
6895
6896 apex_key {
6897 name: "myapex.key",
6898 public_key: "testkey.avbpubkey",
6899 private_key: "testkey.pem",
6900 }
6901
6902 java_sdk_library_import {
6903 name: "foo",
6904 apex_available: ["myapex"],
6905 prefer: true,
6906 public: {
6907 jars: ["a.jar"],
6908 },
6909 }
6910
6911 `, withFiles(filesForSdkLibrary))
6912}
6913
atrost6e126252020-01-27 17:01:16 +00006914func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006915 result := android.GroupFixturePreparers(
6916 prepareForApexTest,
6917 java.PrepareForTestWithPlatformCompatConfig,
6918 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006919 apex {
6920 name: "myapex",
6921 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006922 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006923 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006924 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006925 }
6926
6927 apex_key {
6928 name: "myapex.key",
6929 public_key: "testkey.avbpubkey",
6930 private_key: "testkey.pem",
6931 }
6932
6933 platform_compat_config {
6934 name: "myjar-platform-compat-config",
6935 src: ":myjar",
6936 }
6937
6938 java_library {
6939 name: "myjar",
6940 srcs: ["foo/bar/MyClass.java"],
6941 sdk_version: "none",
6942 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006943 apex_available: [ "myapex" ],
6944 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006945
6946 // Make sure that a preferred prebuilt does not affect the apex contents.
6947 prebuilt_platform_compat_config {
6948 name: "myjar-platform-compat-config",
6949 metadata: "compat-config/metadata.xml",
6950 prefer: true,
6951 }
atrost6e126252020-01-27 17:01:16 +00006952 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006953 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006954 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6955 "etc/compatconfig/myjar-platform-compat-config.xml",
6956 "javalib/myjar.jar",
6957 })
6958}
6959
Jiyong Park479321d2019-12-16 11:47:12 +09006960func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6961 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6962 apex {
6963 name: "myapex",
6964 key: "myapex.key",
6965 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006966 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006967 }
6968
6969 apex_key {
6970 name: "myapex.key",
6971 public_key: "testkey.avbpubkey",
6972 private_key: "testkey.pem",
6973 }
6974
6975 java_library {
6976 name: "myjar",
6977 srcs: ["foo/bar/MyClass.java"],
6978 sdk_version: "none",
6979 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006980 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006981 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006982 }
6983 `)
6984}
6985
Jiyong Park7afd1072019-12-30 16:56:33 +09006986func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006987 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006988 apex {
6989 name: "myapex",
6990 key: "myapex.key",
6991 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006992 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006993 }
6994
6995 apex_key {
6996 name: "myapex.key",
6997 public_key: "testkey.avbpubkey",
6998 private_key: "testkey.pem",
6999 }
7000
7001 cc_library {
7002 name: "mylib",
7003 srcs: ["mylib.cpp"],
7004 system_shared_libs: [],
7005 stl: "none",
7006 required: ["a", "b"],
7007 host_required: ["c", "d"],
7008 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007009 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007010 }
7011 `)
7012
7013 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007014 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007015 name := apexBundle.BaseModuleName()
7016 prefix := "TARGET_"
7017 var builder strings.Builder
7018 data.Custom(&builder, name, prefix, "", data)
7019 androidMk := builder.String()
7020 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
7021 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
7022 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
7023}
7024
Jiyong Park7cd10e32020-01-14 09:22:18 +09007025func TestSymlinksFromApexToSystem(t *testing.T) {
7026 bp := `
7027 apex {
7028 name: "myapex",
7029 key: "myapex.key",
7030 native_shared_libs: ["mylib"],
7031 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007032 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007033 }
7034
Jiyong Park9d677202020-02-19 16:29:35 +09007035 apex {
7036 name: "myapex.updatable",
7037 key: "myapex.key",
7038 native_shared_libs: ["mylib"],
7039 java_libs: ["myjar"],
7040 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007041 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007042 }
7043
Jiyong Park7cd10e32020-01-14 09:22:18 +09007044 apex_key {
7045 name: "myapex.key",
7046 public_key: "testkey.avbpubkey",
7047 private_key: "testkey.pem",
7048 }
7049
7050 cc_library {
7051 name: "mylib",
7052 srcs: ["mylib.cpp"],
7053 shared_libs: ["myotherlib"],
7054 system_shared_libs: [],
7055 stl: "none",
7056 apex_available: [
7057 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007058 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007059 "//apex_available:platform",
7060 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007061 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007062 }
7063
7064 cc_library {
7065 name: "myotherlib",
7066 srcs: ["mylib.cpp"],
7067 system_shared_libs: [],
7068 stl: "none",
7069 apex_available: [
7070 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007071 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007072 "//apex_available:platform",
7073 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007074 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007075 }
7076
7077 java_library {
7078 name: "myjar",
7079 srcs: ["foo/bar/MyClass.java"],
7080 sdk_version: "none",
7081 system_modules: "none",
7082 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007083 apex_available: [
7084 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007085 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007086 "//apex_available:platform",
7087 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007088 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007089 }
7090
7091 java_library {
7092 name: "myotherjar",
7093 srcs: ["foo/bar/MyClass.java"],
7094 sdk_version: "none",
7095 system_modules: "none",
7096 apex_available: [
7097 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007098 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007099 "//apex_available:platform",
7100 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007101 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007102 }
7103 `
7104
7105 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7106 for _, f := range files {
7107 if f.path == file {
7108 if f.isLink {
7109 t.Errorf("%q is not a real file", file)
7110 }
7111 return
7112 }
7113 }
7114 t.Errorf("%q is not found", file)
7115 }
7116
7117 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
7118 for _, f := range files {
7119 if f.path == file {
7120 if !f.isLink {
7121 t.Errorf("%q is not a symlink", file)
7122 }
7123 return
7124 }
7125 }
7126 t.Errorf("%q is not found", file)
7127 }
7128
Jiyong Park9d677202020-02-19 16:29:35 +09007129 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7130 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007131 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007132 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007133 ensureRealfileExists(t, files, "javalib/myjar.jar")
7134 ensureRealfileExists(t, files, "lib64/mylib.so")
7135 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7136
Jiyong Park9d677202020-02-19 16:29:35 +09007137 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7138 ensureRealfileExists(t, files, "javalib/myjar.jar")
7139 ensureRealfileExists(t, files, "lib64/mylib.so")
7140 ensureRealfileExists(t, files, "lib64/myotherlib.so")
7141
7142 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007143 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007144 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007145 ensureRealfileExists(t, files, "javalib/myjar.jar")
7146 ensureRealfileExists(t, files, "lib64/mylib.so")
7147 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007148
7149 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7150 ensureRealfileExists(t, files, "javalib/myjar.jar")
7151 ensureRealfileExists(t, files, "lib64/mylib.so")
7152 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007153}
7154
Yo Chiange8128052020-07-23 20:09:18 +08007155func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007156 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007157 apex {
7158 name: "myapex",
7159 key: "myapex.key",
7160 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007161 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007162 }
7163
7164 apex_key {
7165 name: "myapex.key",
7166 public_key: "testkey.avbpubkey",
7167 private_key: "testkey.pem",
7168 }
7169
7170 cc_library_shared {
7171 name: "mylib",
7172 srcs: ["mylib.cpp"],
7173 shared_libs: ["myotherlib"],
7174 system_shared_libs: [],
7175 stl: "none",
7176 apex_available: [
7177 "myapex",
7178 "//apex_available:platform",
7179 ],
7180 }
7181
7182 cc_prebuilt_library_shared {
7183 name: "myotherlib",
7184 srcs: ["prebuilt.so"],
7185 system_shared_libs: [],
7186 stl: "none",
7187 apex_available: [
7188 "myapex",
7189 "//apex_available:platform",
7190 ],
7191 }
7192 `)
7193
7194 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007195 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007196 var builder strings.Builder
7197 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7198 androidMk := builder.String()
7199 // `myotherlib` is added to `myapex` as symlink
7200 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
7201 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7202 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7203 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09007204 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 +08007205}
7206
Jooyung Han643adc42020-02-27 13:50:06 +09007207func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007208 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007209 apex {
7210 name: "myapex",
7211 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007212 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007213 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007214 }
7215
7216 apex_key {
7217 name: "myapex.key",
7218 public_key: "testkey.avbpubkey",
7219 private_key: "testkey.pem",
7220 }
7221
7222 cc_library {
7223 name: "mylib",
7224 srcs: ["mylib.cpp"],
7225 shared_libs: ["mylib2"],
7226 system_shared_libs: [],
7227 stl: "none",
7228 apex_available: [ "myapex" ],
7229 }
7230
7231 cc_library {
7232 name: "mylib2",
7233 srcs: ["mylib.cpp"],
7234 system_shared_libs: [],
7235 stl: "none",
7236 apex_available: [ "myapex" ],
7237 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007238
7239 rust_ffi_shared {
7240 name: "libfoo.rust",
7241 crate_name: "foo",
7242 srcs: ["foo.rs"],
7243 shared_libs: ["libfoo.shared_from_rust"],
7244 prefer_rlib: true,
7245 apex_available: ["myapex"],
7246 }
7247
7248 cc_library_shared {
7249 name: "libfoo.shared_from_rust",
7250 srcs: ["mylib.cpp"],
7251 system_shared_libs: [],
7252 stl: "none",
7253 stubs: {
7254 versions: ["10", "11", "12"],
7255 },
7256 }
7257
Jooyung Han643adc42020-02-27 13:50:06 +09007258 `)
7259
7260 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7261 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007262 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007263 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7264 "lib64/mylib.so",
7265 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007266 "lib64/libfoo.rust.so",
7267 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7268 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007269 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007270
7271 // b/220397949
7272 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007273}
7274
Jooyung Han49f67012020-04-17 13:43:10 +09007275func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007276 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007277 apex {
7278 name: "myapex",
7279 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007280 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007281 }
7282 apex_key {
7283 name: "myapex.key",
7284 public_key: "testkey.avbpubkey",
7285 private_key: "testkey.pem",
7286 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007287 `,
7288 android.FixtureModifyConfig(func(config android.Config) {
7289 delete(config.Targets, android.Android)
7290 config.AndroidCommonTarget = android.Target{}
7291 }),
7292 )
Jooyung Han49f67012020-04-17 13:43:10 +09007293
7294 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7295 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7296 }
7297}
7298
Jiyong Parkbd159612020-02-28 15:22:21 +09007299func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007300 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007301 apex {
7302 name: "myapex",
7303 key: "myapex.key",
7304 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007305 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007306 }
7307
7308 apex_key {
7309 name: "myapex.key",
7310 public_key: "testkey.avbpubkey",
7311 private_key: "testkey.pem",
7312 }
7313
7314 android_app {
7315 name: "AppFoo",
7316 srcs: ["foo/bar/MyClass.java"],
7317 sdk_version: "none",
7318 system_modules: "none",
7319 apex_available: [ "myapex" ],
7320 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007321 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007322
Colin Crosscf371cc2020-11-13 11:48:42 -08007323 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007324 content := bundleConfigRule.Args["content"]
7325
7326 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007327 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 +09007328}
7329
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007330func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007331 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007332 apex {
7333 name: "myapex",
7334 key: "myapex.key",
7335 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007336 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007337 }
7338
7339 apex_key {
7340 name: "myapex.key",
7341 public_key: "testkey.avbpubkey",
7342 private_key: "testkey.pem",
7343 }
7344
7345 android_app_set {
7346 name: "AppSet",
7347 set: "AppSet.apks",
7348 }`)
7349 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007350 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007351 content := bundleConfigRule.Args["content"]
7352 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7353 s := mod.Rule("apexRule").Args["copy_commands"]
7354 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007355 if len(copyCmds) != 4 {
7356 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007357 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007358 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7359 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007360 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7361 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007362
7363 // Ensure that canned_fs_config has an entry for the app set zip file
7364 generateFsRule := mod.Rule("generateFsConfig")
7365 cmd := generateFsRule.RuleParams.Command
7366 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007367}
7368
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007369func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007370 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007371 apex_set {
7372 name: "myapex",
7373 filename: "foo_v2.apex",
7374 sanitized: {
7375 none: { set: "myapex.apks", },
7376 hwaddress: { set: "myapex.hwasan.apks", },
7377 },
Paul Duffin24704672021-04-06 16:09:30 +01007378 }
7379 `
7380 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007381
Paul Duffin24704672021-04-06 16:09:30 +01007382 // Check that the extractor produces the correct output file from the correct input file.
7383 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007384
Paul Duffin24704672021-04-06 16:09:30 +01007385 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7386 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007387
Paul Duffin24704672021-04-06 16:09:30 +01007388 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7389
7390 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007391 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7392 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007393
7394 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007395}
7396
Pranav Guptaeba03b02022-09-27 00:27:08 +00007397func TestApexSetApksModuleAssignment(t *testing.T) {
7398 ctx := testApex(t, `
7399 apex_set {
7400 name: "myapex",
7401 set: ":myapex_apks_file",
7402 }
7403
7404 filegroup {
7405 name: "myapex_apks_file",
7406 srcs: ["myapex.apks"],
7407 }
7408 `)
7409
7410 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7411
7412 // Check that the extractor produces the correct apks file from the input module
7413 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7414 extractedApex := m.Output(extractorOutput)
7415
7416 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7417}
7418
Paul Duffin89f570a2021-06-16 01:42:33 +01007419func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007420 t.Helper()
7421
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007422 bp := `
7423 java_library {
7424 name: "some-updatable-apex-lib",
7425 srcs: ["a.java"],
7426 sdk_version: "current",
7427 apex_available: [
7428 "some-updatable-apex",
7429 ],
satayevabcd5972021-08-06 17:49:46 +01007430 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007431 }
7432
7433 java_library {
7434 name: "some-non-updatable-apex-lib",
7435 srcs: ["a.java"],
7436 apex_available: [
7437 "some-non-updatable-apex",
7438 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007439 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007440 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007441 }
7442
7443 bootclasspath_fragment {
7444 name: "some-non-updatable-fragment",
7445 contents: ["some-non-updatable-apex-lib"],
7446 apex_available: [
7447 "some-non-updatable-apex",
7448 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007449 hidden_api: {
7450 split_packages: ["*"],
7451 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007452 }
7453
7454 java_library {
7455 name: "some-platform-lib",
7456 srcs: ["a.java"],
7457 sdk_version: "current",
7458 installable: true,
7459 }
7460
7461 java_library {
7462 name: "some-art-lib",
7463 srcs: ["a.java"],
7464 sdk_version: "current",
7465 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007466 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007467 ],
7468 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007469 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007470 }
7471
7472 apex {
7473 name: "some-updatable-apex",
7474 key: "some-updatable-apex.key",
7475 java_libs: ["some-updatable-apex-lib"],
7476 updatable: true,
7477 min_sdk_version: "current",
7478 }
7479
7480 apex {
7481 name: "some-non-updatable-apex",
7482 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007483 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007484 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007485 }
7486
7487 apex_key {
7488 name: "some-updatable-apex.key",
7489 }
7490
7491 apex_key {
7492 name: "some-non-updatable-apex.key",
7493 }
7494
7495 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007496 name: "com.android.art.debug",
7497 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007498 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007499 updatable: true,
7500 min_sdk_version: "current",
7501 }
7502
Paul Duffinf23bc472021-04-27 12:42:20 +01007503 bootclasspath_fragment {
7504 name: "art-bootclasspath-fragment",
7505 image_name: "art",
7506 contents: ["some-art-lib"],
7507 apex_available: [
7508 "com.android.art.debug",
7509 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007510 hidden_api: {
7511 split_packages: ["*"],
7512 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007513 }
7514
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007515 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007516 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007517 }
7518
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007519 filegroup {
7520 name: "some-updatable-apex-file_contexts",
7521 srcs: [
7522 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7523 ],
7524 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007525
7526 filegroup {
7527 name: "some-non-updatable-apex-file_contexts",
7528 srcs: [
7529 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7530 ],
7531 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007532 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007533
Paul Duffin89f570a2021-06-16 01:42:33 +01007534 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007535}
7536
Paul Duffin89f570a2021-06-16 01:42:33 +01007537func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007538 t.Helper()
7539
Paul Duffin55607122021-03-30 23:32:51 +01007540 fs := android.MockFS{
7541 "a.java": nil,
7542 "a.jar": nil,
7543 "apex_manifest.json": nil,
7544 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007545 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007546 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7547 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7548 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007549 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007550 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007551
Paul Duffin55607122021-03-30 23:32:51 +01007552 errorHandler := android.FixtureExpectsNoErrors
7553 if errmsg != "" {
7554 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007555 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007556
Paul Duffin55607122021-03-30 23:32:51 +01007557 result := android.GroupFixturePreparers(
7558 cc.PrepareForTestWithCcDefaultModules,
7559 java.PrepareForTestWithHiddenApiBuildComponents,
7560 java.PrepareForTestWithJavaDefaultModules,
7561 java.PrepareForTestWithJavaSdkLibraryFiles,
7562 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007563 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007564 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007565 android.FixtureModifyMockFS(func(fs android.MockFS) {
7566 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7567 insert := ""
7568 for _, fragment := range fragments {
7569 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7570 }
7571 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7572 platform_bootclasspath {
7573 name: "platform-bootclasspath",
7574 fragments: [
7575 %s
7576 ],
7577 }
7578 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007579 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007580 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007581 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007582 ).
7583 ExtendWithErrorHandler(errorHandler).
7584 RunTestWithBp(t, bp)
7585
7586 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007587}
7588
Paul Duffin5556c5f2022-06-09 17:32:21 +00007589func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007590 preparers := android.GroupFixturePreparers(
7591 java.PrepareForTestWithJavaDefaultModules,
7592 PrepareForTestWithApexBuildComponents,
7593 ).
7594 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7595 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7596
7597 bpBase := `
7598 apex_set {
7599 name: "com.android.myapex",
7600 installable: true,
7601 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7602 set: "myapex.apks",
7603 }
7604
7605 apex_set {
7606 name: "com.mycompany.android.myapex",
7607 apex_name: "com.android.myapex",
7608 installable: true,
7609 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7610 set: "company-myapex.apks",
7611 }
7612
7613 prebuilt_bootclasspath_fragment {
7614 name: "my-bootclasspath-fragment",
7615 apex_available: ["com.android.myapex"],
7616 %s
7617 }
7618 `
7619
7620 t.Run("java_import", func(t *testing.T) {
7621 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7622 java_import {
7623 name: "libfoo",
7624 jars: ["libfoo.jar"],
7625 apex_available: ["com.android.myapex"],
7626 }
7627 `)
7628 })
7629
7630 t.Run("java_sdk_library_import", func(t *testing.T) {
7631 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7632 java_sdk_library_import {
7633 name: "libfoo",
7634 public: {
7635 jars: ["libbar.jar"],
7636 },
7637 apex_available: ["com.android.myapex"],
7638 }
7639 `)
7640 })
7641
7642 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7643 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7644 image_name: "art",
7645 contents: ["libfoo"],
7646 `)+`
7647 java_sdk_library_import {
7648 name: "libfoo",
7649 public: {
7650 jars: ["libbar.jar"],
7651 },
7652 apex_available: ["com.android.myapex"],
7653 }
7654 `)
7655 })
7656}
7657
Paul Duffin5556c5f2022-06-09 17:32:21 +00007658func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7659 preparers := android.GroupFixturePreparers(
7660 java.PrepareForTestWithJavaDefaultModules,
7661 PrepareForTestWithApexBuildComponents,
7662 )
7663
7664 bpBase := `
7665 apex_set {
7666 name: "com.android.myapex",
7667 installable: true,
7668 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7669 set: "myapex.apks",
7670 }
7671
7672 apex_set {
7673 name: "com.android.myapex_compressed",
7674 apex_name: "com.android.myapex",
7675 installable: true,
7676 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7677 set: "myapex_compressed.apks",
7678 }
7679
7680 prebuilt_bootclasspath_fragment {
7681 name: "my-bootclasspath-fragment",
7682 apex_available: [
7683 "com.android.myapex",
7684 "com.android.myapex_compressed",
7685 ],
7686 hidden_api: {
7687 annotation_flags: "annotation-flags.csv",
7688 metadata: "metadata.csv",
7689 index: "index.csv",
7690 signature_patterns: "signature_patterns.csv",
7691 },
7692 %s
7693 }
7694 `
7695
7696 t.Run("java_import", func(t *testing.T) {
7697 result := preparers.RunTestWithBp(t,
7698 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7699 java_import {
7700 name: "libfoo",
7701 jars: ["libfoo.jar"],
7702 apex_available: [
7703 "com.android.myapex",
7704 "com.android.myapex_compressed",
7705 ],
7706 }
7707 `)
7708
7709 module := result.Module("libfoo", "android_common_com.android.myapex")
7710 usesLibraryDep := module.(java.UsesLibraryDependency)
7711 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7712 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7713 usesLibraryDep.DexJarBuildPath().Path())
7714 })
7715
7716 t.Run("java_sdk_library_import", func(t *testing.T) {
7717 result := preparers.RunTestWithBp(t,
7718 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7719 java_sdk_library_import {
7720 name: "libfoo",
7721 public: {
7722 jars: ["libbar.jar"],
7723 },
7724 apex_available: [
7725 "com.android.myapex",
7726 "com.android.myapex_compressed",
7727 ],
7728 compile_dex: true,
7729 }
7730 `)
7731
7732 module := result.Module("libfoo", "android_common_com.android.myapex")
7733 usesLibraryDep := module.(java.UsesLibraryDependency)
7734 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7735 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7736 usesLibraryDep.DexJarBuildPath().Path())
7737 })
7738
7739 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7740 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7741 image_name: "art",
7742 contents: ["libfoo"],
7743 `)+`
7744 java_sdk_library_import {
7745 name: "libfoo",
7746 public: {
7747 jars: ["libbar.jar"],
7748 },
7749 apex_available: [
7750 "com.android.myapex",
7751 "com.android.myapex_compressed",
7752 ],
7753 compile_dex: true,
7754 }
7755 `)
7756 })
7757}
7758
Jooyung Han548640b2020-04-27 12:10:30 +09007759func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7760 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7761 apex {
7762 name: "myapex",
7763 key: "myapex.key",
7764 updatable: true,
7765 }
7766
7767 apex_key {
7768 name: "myapex.key",
7769 public_key: "testkey.avbpubkey",
7770 private_key: "testkey.pem",
7771 }
7772 `)
7773}
7774
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007775func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7776 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7777 apex {
7778 name: "myapex",
7779 key: "myapex.key",
7780 }
7781
7782 apex_key {
7783 name: "myapex.key",
7784 public_key: "testkey.avbpubkey",
7785 private_key: "testkey.pem",
7786 }
7787 `)
7788}
7789
Daniel Norman69109112021-12-02 12:52:42 -08007790func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7791 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7792 apex {
7793 name: "myapex",
7794 key: "myapex.key",
7795 updatable: true,
7796 soc_specific: true,
7797 }
7798
7799 apex_key {
7800 name: "myapex.key",
7801 public_key: "testkey.avbpubkey",
7802 private_key: "testkey.pem",
7803 }
7804 `)
7805}
7806
satayevb98371c2021-06-15 16:49:50 +01007807func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7808 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7809 apex {
7810 name: "myapex",
7811 key: "myapex.key",
7812 systemserverclasspath_fragments: [
7813 "mysystemserverclasspathfragment",
7814 ],
7815 min_sdk_version: "29",
7816 updatable: true,
7817 }
7818
7819 apex_key {
7820 name: "myapex.key",
7821 public_key: "testkey.avbpubkey",
7822 private_key: "testkey.pem",
7823 }
7824
7825 java_library {
7826 name: "foo",
7827 srcs: ["b.java"],
7828 min_sdk_version: "29",
7829 installable: true,
7830 apex_available: [
7831 "myapex",
7832 ],
7833 }
7834
7835 systemserverclasspath_fragment {
7836 name: "mysystemserverclasspathfragment",
7837 generate_classpaths_proto: false,
7838 contents: [
7839 "foo",
7840 ],
7841 apex_available: [
7842 "myapex",
7843 ],
7844 }
satayevabcd5972021-08-06 17:49:46 +01007845 `,
7846 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7847 )
satayevb98371c2021-06-15 16:49:50 +01007848}
7849
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007850func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007851 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7852 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7853 // modules to be included in the BootJars.
7854 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7855 return android.GroupFixturePreparers(
7856 dexpreopt.FixtureSetBootJars(bootJars...),
7857 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7858 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7859 }),
7860 )
7861 }
7862
7863 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7864 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7865 // specified in the ArtApexJars configuration.
7866 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7867 return android.GroupFixturePreparers(
7868 dexpreopt.FixtureSetArtBootJars(bootJars...),
7869 dexpreopt.FixtureSetBootJars(bootJars...),
7870 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7871 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7872 }),
7873 )
7874 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007875
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007876 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007877 preparer := android.GroupFixturePreparers(
7878 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7879 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7880 )
7881 fragments := []java.ApexVariantReference{
7882 {
7883 Apex: proptools.StringPtr("com.android.art.debug"),
7884 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7885 },
7886 {
7887 Apex: proptools.StringPtr("some-non-updatable-apex"),
7888 Module: proptools.StringPtr("some-non-updatable-fragment"),
7889 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007890 }
satayevabcd5972021-08-06 17:49:46 +01007891 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007892 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007893
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007894 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007895 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7896 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007897 preparer := android.GroupFixturePreparers(
7898 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7899 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7900 )
Paul Duffin60264a02021-04-12 20:02:36 +01007901 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007902 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007903
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007904 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 +01007905 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 +01007906 // Update the dexpreopt ArtApexJars directly.
7907 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7908 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007909 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007910
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007911 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 +01007912 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 +01007913 // Update the dexpreopt ArtApexJars directly.
7914 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7915 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007916 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007917
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007918 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 +01007919 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 +01007920 preparer := android.GroupFixturePreparers(
7921 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7922 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7923 )
Paul Duffin60264a02021-04-12 20:02:36 +01007924 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007925 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007926
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007927 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 +01007928 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007929 fragment := java.ApexVariantReference{
7930 Apex: proptools.StringPtr("some-non-updatable-apex"),
7931 Module: proptools.StringPtr("some-non-updatable-fragment"),
7932 }
7933 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007934 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007935
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007936 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007937 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007938 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7939 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007940 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007941
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007942 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007943 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007944 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7945 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007946 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007947
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007948 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007949 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007950 // Update the dexpreopt ArtApexJars directly.
7951 preparer := prepareSetArtJars("platform:some-platform-lib")
7952 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007953 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007954
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007955 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007956 preparer := android.GroupFixturePreparers(
7957 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7958 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7959 )
7960 fragments := []java.ApexVariantReference{
7961 {
7962 Apex: proptools.StringPtr("some-non-updatable-apex"),
7963 Module: proptools.StringPtr("some-non-updatable-fragment"),
7964 },
7965 }
7966 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007967 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007968}
7969
7970func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007971 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007972 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007973 fragment := java.ApexVariantReference{
7974 Apex: proptools.StringPtr("myapex"),
7975 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7976 }
7977
Paul Duffin064b70c2020-11-02 17:32:38 +00007978 testDexpreoptWithApexes(t, `
7979 prebuilt_apex {
7980 name: "myapex" ,
7981 arch: {
7982 arm64: {
7983 src: "myapex-arm64.apex",
7984 },
7985 arm: {
7986 src: "myapex-arm.apex",
7987 },
7988 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007989 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7990 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007991
Paul Duffin89f570a2021-06-16 01:42:33 +01007992 prebuilt_bootclasspath_fragment {
7993 name: "my-bootclasspath-fragment",
7994 contents: ["libfoo"],
7995 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007996 hidden_api: {
7997 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7998 metadata: "my-bootclasspath-fragment/metadata.csv",
7999 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008000 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8001 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8002 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008003 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008004 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008005
Paul Duffin89f570a2021-06-16 01:42:33 +01008006 java_import {
8007 name: "libfoo",
8008 jars: ["libfoo.jar"],
8009 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008010 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008011 }
8012 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008013 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008014}
8015
Spandan Dasf14e2542021-11-12 00:01:37 +00008016func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008017 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008018 bp += `
8019 apex_key {
8020 name: "myapex.key",
8021 public_key: "testkey.avbpubkey",
8022 private_key: "testkey.pem",
8023 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008024 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008025 "lib1/src/A.java": nil,
8026 "lib2/src/B.java": nil,
8027 "system/sepolicy/apex/myapex-file_contexts": nil,
8028 }
8029
Paul Duffin45338f02021-03-30 23:07:52 +01008030 errorHandler := android.FixtureExpectsNoErrors
8031 if errmsg != "" {
8032 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008033 }
Colin Crossae8600b2020-10-29 17:09:13 -07008034
Paul Duffin45338f02021-03-30 23:07:52 +01008035 android.GroupFixturePreparers(
8036 android.PrepareForTestWithAndroidBuildComponents,
8037 java.PrepareForTestWithJavaBuildComponents,
8038 PrepareForTestWithApexBuildComponents,
8039 android.PrepareForTestWithNeverallowRules(rules),
8040 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008041 apexBootJars := make([]string, 0, len(bootJars))
8042 for _, apexBootJar := range bootJars {
8043 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008044 }
satayevd604b212021-07-21 14:23:52 +01008045 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008046 }),
8047 fs.AddToFixture(),
8048 ).
8049 ExtendWithErrorHandler(errorHandler).
8050 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008051}
8052
8053func TestApexPermittedPackagesRules(t *testing.T) {
8054 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008055 name string
8056 expectedError string
8057 bp string
8058 bootJars []string
8059 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008060 }{
8061
8062 {
8063 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8064 expectedError: "",
8065 bp: `
8066 java_library {
8067 name: "bcp_lib1",
8068 srcs: ["lib1/src/*.java"],
8069 permitted_packages: ["foo.bar"],
8070 apex_available: ["myapex"],
8071 sdk_version: "none",
8072 system_modules: "none",
8073 }
8074 java_library {
8075 name: "nonbcp_lib2",
8076 srcs: ["lib2/src/*.java"],
8077 apex_available: ["myapex"],
8078 permitted_packages: ["a.b"],
8079 sdk_version: "none",
8080 system_modules: "none",
8081 }
8082 apex {
8083 name: "myapex",
8084 key: "myapex.key",
8085 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008086 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008087 }`,
8088 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008089 bcpPermittedPackages: map[string][]string{
8090 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008091 "foo.bar",
8092 },
8093 },
8094 },
8095 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008096 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008097 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 +01008098 bp: `
8099 java_library {
8100 name: "bcp_lib1",
8101 srcs: ["lib1/src/*.java"],
8102 apex_available: ["myapex"],
8103 permitted_packages: ["foo.bar"],
8104 sdk_version: "none",
8105 system_modules: "none",
8106 }
8107 java_library {
8108 name: "bcp_lib2",
8109 srcs: ["lib2/src/*.java"],
8110 apex_available: ["myapex"],
8111 permitted_packages: ["foo.bar", "bar.baz"],
8112 sdk_version: "none",
8113 system_modules: "none",
8114 }
8115 apex {
8116 name: "myapex",
8117 key: "myapex.key",
8118 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008119 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008120 }
8121 `,
8122 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008123 bcpPermittedPackages: map[string][]string{
8124 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008125 "foo.bar",
8126 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008127 "bcp_lib2": []string{
8128 "foo.bar",
8129 },
8130 },
8131 },
8132 {
8133 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8134 expectedError: "",
8135 bp: `
8136 java_library {
8137 name: "bcp_lib_restricted",
8138 srcs: ["lib1/src/*.java"],
8139 apex_available: ["myapex"],
8140 permitted_packages: ["foo.bar"],
8141 sdk_version: "none",
8142 min_sdk_version: "29",
8143 system_modules: "none",
8144 }
8145 java_library {
8146 name: "bcp_lib_unrestricted",
8147 srcs: ["lib2/src/*.java"],
8148 apex_available: ["myapex"],
8149 permitted_packages: ["foo.bar", "bar.baz"],
8150 sdk_version: "none",
8151 min_sdk_version: "29",
8152 system_modules: "none",
8153 }
8154 apex {
8155 name: "myapex",
8156 key: "myapex.key",
8157 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8158 updatable: true,
8159 min_sdk_version: "29",
8160 }
8161 `,
8162 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8163 bcpPermittedPackages: map[string][]string{
8164 "bcp_lib1_non_updateable": []string{
8165 "foo.bar",
8166 },
8167 // 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 +01008168 },
8169 },
8170 }
8171 for _, tc := range testcases {
8172 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008173 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8174 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008175 })
8176 }
8177}
8178
Jiyong Park62304bb2020-04-13 16:19:48 +09008179func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008180 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008181 apex {
8182 name: "myapex",
8183 key: "myapex.key",
8184 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008185 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008186 }
8187
8188 apex_key {
8189 name: "myapex.key",
8190 public_key: "testkey.avbpubkey",
8191 private_key: "testkey.pem",
8192 }
8193
8194 cc_library {
8195 name: "mylib",
8196 srcs: ["mylib.cpp"],
8197 system_shared_libs: [],
8198 stl: "none",
8199 stubs: {
8200 versions: ["1"],
8201 },
8202 apex_available: ["myapex"],
8203 }
8204
8205 cc_library {
8206 name: "myprivlib",
8207 srcs: ["mylib.cpp"],
8208 system_shared_libs: [],
8209 stl: "none",
8210 apex_available: ["myapex"],
8211 }
8212
8213
8214 cc_test {
8215 name: "mytest",
8216 gtest: false,
8217 srcs: ["mylib.cpp"],
8218 system_shared_libs: [],
8219 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008220 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008221 test_for: ["myapex"]
8222 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008223
8224 cc_library {
8225 name: "mytestlib",
8226 srcs: ["mylib.cpp"],
8227 system_shared_libs: [],
8228 shared_libs: ["mylib", "myprivlib"],
8229 stl: "none",
8230 test_for: ["myapex"],
8231 }
8232
8233 cc_benchmark {
8234 name: "mybench",
8235 srcs: ["mylib.cpp"],
8236 system_shared_libs: [],
8237 shared_libs: ["mylib", "myprivlib"],
8238 stl: "none",
8239 test_for: ["myapex"],
8240 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008241 `)
8242
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008243 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008244 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008245 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8246 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8247 }
8248
8249 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008250 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008251 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8252 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8253 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8254}
Jiyong Park46a512f2020-12-04 18:02:13 +09008255
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008256func TestIndirectTestFor(t *testing.T) {
8257 ctx := testApex(t, `
8258 apex {
8259 name: "myapex",
8260 key: "myapex.key",
8261 native_shared_libs: ["mylib", "myprivlib"],
8262 updatable: false,
8263 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008264
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008265 apex_key {
8266 name: "myapex.key",
8267 public_key: "testkey.avbpubkey",
8268 private_key: "testkey.pem",
8269 }
8270
8271 cc_library {
8272 name: "mylib",
8273 srcs: ["mylib.cpp"],
8274 system_shared_libs: [],
8275 stl: "none",
8276 stubs: {
8277 versions: ["1"],
8278 },
8279 apex_available: ["myapex"],
8280 }
8281
8282 cc_library {
8283 name: "myprivlib",
8284 srcs: ["mylib.cpp"],
8285 system_shared_libs: [],
8286 stl: "none",
8287 shared_libs: ["mylib"],
8288 apex_available: ["myapex"],
8289 }
8290
8291 cc_library {
8292 name: "mytestlib",
8293 srcs: ["mylib.cpp"],
8294 system_shared_libs: [],
8295 shared_libs: ["myprivlib"],
8296 stl: "none",
8297 test_for: ["myapex"],
8298 }
8299 `)
8300
8301 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008302 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008303 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8304 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8305 }
8306
8307 // The platform variant of mytestlib links to the platform variant of the
8308 // internal myprivlib.
8309 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8310
8311 // The platform variant of myprivlib links to the platform variant of mylib
8312 // and bypasses its stubs.
8313 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 +09008314}
8315
Martin Stjernholmec009002021-03-27 15:18:31 +00008316func TestTestForForLibInOtherApex(t *testing.T) {
8317 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8318 _ = testApex(t, `
8319 apex {
8320 name: "com.android.art",
8321 key: "myapex.key",
8322 native_shared_libs: ["mylib"],
8323 updatable: false,
8324 }
8325
8326 apex {
8327 name: "com.android.art.debug",
8328 key: "myapex.key",
8329 native_shared_libs: ["mylib", "mytestlib"],
8330 updatable: false,
8331 }
8332
8333 apex_key {
8334 name: "myapex.key",
8335 public_key: "testkey.avbpubkey",
8336 private_key: "testkey.pem",
8337 }
8338
8339 cc_library {
8340 name: "mylib",
8341 srcs: ["mylib.cpp"],
8342 system_shared_libs: [],
8343 stl: "none",
8344 stubs: {
8345 versions: ["1"],
8346 },
8347 apex_available: ["com.android.art", "com.android.art.debug"],
8348 }
8349
8350 cc_library {
8351 name: "mytestlib",
8352 srcs: ["mylib.cpp"],
8353 system_shared_libs: [],
8354 shared_libs: ["mylib"],
8355 stl: "none",
8356 apex_available: ["com.android.art.debug"],
8357 test_for: ["com.android.art"],
8358 }
8359 `,
8360 android.MockFS{
8361 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8362 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8363 }.AddToFixture())
8364}
8365
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008366// TODO(jungjw): Move this to proptools
8367func intPtr(i int) *int {
8368 return &i
8369}
8370
8371func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008372 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008373 apex_set {
8374 name: "myapex",
8375 set: "myapex.apks",
8376 filename: "foo_v2.apex",
8377 overrides: ["foo"],
8378 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008379 `,
8380 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8381 variables.Platform_sdk_version = intPtr(30)
8382 }),
8383 android.FixtureModifyConfig(func(config android.Config) {
8384 config.Targets[android.Android] = []android.Target{
8385 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8386 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8387 }
8388 }),
8389 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008390
Paul Duffin24704672021-04-06 16:09:30 +01008391 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008392
8393 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008394 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008395 actual := extractedApex.Args["abis"]
8396 expected := "ARMEABI_V7A,ARM64_V8A"
8397 if actual != expected {
8398 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8399 }
8400 actual = extractedApex.Args["sdk-version"]
8401 expected = "30"
8402 if actual != expected {
8403 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8404 }
8405
Paul Duffin6717d882021-06-15 19:09:41 +01008406 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008407 a := m.Module().(*ApexSet)
8408 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008409 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008410 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8411 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8412 }
8413}
8414
Jiyong Park7d95a512020-05-10 15:16:24 +09008415func TestNoStaticLinkingToStubsLib(t *testing.T) {
8416 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8417 apex {
8418 name: "myapex",
8419 key: "myapex.key",
8420 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008421 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008422 }
8423
8424 apex_key {
8425 name: "myapex.key",
8426 public_key: "testkey.avbpubkey",
8427 private_key: "testkey.pem",
8428 }
8429
8430 cc_library {
8431 name: "mylib",
8432 srcs: ["mylib.cpp"],
8433 static_libs: ["otherlib"],
8434 system_shared_libs: [],
8435 stl: "none",
8436 apex_available: [ "myapex" ],
8437 }
8438
8439 cc_library {
8440 name: "otherlib",
8441 srcs: ["mylib.cpp"],
8442 system_shared_libs: [],
8443 stl: "none",
8444 stubs: {
8445 versions: ["1", "2", "3"],
8446 },
8447 apex_available: [ "myapex" ],
8448 }
8449 `)
8450}
8451
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008452func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008453 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008454 apex {
8455 name: "myapex",
8456 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008457 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008458 custom_sign_tool: "sign_myapex",
8459 }
8460
8461 apex_key {
8462 name: "myapex.key",
8463 public_key: "testkey.avbpubkey",
8464 private_key: "testkey.pem",
8465 }
8466 `)
8467
8468 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8469 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8470 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"`)
8471}
8472
8473func TestApexKeysTxtOverrides(t *testing.T) {
8474 ctx := testApex(t, `
8475 apex {
8476 name: "myapex",
8477 key: "myapex.key",
8478 updatable: false,
8479 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008480 }
8481
8482 apex_key {
8483 name: "myapex.key",
8484 public_key: "testkey.avbpubkey",
8485 private_key: "testkey.pem",
8486 }
8487
8488 prebuilt_apex {
8489 name: "myapex",
8490 prefer: true,
8491 arch: {
8492 arm64: {
8493 src: "myapex-arm64.apex",
8494 },
8495 arm: {
8496 src: "myapex-arm.apex",
8497 },
8498 },
8499 }
8500
8501 apex_set {
8502 name: "myapex_set",
8503 set: "myapex.apks",
8504 filename: "myapex_set.apex",
8505 overrides: ["myapex"],
8506 }
8507 `)
8508
8509 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8510 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8511 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 +09008512 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 +09008513}
8514
Jooyung Han938b5932020-06-20 12:47:47 +09008515func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008516 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008517 apex {
8518 name: "myapex",
8519 key: "myapex.key",
8520 apps: ["app"],
8521 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008522 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008523 }
8524
8525 apex_key {
8526 name: "myapex.key",
8527 public_key: "testkey.avbpubkey",
8528 private_key: "testkey.pem",
8529 }
8530
8531 android_app {
8532 name: "app",
8533 srcs: ["foo/bar/MyClass.java"],
8534 package_name: "foo",
8535 sdk_version: "none",
8536 system_modules: "none",
8537 apex_available: [ "myapex" ],
8538 }
8539 `, withFiles(map[string][]byte{
8540 "sub/Android.bp": []byte(`
8541 override_apex {
8542 name: "override_myapex",
8543 base: "myapex",
8544 apps: ["override_app"],
8545 allowed_files: ":allowed",
8546 }
8547 // Overridable "path" property should be referenced indirectly
8548 filegroup {
8549 name: "allowed",
8550 srcs: ["allowed.txt"],
8551 }
8552 override_android_app {
8553 name: "override_app",
8554 base: "app",
8555 package_name: "bar",
8556 }
8557 `),
8558 }))
8559
8560 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8561 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8562 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8563 }
8564
8565 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8566 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8567 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8568 }
8569}
8570
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008571func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008572 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008573 apex {
8574 name: "myapex",
8575 key: "myapex.key",
8576 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008577 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008578 }
8579
8580 apex_key {
8581 name: "myapex.key",
8582 public_key: "testkey.avbpubkey",
8583 private_key: "testkey.pem",
8584 }
8585
8586 cc_library {
8587 name: "mylib",
8588 srcs: ["mylib.cpp"],
8589 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008590 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008591 },
8592 apex_available: ["myapex"],
8593 }
8594
8595 cc_prebuilt_library_shared {
8596 name: "mylib",
8597 prefer: false,
8598 srcs: ["prebuilt.so"],
8599 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008600 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008601 },
8602 apex_available: ["myapex"],
8603 }
8604 `)
8605}
8606
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008607func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008608 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008609 apex {
8610 name: "myapex",
8611 key: "myapex.key",
8612 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008613 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008614 }
8615 apex_key {
8616 name: "myapex.key",
8617 public_key: "testkey.avbpubkey",
8618 private_key: "testkey.pem",
8619 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008620 `,
8621 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8622 variables.CompressedApex = proptools.BoolPtr(true)
8623 }),
8624 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008625
8626 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8627 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8628
8629 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8630 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8631
8632 // Make sure output of bundle is .capex
8633 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8634 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8635
8636 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008637 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008638 var builder strings.Builder
8639 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8640 androidMk := builder.String()
8641 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8642}
8643
Martin Stjernholm2856c662020-12-02 15:03:42 +00008644func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008645 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008646 apex {
8647 name: "myapex",
8648 key: "myapex.key",
8649 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008650 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008651 }
8652
8653 apex_key {
8654 name: "myapex.key",
8655 public_key: "testkey.avbpubkey",
8656 private_key: "testkey.pem",
8657 }
8658
8659 cc_library {
8660 name: "mylib",
8661 srcs: ["mylib.cpp"],
8662 apex_available: ["myapex"],
8663 shared_libs: ["otherlib"],
8664 system_shared_libs: [],
8665 }
8666
8667 cc_library {
8668 name: "otherlib",
8669 srcs: ["mylib.cpp"],
8670 stubs: {
8671 versions: ["current"],
8672 },
8673 }
8674
8675 cc_prebuilt_library_shared {
8676 name: "otherlib",
8677 prefer: true,
8678 srcs: ["prebuilt.so"],
8679 stubs: {
8680 versions: ["current"],
8681 },
8682 }
8683 `)
8684
8685 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008686 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008687 var builder strings.Builder
8688 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8689 androidMk := builder.String()
8690
8691 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8692 // a thing there.
8693 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8694}
8695
Jiyong Parke3867542020-12-03 17:28:25 +09008696func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008697 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008698 apex {
8699 name: "myapex",
8700 key: "myapex.key",
8701 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008702 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008703 }
8704
8705 apex_key {
8706 name: "myapex.key",
8707 public_key: "testkey.avbpubkey",
8708 private_key: "testkey.pem",
8709 }
8710
8711 cc_library {
8712 name: "mylib",
8713 srcs: ["mylib.cpp"],
8714 system_shared_libs: [],
8715 stl: "none",
8716 apex_available: ["myapex"],
8717 shared_libs: ["mylib2"],
8718 target: {
8719 apex: {
8720 exclude_shared_libs: ["mylib2"],
8721 },
8722 },
8723 }
8724
8725 cc_library {
8726 name: "mylib2",
8727 srcs: ["mylib.cpp"],
8728 system_shared_libs: [],
8729 stl: "none",
8730 }
8731 `)
8732
8733 // Check if mylib is linked to mylib2 for the non-apex target
8734 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8735 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8736
8737 // Make sure that the link doesn't occur for the apex target
8738 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8739 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8740
8741 // It shouldn't appear in the copy cmd as well.
8742 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8743 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8744}
8745
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008746func TestPrebuiltStubLibDep(t *testing.T) {
8747 bpBase := `
8748 apex {
8749 name: "myapex",
8750 key: "myapex.key",
8751 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008752 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008753 }
8754 apex_key {
8755 name: "myapex.key",
8756 public_key: "testkey.avbpubkey",
8757 private_key: "testkey.pem",
8758 }
8759 cc_library {
8760 name: "mylib",
8761 srcs: ["mylib.cpp"],
8762 apex_available: ["myapex"],
8763 shared_libs: ["stublib"],
8764 system_shared_libs: [],
8765 }
8766 apex {
8767 name: "otherapex",
8768 enabled: %s,
8769 key: "myapex.key",
8770 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008771 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008772 }
8773 `
8774
8775 stublibSourceBp := `
8776 cc_library {
8777 name: "stublib",
8778 srcs: ["mylib.cpp"],
8779 apex_available: ["otherapex"],
8780 system_shared_libs: [],
8781 stl: "none",
8782 stubs: {
8783 versions: ["1"],
8784 },
8785 }
8786 `
8787
8788 stublibPrebuiltBp := `
8789 cc_prebuilt_library_shared {
8790 name: "stublib",
8791 srcs: ["prebuilt.so"],
8792 apex_available: ["otherapex"],
8793 stubs: {
8794 versions: ["1"],
8795 },
8796 %s
8797 }
8798 `
8799
8800 tests := []struct {
8801 name string
8802 stublibBp string
8803 usePrebuilt bool
8804 modNames []string // Modules to collect AndroidMkEntries for
8805 otherApexEnabled []string
8806 }{
8807 {
8808 name: "only_source",
8809 stublibBp: stublibSourceBp,
8810 usePrebuilt: false,
8811 modNames: []string{"stublib"},
8812 otherApexEnabled: []string{"true", "false"},
8813 },
8814 {
8815 name: "source_preferred",
8816 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8817 usePrebuilt: false,
8818 modNames: []string{"stublib", "prebuilt_stublib"},
8819 otherApexEnabled: []string{"true", "false"},
8820 },
8821 {
8822 name: "prebuilt_preferred",
8823 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8824 usePrebuilt: true,
8825 modNames: []string{"stublib", "prebuilt_stublib"},
8826 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8827 },
8828 {
8829 name: "only_prebuilt",
8830 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8831 usePrebuilt: true,
8832 modNames: []string{"stublib"},
8833 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8834 },
8835 }
8836
8837 for _, test := range tests {
8838 t.Run(test.name, func(t *testing.T) {
8839 for _, otherApexEnabled := range test.otherApexEnabled {
8840 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008841 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008842
8843 type modAndMkEntries struct {
8844 mod *cc.Module
8845 mkEntries android.AndroidMkEntries
8846 }
8847 entries := []*modAndMkEntries{}
8848
8849 // Gather shared lib modules that are installable
8850 for _, modName := range test.modNames {
8851 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8852 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8853 continue
8854 }
8855 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008856 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008857 continue
8858 }
Colin Crossaa255532020-07-03 13:18:24 -07008859 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008860 if ent.Disabled {
8861 continue
8862 }
8863 entries = append(entries, &modAndMkEntries{
8864 mod: mod,
8865 mkEntries: ent,
8866 })
8867 }
8868 }
8869 }
8870
8871 var entry *modAndMkEntries = nil
8872 for _, ent := range entries {
8873 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8874 if entry != nil {
8875 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8876 } else {
8877 entry = ent
8878 }
8879 }
8880 }
8881
8882 if entry == nil {
8883 t.Errorf("AndroidMk entry for \"stublib\" missing")
8884 } else {
8885 isPrebuilt := entry.mod.Prebuilt() != nil
8886 if isPrebuilt != test.usePrebuilt {
8887 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8888 }
8889 if !entry.mod.IsStubs() {
8890 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8891 }
8892 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8893 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8894 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008895 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008896 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008897 if !android.InList(expected, cflags) {
8898 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8899 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008900 }
8901 })
8902 }
8903 })
8904 }
8905}
8906
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008907func TestHostApexInHostOnlyBuild(t *testing.T) {
8908 testApex(t, `
8909 apex {
8910 name: "myapex",
8911 host_supported: true,
8912 key: "myapex.key",
8913 updatable: false,
8914 payload_type: "zip",
8915 }
8916 apex_key {
8917 name: "myapex.key",
8918 public_key: "testkey.avbpubkey",
8919 private_key: "testkey.pem",
8920 }
8921 `,
8922 android.FixtureModifyConfig(func(config android.Config) {
8923 // We may not have device targets in all builds, e.g. in
8924 // prebuilts/build-tools/build-prebuilts.sh
8925 config.Targets[android.Android] = []android.Target{}
8926 }))
8927}
8928
Colin Crossc33e5212021-05-25 18:16:02 -07008929func TestApexJavaCoverage(t *testing.T) {
8930 bp := `
8931 apex {
8932 name: "myapex",
8933 key: "myapex.key",
8934 java_libs: ["mylib"],
8935 bootclasspath_fragments: ["mybootclasspathfragment"],
8936 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8937 updatable: false,
8938 }
8939
8940 apex_key {
8941 name: "myapex.key",
8942 public_key: "testkey.avbpubkey",
8943 private_key: "testkey.pem",
8944 }
8945
8946 java_library {
8947 name: "mylib",
8948 srcs: ["mylib.java"],
8949 apex_available: ["myapex"],
8950 compile_dex: true,
8951 }
8952
8953 bootclasspath_fragment {
8954 name: "mybootclasspathfragment",
8955 contents: ["mybootclasspathlib"],
8956 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01008957 hidden_api: {
8958 split_packages: ["*"],
8959 },
Colin Crossc33e5212021-05-25 18:16:02 -07008960 }
8961
8962 java_library {
8963 name: "mybootclasspathlib",
8964 srcs: ["mybootclasspathlib.java"],
8965 apex_available: ["myapex"],
8966 compile_dex: true,
8967 }
8968
8969 systemserverclasspath_fragment {
8970 name: "mysystemserverclasspathfragment",
8971 contents: ["mysystemserverclasspathlib"],
8972 apex_available: ["myapex"],
8973 }
8974
8975 java_library {
8976 name: "mysystemserverclasspathlib",
8977 srcs: ["mysystemserverclasspathlib.java"],
8978 apex_available: ["myapex"],
8979 compile_dex: true,
8980 }
8981 `
8982
8983 result := android.GroupFixturePreparers(
8984 PrepareForTestWithApexBuildComponents,
8985 prepareForTestWithMyapex,
8986 java.PrepareForTestWithJavaDefaultModules,
8987 android.PrepareForTestWithAndroidBuildComponents,
8988 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008989 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8990 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04008991 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07008992 ).RunTest(t)
8993
8994 // Make sure jacoco ran on both mylib and mybootclasspathlib
8995 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8996 t.Errorf("Failed to find jacoco rule for mylib")
8997 }
8998 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8999 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9000 }
9001 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9002 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9003 }
9004}
9005
Jiyong Park192600a2021-08-03 07:52:17 +00009006func TestProhibitStaticExecutable(t *testing.T) {
9007 testApexError(t, `executable mybin is static`, `
9008 apex {
9009 name: "myapex",
9010 key: "myapex.key",
9011 binaries: ["mybin"],
9012 min_sdk_version: "29",
9013 }
9014
9015 apex_key {
9016 name: "myapex.key",
9017 public_key: "testkey.avbpubkey",
9018 private_key: "testkey.pem",
9019 }
9020
9021 cc_binary {
9022 name: "mybin",
9023 srcs: ["mylib.cpp"],
9024 relative_install_path: "foo/bar",
9025 static_executable: true,
9026 system_shared_libs: [],
9027 stl: "none",
9028 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009029 min_sdk_version: "29",
9030 }
9031 `)
9032
9033 testApexError(t, `executable mybin.rust is static`, `
9034 apex {
9035 name: "myapex",
9036 key: "myapex.key",
9037 binaries: ["mybin.rust"],
9038 min_sdk_version: "29",
9039 }
9040
9041 apex_key {
9042 name: "myapex.key",
9043 public_key: "testkey.avbpubkey",
9044 private_key: "testkey.pem",
9045 }
9046
9047 rust_binary {
9048 name: "mybin.rust",
9049 srcs: ["foo.rs"],
9050 static_executable: true,
9051 apex_available: ["myapex"],
9052 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009053 }
9054 `)
9055}
9056
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009057func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9058 ctx := testApex(t, `
9059 apex {
9060 name: "myapex",
9061 key: "myapex.key",
9062 updatable: false,
9063 java_libs: ["foo"],
9064 }
9065
9066 apex_key {
9067 name: "myapex.key",
9068 public_key: "testkey.avbpubkey",
9069 private_key: "testkey.pem",
9070 }
9071
9072 java_library {
9073 name: "foo",
9074 srcs: ["foo.java"],
9075 apex_available: ["myapex"],
9076 installable: true,
9077 }
9078 `,
9079 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9080 )
9081
9082 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9083 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9084 var builder strings.Builder
9085 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9086 androidMk := builder.String()
9087 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")
9088}
9089
9090func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9091 ctx := testApex(t, `
9092 prebuilt_apex {
9093 name: "myapex",
9094 arch: {
9095 arm64: {
9096 src: "myapex-arm64.apex",
9097 },
9098 arm: {
9099 src: "myapex-arm.apex",
9100 },
9101 },
9102 exported_java_libs: ["foo"],
9103 }
9104
9105 java_import {
9106 name: "foo",
9107 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009108 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009109 }
9110 `,
9111 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9112 )
9113
9114 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9115 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9116 mainModuleEntries := entriesList[0]
9117 android.AssertArrayString(t,
9118 "LOCAL_REQUIRED_MODULES",
9119 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9120 []string{
9121 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9122 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9123 })
9124}
9125
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009126func TestAndroidMk_RequiredModules(t *testing.T) {
9127 ctx := testApex(t, `
9128 apex {
9129 name: "myapex",
9130 key: "myapex.key",
9131 updatable: false,
9132 java_libs: ["foo"],
9133 required: ["otherapex"],
9134 }
9135
9136 apex {
9137 name: "otherapex",
9138 key: "myapex.key",
9139 updatable: false,
9140 java_libs: ["foo"],
9141 required: ["otherapex"],
9142 }
9143
9144 apex_key {
9145 name: "myapex.key",
9146 public_key: "testkey.avbpubkey",
9147 private_key: "testkey.pem",
9148 }
9149
9150 java_library {
9151 name: "foo",
9152 srcs: ["foo.java"],
9153 apex_available: ["myapex", "otherapex"],
9154 installable: true,
9155 }
9156 `)
9157
9158 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9159 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9160 var builder strings.Builder
9161 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9162 androidMk := builder.String()
9163 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
9164}
9165
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009166func TestAndroidMk_RequiredDeps(t *testing.T) {
9167 ctx := testApex(t, `
9168 apex {
9169 name: "myapex",
9170 key: "myapex.key",
9171 updatable: false,
9172 }
9173
9174 apex_key {
9175 name: "myapex.key",
9176 public_key: "testkey.avbpubkey",
9177 private_key: "testkey.pem",
9178 }
9179 `)
9180
9181 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9182 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
9183 data := android.AndroidMkDataForTest(t, ctx, bundle)
9184 var builder strings.Builder
9185 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9186 androidMk := builder.String()
9187 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
9188
9189 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
9190 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
9191 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9192 var flattenedBuilder strings.Builder
9193 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9194 flattenedAndroidMk := flattenedBuilder.String()
9195 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
9196}
9197
Jooyung Hana6d36672022-02-24 13:58:07 +09009198func TestApexOutputFileProducer(t *testing.T) {
9199 for _, tc := range []struct {
9200 name string
9201 ref string
9202 expected_data []string
9203 }{
9204 {
9205 name: "test_using_output",
9206 ref: ":myapex",
9207 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9208 },
9209 {
9210 name: "test_using_apex",
9211 ref: ":myapex{.apex}",
9212 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9213 },
9214 } {
9215 t.Run(tc.name, func(t *testing.T) {
9216 ctx := testApex(t, `
9217 apex {
9218 name: "myapex",
9219 key: "myapex.key",
9220 compressible: true,
9221 updatable: false,
9222 }
9223
9224 apex_key {
9225 name: "myapex.key",
9226 public_key: "testkey.avbpubkey",
9227 private_key: "testkey.pem",
9228 }
9229
9230 java_test {
9231 name: "`+tc.name+`",
9232 srcs: ["a.java"],
9233 data: ["`+tc.ref+`"],
9234 }
9235 `,
9236 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9237 variables.CompressedApex = proptools.BoolPtr(true)
9238 }))
9239 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9240 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9241 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9242 })
9243 }
9244}
9245
satayev758968a2021-12-06 11:42:40 +00009246func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9247 preparer := android.GroupFixturePreparers(
9248 PrepareForTestWithApexBuildComponents,
9249 prepareForTestWithMyapex,
9250 java.PrepareForTestWithJavaSdkLibraryFiles,
9251 java.PrepareForTestWithJavaDefaultModules,
9252 android.PrepareForTestWithAndroidBuildComponents,
9253 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9254 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9255 )
9256
9257 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9258 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9259 preparer.RunTestWithBp(t, `
9260 apex {
9261 name: "myapex",
9262 key: "myapex.key",
9263 bootclasspath_fragments: ["mybootclasspathfragment"],
9264 min_sdk_version: "30",
9265 updatable: false,
9266 }
9267
9268 apex_key {
9269 name: "myapex.key",
9270 public_key: "testkey.avbpubkey",
9271 private_key: "testkey.pem",
9272 }
9273
9274 bootclasspath_fragment {
9275 name: "mybootclasspathfragment",
9276 contents: ["mybootclasspathlib"],
9277 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009278 hidden_api: {
9279 split_packages: ["*"],
9280 },
satayev758968a2021-12-06 11:42:40 +00009281 }
9282
9283 java_sdk_library {
9284 name: "mybootclasspathlib",
9285 srcs: ["mybootclasspathlib.java"],
9286 apex_available: ["myapex"],
9287 compile_dex: true,
9288 unsafe_ignore_missing_latest_api: true,
9289 min_sdk_version: "31",
9290 static_libs: ["util"],
9291 }
9292
9293 java_library {
9294 name: "util",
9295 srcs: ["a.java"],
9296 apex_available: ["myapex"],
9297 min_sdk_version: "31",
9298 static_libs: ["another_util"],
9299 }
9300
9301 java_library {
9302 name: "another_util",
9303 srcs: ["a.java"],
9304 min_sdk_version: "31",
9305 apex_available: ["myapex"],
9306 }
9307 `)
9308 })
9309
9310 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9311 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9312 preparer.RunTestWithBp(t, `
9313 apex {
9314 name: "myapex",
9315 key: "myapex.key",
9316 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9317 min_sdk_version: "30",
9318 updatable: false,
9319 }
9320
9321 apex_key {
9322 name: "myapex.key",
9323 public_key: "testkey.avbpubkey",
9324 private_key: "testkey.pem",
9325 }
9326
9327 systemserverclasspath_fragment {
9328 name: "mysystemserverclasspathfragment",
9329 contents: ["mysystemserverclasspathlib"],
9330 apex_available: ["myapex"],
9331 }
9332
9333 java_sdk_library {
9334 name: "mysystemserverclasspathlib",
9335 srcs: ["mysystemserverclasspathlib.java"],
9336 apex_available: ["myapex"],
9337 compile_dex: true,
9338 min_sdk_version: "32",
9339 unsafe_ignore_missing_latest_api: true,
9340 static_libs: ["util"],
9341 }
9342
9343 java_library {
9344 name: "util",
9345 srcs: ["a.java"],
9346 apex_available: ["myapex"],
9347 min_sdk_version: "31",
9348 static_libs: ["another_util"],
9349 }
9350
9351 java_library {
9352 name: "another_util",
9353 srcs: ["a.java"],
9354 min_sdk_version: "31",
9355 apex_available: ["myapex"],
9356 }
9357 `)
9358 })
9359
9360 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9361 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9362 RunTestWithBp(t, `
9363 apex {
9364 name: "myapex",
9365 key: "myapex.key",
9366 bootclasspath_fragments: ["mybootclasspathfragment"],
9367 min_sdk_version: "30",
9368 updatable: false,
9369 }
9370
9371 apex_key {
9372 name: "myapex.key",
9373 public_key: "testkey.avbpubkey",
9374 private_key: "testkey.pem",
9375 }
9376
9377 bootclasspath_fragment {
9378 name: "mybootclasspathfragment",
9379 contents: ["mybootclasspathlib"],
9380 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009381 hidden_api: {
9382 split_packages: ["*"],
9383 },
satayev758968a2021-12-06 11:42:40 +00009384 }
9385
9386 java_sdk_library {
9387 name: "mybootclasspathlib",
9388 srcs: ["mybootclasspathlib.java"],
9389 apex_available: ["myapex"],
9390 compile_dex: true,
9391 unsafe_ignore_missing_latest_api: true,
9392 }
9393 `)
9394 })
9395
9396 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9397 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9398 RunTestWithBp(t, `
9399 apex {
9400 name: "myapex",
9401 key: "myapex.key",
9402 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9403 min_sdk_version: "30",
9404 updatable: false,
9405 }
9406
9407 apex_key {
9408 name: "myapex.key",
9409 public_key: "testkey.avbpubkey",
9410 private_key: "testkey.pem",
9411 }
9412
9413 systemserverclasspath_fragment {
9414 name: "mysystemserverclasspathfragment",
9415 contents: ["mysystemserverclasspathlib"],
9416 apex_available: ["myapex"],
9417 }
9418
9419 java_sdk_library {
9420 name: "mysystemserverclasspathlib",
9421 srcs: ["mysystemserverclasspathlib.java"],
9422 apex_available: ["myapex"],
9423 compile_dex: true,
9424 unsafe_ignore_missing_latest_api: true,
9425 }
9426 `)
9427 })
9428}
9429
Jiakai Zhang6decef92022-01-12 17:56:19 +00009430// Verifies that the APEX depends on all the Make modules in the list.
9431func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9432 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9433 for _, dep := range deps {
9434 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9435 }
9436}
9437
9438// Verifies that the APEX does not depend on any of the Make modules in the list.
9439func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9440 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9441 for _, dep := range deps {
9442 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9443 }
9444}
9445
Spandan Das66773252022-01-15 00:23:18 +00009446func TestApexStrictUpdtabilityLint(t *testing.T) {
9447 bpTemplate := `
9448 apex {
9449 name: "myapex",
9450 key: "myapex.key",
9451 java_libs: ["myjavalib"],
9452 updatable: %v,
9453 min_sdk_version: "29",
9454 }
9455 apex_key {
9456 name: "myapex.key",
9457 }
9458 java_library {
9459 name: "myjavalib",
9460 srcs: ["MyClass.java"],
9461 apex_available: [ "myapex" ],
9462 lint: {
9463 strict_updatability_linting: %v,
9464 },
9465 sdk_version: "current",
9466 min_sdk_version: "29",
9467 }
9468 `
9469 fs := android.MockFS{
9470 "lint-baseline.xml": nil,
9471 }
9472
9473 testCases := []struct {
9474 testCaseName string
9475 apexUpdatable bool
9476 javaStrictUpdtabilityLint bool
9477 lintFileExists bool
9478 disallowedFlagExpected bool
9479 }{
9480 {
9481 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9482 apexUpdatable: true,
9483 javaStrictUpdtabilityLint: true,
9484 lintFileExists: false,
9485 disallowedFlagExpected: false,
9486 },
9487 {
9488 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9489 apexUpdatable: false,
9490 javaStrictUpdtabilityLint: false,
9491 lintFileExists: true,
9492 disallowedFlagExpected: false,
9493 },
9494 {
9495 testCaseName: "non-updatable apex respects strict updatability of javalib",
9496 apexUpdatable: false,
9497 javaStrictUpdtabilityLint: true,
9498 lintFileExists: true,
9499 disallowedFlagExpected: true,
9500 },
9501 {
9502 testCaseName: "updatable apex sets strict updatability of javalib to true",
9503 apexUpdatable: true,
9504 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9505 lintFileExists: true,
9506 disallowedFlagExpected: true,
9507 },
9508 }
9509
9510 for _, testCase := range testCases {
9511 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9512 fixtures := []android.FixturePreparer{}
9513 if testCase.lintFileExists {
9514 fixtures = append(fixtures, fs.AddToFixture())
9515 }
9516
9517 result := testApex(t, bp, fixtures...)
9518 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9519 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9520 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9521
9522 if disallowedFlagActual != testCase.disallowedFlagExpected {
9523 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9524 }
9525 }
9526}
9527
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009528func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9529 bp := `
9530 apex {
9531 name: "myapex",
9532 key: "myapex.key",
9533 java_libs: ["myjavalib"],
9534 updatable: true,
9535 min_sdk_version: "29",
9536 }
9537 apex_key {
9538 name: "myapex.key",
9539 }
9540 java_library {
9541 name: "myjavalib",
9542 srcs: ["MyClass.java"],
9543 apex_available: [ "myapex" ],
9544 sdk_version: "current",
9545 min_sdk_version: "29",
9546 }
9547 `
9548
9549 testCases := []struct {
9550 testCaseName string
9551 moduleDirectory string
9552 disallowedFlagExpected bool
9553 }{
9554 {
9555 testCaseName: "lintable module defined outside libcore",
9556 moduleDirectory: "",
9557 disallowedFlagExpected: true,
9558 },
9559 {
9560 testCaseName: "lintable module defined in libcore root directory",
9561 moduleDirectory: "libcore/",
9562 disallowedFlagExpected: false,
9563 },
9564 {
9565 testCaseName: "lintable module defined in libcore child directory",
9566 moduleDirectory: "libcore/childdir/",
9567 disallowedFlagExpected: true,
9568 },
9569 }
9570
9571 for _, testCase := range testCases {
9572 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9573 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9574 result := testApex(t, "", lintFileCreator, bpFileCreator)
9575 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9576 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9577 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9578 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9579
9580 if disallowedFlagActual != testCase.disallowedFlagExpected {
9581 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9582 }
9583 }
9584}
9585
Spandan Das66773252022-01-15 00:23:18 +00009586// checks transtive deps of an apex coming from bootclasspath_fragment
9587func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9588 bp := `
9589 apex {
9590 name: "myapex",
9591 key: "myapex.key",
9592 bootclasspath_fragments: ["mybootclasspathfragment"],
9593 updatable: true,
9594 min_sdk_version: "29",
9595 }
9596 apex_key {
9597 name: "myapex.key",
9598 }
9599 bootclasspath_fragment {
9600 name: "mybootclasspathfragment",
9601 contents: ["myjavalib"],
9602 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009603 hidden_api: {
9604 split_packages: ["*"],
9605 },
Spandan Das66773252022-01-15 00:23:18 +00009606 }
9607 java_library {
9608 name: "myjavalib",
9609 srcs: ["MyClass.java"],
9610 apex_available: [ "myapex" ],
9611 sdk_version: "current",
9612 min_sdk_version: "29",
9613 compile_dex: true,
9614 }
9615 `
9616 fs := android.MockFS{
9617 "lint-baseline.xml": nil,
9618 }
9619
9620 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9621 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9622 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9623 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9624 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9625 }
9626}
9627
Spandan Das42e89502022-05-06 22:12:55 +00009628// updatable apexes should propagate updatable=true to its apps
9629func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9630 bp := `
9631 apex {
9632 name: "myapex",
9633 key: "myapex.key",
9634 updatable: %v,
9635 apps: [
9636 "myapp",
9637 ],
9638 min_sdk_version: "30",
9639 }
9640 apex_key {
9641 name: "myapex.key",
9642 }
9643 android_app {
9644 name: "myapp",
9645 updatable: %v,
9646 apex_available: [
9647 "myapex",
9648 ],
9649 sdk_version: "current",
9650 min_sdk_version: "30",
9651 }
9652 `
9653 testCases := []struct {
9654 name string
9655 apex_is_updatable_bp bool
9656 app_is_updatable_bp bool
9657 app_is_updatable_expected bool
9658 }{
9659 {
9660 name: "Non-updatable apex respects updatable property of non-updatable app",
9661 apex_is_updatable_bp: false,
9662 app_is_updatable_bp: false,
9663 app_is_updatable_expected: false,
9664 },
9665 {
9666 name: "Non-updatable apex respects updatable property of updatable app",
9667 apex_is_updatable_bp: false,
9668 app_is_updatable_bp: true,
9669 app_is_updatable_expected: true,
9670 },
9671 {
9672 name: "Updatable apex respects updatable property of updatable app",
9673 apex_is_updatable_bp: true,
9674 app_is_updatable_bp: true,
9675 app_is_updatable_expected: true,
9676 },
9677 {
9678 name: "Updatable apex sets updatable=true on non-updatable app",
9679 apex_is_updatable_bp: true,
9680 app_is_updatable_bp: false,
9681 app_is_updatable_expected: true,
9682 },
9683 }
9684 for _, testCase := range testCases {
9685 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9686 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9687 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9688 }
9689}
9690
Kiyoung Kim487689e2022-07-26 09:48:22 +09009691func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9692 bp := `
9693 apex {
9694 name: "myapex",
9695 key: "myapex.key",
9696 native_shared_libs: ["libfoo"],
9697 min_sdk_version: "29",
9698 }
9699 apex_key {
9700 name: "myapex.key",
9701 }
9702 cc_library {
9703 name: "libfoo",
9704 shared_libs: ["libc"],
9705 apex_available: ["myapex"],
9706 min_sdk_version: "29",
9707 }
9708 cc_api_library {
9709 name: "libc",
9710 src: "libc.so",
9711 min_sdk_version: "29",
9712 recovery_available: true,
9713 }
9714 api_imports {
9715 name: "api_imports",
9716 shared_libs: [
9717 "libc",
9718 ],
9719 header_libs: [],
9720 }
9721 `
9722 result := testApex(t, bp)
9723
9724 hasDep := func(m android.Module, wantDep android.Module) bool {
9725 t.Helper()
9726 var found bool
9727 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9728 if dep == wantDep {
9729 found = true
9730 }
9731 })
9732 return found
9733 }
9734
9735 libfooApexVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex29").Module()
9736 libcApexVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared_apex29").Module()
9737
9738 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(libfooApexVariant, libcApexVariant))
9739
9740 // libfoo core variant should be buildable in the same inner tree since
9741 // certain mcombo files might build system and apexes in the same inner tree
9742 // libfoo core variant should link against source libc
9743 libfooCoreVariant := result.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
9744 libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
9745 android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
9746}