blob: c546fa13c11e975fe3f87a792156a195d6f73a9e [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jiyong Park25fc6a92018-11-18 18:02:45 +090019 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Paul Duffin37856732021-02-26 14:24:15 +000021 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070022 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010023 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
29 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Paul Duffin40b62572021-03-20 11:39:01 +000051func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090052 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010053 android.GroupFixturePreparers(
54 prepareForApexTest,
55 android.GroupFixturePreparers(preparers...),
56 ).
Paul Duffine05480a2021-03-08 15:07:14 +000057 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000058 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090059}
60
Paul Duffin40b62572021-03-20 11:39:01 +000061func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090062 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010063
64 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000065 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010066 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000067 }
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 result := android.GroupFixturePreparers(
70 prepareForApexTest,
71 android.GroupFixturePreparers(preparers...),
72 optionalBpPreparer,
73 ).RunTest(t)
74
Paul Duffine05480a2021-03-08 15:07:14 +000075 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Paul Duffin810f33d2021-03-09 14:12:32 +000078func withFiles(files android.MockFS) android.FixturePreparer {
79 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090080}
81
Paul Duffin810f33d2021-03-09 14:12:32 +000082func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
83 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090084 for k, v := range targets {
85 config.Targets[k] = v
86 }
Paul Duffin810f33d2021-03-09 14:12:32 +000087 })
Jooyung Han344d5432019-08-23 11:17:39 +090088}
89
Jooyung Han35155c42020-02-06 17:33:20 +090090// withNativeBridgeTargets sets configuration with targets including:
91// - X86_64 (primary)
92// - X86 (secondary)
93// - Arm64 on X86_64 (native bridge)
94// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000095var withNativeBridgeEnabled = android.FixtureModifyConfig(
96 func(config android.Config) {
97 config.Targets[android.Android] = []android.Target{
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
106 }
107 },
108)
109
110func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
111 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
112 variables.ManifestPackageNameOverrides = specs
113 })
Jooyung Han35155c42020-02-06 17:33:20 +0900114}
115
Paul Duffin810f33d2021-03-09 14:12:32 +0000116var withBinder32bit = android.FixtureModifyProductVariables(
117 func(variables android.FixtureProductVariables) {
118 variables.Binder32bit = proptools.BoolPtr(true)
119 },
120)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900121
Paul Duffin810f33d2021-03-09 14:12:32 +0000122var withUnbundledBuild = android.FixtureModifyProductVariables(
123 func(variables android.FixtureProductVariables) {
124 variables.Unbundled_build = proptools.BoolPtr(true)
125 },
126)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900127
Paul Duffin284165a2021-03-29 01:50:31 +0100128// Legacy preparer used for running tests within the apex package.
129//
130// This includes everything that was needed to run any test in the apex package prior to the
131// introduction of the test fixtures. Tests that are being converted to use fixtures directly
132// rather than through the testApex...() methods should avoid using this and instead use the
133// various preparers directly, using android.GroupFixturePreparers(...) to group them when
134// necessary.
135//
136// deprecated
137var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000138 // General preparers in alphabetical order as test infrastructure will enforce correct
139 // registration order.
140 android.PrepareForTestWithAndroidBuildComponents,
141 bpf.PrepareForTestWithBpf,
142 cc.PrepareForTestWithCcBuildComponents,
143 java.PrepareForTestWithJavaDefaultModules,
144 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
145 rust.PrepareForTestWithRustDefaultModules,
146 sh.PrepareForTestWithShBuildComponents,
147
148 PrepareForTestWithApexBuildComponents,
149
150 // Additional apex test specific preparers.
151 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
152 filegroup {
153 name: "myapex-file_contexts",
154 srcs: [
155 "apex/myapex-file_contexts",
156 ],
157 }
158 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000159 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000160 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000161 "a.java": nil,
162 "PrebuiltAppFoo.apk": nil,
163 "PrebuiltAppFooPriv.apk": nil,
164 "apex_manifest.json": nil,
165 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000166 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
167 "system/sepolicy/apex/myapex2-file_contexts": nil,
168 "system/sepolicy/apex/otherapex-file_contexts": nil,
169 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
170 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
171 "mylib.cpp": nil,
172 "mytest.cpp": nil,
173 "mytest1.cpp": nil,
174 "mytest2.cpp": nil,
175 "mytest3.cpp": nil,
176 "myprebuilt": nil,
177 "my_include": nil,
178 "foo/bar/MyClass.java": nil,
179 "prebuilt.jar": nil,
180 "prebuilt.so": nil,
181 "vendor/foo/devkeys/test.x509.pem": nil,
182 "vendor/foo/devkeys/test.pk8": nil,
183 "testkey.x509.pem": nil,
184 "testkey.pk8": nil,
185 "testkey.override.x509.pem": nil,
186 "testkey.override.pk8": nil,
187 "vendor/foo/devkeys/testkey.avbpubkey": nil,
188 "vendor/foo/devkeys/testkey.pem": nil,
189 "NOTICE": nil,
190 "custom_notice": nil,
191 "custom_notice_for_static_lib": nil,
192 "testkey2.avbpubkey": nil,
193 "testkey2.pem": nil,
194 "myapex-arm64.apex": nil,
195 "myapex-arm.apex": nil,
196 "myapex.apks": nil,
197 "frameworks/base/api/current.txt": nil,
198 "framework/aidl/a.aidl": nil,
199 "build/make/core/proguard.flags": nil,
200 "build/make/core/proguard_basic_keeps.flags": nil,
201 "dummy.txt": nil,
202 "baz": nil,
203 "bar/baz": nil,
204 "testdata/baz": nil,
205 "AppSet.apks": nil,
206 "foo.rs": nil,
207 "libfoo.jar": nil,
208 "libbar.jar": nil,
209 },
210 ),
211
212 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
213 variables.DeviceVndkVersion = proptools.StringPtr("current")
214 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
215 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
216 variables.Platform_sdk_codename = proptools.StringPtr("Q")
217 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000218 // "Tiramisu" needs to be in the next line for compatibility with soong code,
219 // not because of these tests specifically (it's not used by the tests)
220 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900221 variables.Platform_vndk_version = proptools.StringPtr("29")
Paul Duffin37aad602021-03-08 09:47:16 +0000222 }),
223)
224
Paul Duffin52bfaa42021-03-23 23:40:12 +0000225var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
226 "system/sepolicy/apex/myapex-file_contexts": nil,
227})
228
Jooyung Han643adc42020-02-27 13:50:06 +0900229// ensure that 'result' equals 'expected'
230func ensureEquals(t *testing.T, result string, expected string) {
231 t.Helper()
232 if result != expected {
233 t.Errorf("%q != %q", expected, result)
234 }
235}
236
Jiyong Park25fc6a92018-11-18 18:02:45 +0900237// ensure that 'result' contains 'expected'
238func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900239 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900240 if !strings.Contains(result, expected) {
241 t.Errorf("%q is not found in %q", expected, result)
242 }
243}
244
Liz Kammer5bd365f2020-05-27 15:15:11 -0700245// ensure that 'result' contains 'expected' exactly one time
246func ensureContainsOnce(t *testing.T, result string, expected string) {
247 t.Helper()
248 count := strings.Count(result, expected)
249 if count != 1 {
250 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
251 }
252}
253
Jiyong Park25fc6a92018-11-18 18:02:45 +0900254// ensures that 'result' does not contain 'notExpected'
255func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900256 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900257 if strings.Contains(result, notExpected) {
258 t.Errorf("%q is found in %q", notExpected, result)
259 }
260}
261
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700262func ensureMatches(t *testing.T, result string, expectedRex string) {
263 ok, err := regexp.MatchString(expectedRex, result)
264 if err != nil {
265 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
266 return
267 }
268 if !ok {
269 t.Errorf("%s does not match regular expession %s", result, expectedRex)
270 }
271}
272
Jiyong Park25fc6a92018-11-18 18:02:45 +0900273func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900274 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275 if !android.InList(expected, result) {
276 t.Errorf("%q is not found in %v", expected, result)
277 }
278}
279
280func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900281 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282 if android.InList(notExpected, result) {
283 t.Errorf("%q is found in %v", notExpected, result)
284 }
285}
286
Jooyung Hane1633032019-08-01 17:41:43 +0900287func ensureListEmpty(t *testing.T, result []string) {
288 t.Helper()
289 if len(result) > 0 {
290 t.Errorf("%q is expected to be empty", result)
291 }
292}
293
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000294func ensureListNotEmpty(t *testing.T, result []string) {
295 t.Helper()
296 if len(result) == 0 {
297 t.Errorf("%q is expected to be not empty", result)
298 }
299}
300
Jiyong Park25fc6a92018-11-18 18:02:45 +0900301// Minimal test
302func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800303 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900304 apex_defaults {
305 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900306 manifest: ":myapex.manifest",
307 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900308 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900309 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900310 native_shared_libs: [
311 "mylib",
312 "libfoo.ffi",
313 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900314 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800315 multilib: {
316 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900317 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800318 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900319 },
Jiyong Park77acec62020-06-01 21:39:15 +0900320 java_libs: [
321 "myjar",
322 "myjar_dex",
323 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000324 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325 }
326
Jiyong Park30ca9372019-02-07 16:27:23 +0900327 apex {
328 name: "myapex",
329 defaults: ["myapex-defaults"],
330 }
331
Jiyong Park25fc6a92018-11-18 18:02:45 +0900332 apex_key {
333 name: "myapex.key",
334 public_key: "testkey.avbpubkey",
335 private_key: "testkey.pem",
336 }
337
Jiyong Park809bb722019-02-13 21:33:49 +0900338 filegroup {
339 name: "myapex.manifest",
340 srcs: ["apex_manifest.json"],
341 }
342
343 filegroup {
344 name: "myapex.androidmanifest",
345 srcs: ["AndroidManifest.xml"],
346 }
347
Jiyong Park25fc6a92018-11-18 18:02:45 +0900348 cc_library {
349 name: "mylib",
350 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900351 shared_libs: [
352 "mylib2",
353 "libbar.ffi",
354 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 system_shared_libs: [],
356 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000357 // TODO: remove //apex_available:platform
358 apex_available: [
359 "//apex_available:platform",
360 "myapex",
361 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900362 }
363
Alex Light3d673592019-01-18 14:37:31 -0800364 cc_binary {
365 name: "foo",
366 srcs: ["mylib.cpp"],
367 compile_multilib: "both",
368 multilib: {
369 lib32: {
370 suffix: "32",
371 },
372 lib64: {
373 suffix: "64",
374 },
375 },
376 symlinks: ["foo_link_"],
377 symlink_preferred_arch: true,
378 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800379 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700380 apex_available: [ "myapex", "com.android.gki.*" ],
381 }
382
Jiyong Park99644e92020-11-17 22:21:02 +0900383 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000384 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900385 srcs: ["foo.rs"],
386 rlibs: ["libfoo.rlib.rust"],
387 dylibs: ["libfoo.dylib.rust"],
388 apex_available: ["myapex"],
389 }
390
391 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000392 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900393 srcs: ["foo.rs"],
394 crate_name: "foo",
395 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900396 shared_libs: ["libfoo.shared_from_rust"],
397 }
398
399 cc_library_shared {
400 name: "libfoo.shared_from_rust",
401 srcs: ["mylib.cpp"],
402 system_shared_libs: [],
403 stl: "none",
404 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900405 }
406
407 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000408 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900409 srcs: ["foo.rs"],
410 crate_name: "foo",
411 apex_available: ["myapex"],
412 }
413
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900414 rust_ffi_shared {
415 name: "libfoo.ffi",
416 srcs: ["foo.rs"],
417 crate_name: "foo",
418 apex_available: ["myapex"],
419 }
420
421 rust_ffi_shared {
422 name: "libbar.ffi",
423 srcs: ["foo.rs"],
424 crate_name: "bar",
425 apex_available: ["myapex"],
426 }
427
Yifan Hongd22a84a2020-07-28 17:37:46 -0700428 apex {
429 name: "com.android.gki.fake",
430 binaries: ["foo"],
431 key: "myapex.key",
432 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000433 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800434 }
435
Paul Duffindddd5462020-04-07 15:25:44 +0100436 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900437 name: "mylib2",
438 srcs: ["mylib.cpp"],
439 system_shared_libs: [],
440 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900441 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900442 static_libs: ["libstatic"],
443 // TODO: remove //apex_available:platform
444 apex_available: [
445 "//apex_available:platform",
446 "myapex",
447 ],
448 }
449
Paul Duffindddd5462020-04-07 15:25:44 +0100450 cc_prebuilt_library_shared {
451 name: "mylib2",
452 srcs: ["prebuilt.so"],
453 // TODO: remove //apex_available:platform
454 apex_available: [
455 "//apex_available:platform",
456 "myapex",
457 ],
458 }
459
Jiyong Park9918e1a2020-03-17 19:16:40 +0900460 cc_library_static {
461 name: "libstatic",
462 srcs: ["mylib.cpp"],
463 system_shared_libs: [],
464 stl: "none",
465 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000466 // TODO: remove //apex_available:platform
467 apex_available: [
468 "//apex_available:platform",
469 "myapex",
470 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900471 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900472
473 java_library {
474 name: "myjar",
475 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900476 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477 sdk_version: "none",
478 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900480 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000481 // TODO: remove //apex_available:platform
482 apex_available: [
483 "//apex_available:platform",
484 "myapex",
485 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900486 }
487
Jiyong Park77acec62020-06-01 21:39:15 +0900488 dex_import {
489 name: "myjar_dex",
490 jars: ["prebuilt.jar"],
491 apex_available: [
492 "//apex_available:platform",
493 "myapex",
494 ],
495 }
496
Jiyong Park7f7766d2019-07-25 22:02:35 +0900497 java_library {
498 name: "myotherjar",
499 srcs: ["foo/bar/MyClass.java"],
500 sdk_version: "none",
501 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900502 // TODO: remove //apex_available:platform
503 apex_available: [
504 "//apex_available:platform",
505 "myapex",
506 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900507 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900508
509 java_library {
510 name: "mysharedjar",
511 srcs: ["foo/bar/MyClass.java"],
512 sdk_version: "none",
513 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900514 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900515 `)
516
Paul Duffina71a67a2021-03-29 00:42:57 +0100517 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900518
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900519 // Make sure that Android.mk is created
520 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700521 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900522 var builder strings.Builder
523 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
524
525 androidMk := builder.String()
526 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
527 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
528
Jiyong Park42cca6c2019-04-01 11:15:50 +0900529 optFlags := apexRule.Args["opt_flags"]
530 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700531 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100532 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533
Jiyong Park25fc6a92018-11-18 18:02:45 +0900534 copyCmds := apexRule.Args["copy_commands"]
535
536 // Ensure that main rule creates an output
537 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
538
539 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700540 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
542 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900543 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900544 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900545
546 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700547 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
550 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900552 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900553
554 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800555 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
556 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900557 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900558 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900559 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900560 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
561 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900562 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900563 // .. but not for java libs
564 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900565 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800566
Colin Cross7113d202019-11-20 16:39:12 -0800567 // Ensure that the platform variant ends with _shared or _common
568 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
569 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900570 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
571 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900572 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
573
574 // Ensure that dynamic dependency to java libs are not included
575 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800576
577 // Ensure that all symlinks are present.
578 found_foo_link_64 := false
579 found_foo := false
580 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900581 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800582 if strings.HasSuffix(cmd, "bin/foo") {
583 found_foo = true
584 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
585 found_foo_link_64 = true
586 }
587 }
588 }
589 good := found_foo && found_foo_link_64
590 if !good {
591 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
592 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900593
Sundong Ahnabb64432019-10-22 13:58:29 +0900594 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700595 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900596 if len(noticeInputs) != 3 {
597 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900598 }
599 ensureListContains(t, noticeInputs, "NOTICE")
600 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900601 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900602
Artur Satayeva8bd1132020-04-27 18:07:06 +0100603 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
606 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
607 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100608
609 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100611 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
612 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
613 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800614}
615
Jooyung Hanf21c7972019-12-16 22:32:06 +0900616func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800617 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900618 apex_defaults {
619 name: "myapex-defaults",
620 key: "myapex.key",
621 prebuilts: ["myetc"],
622 native_shared_libs: ["mylib"],
623 java_libs: ["myjar"],
624 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900625 rros: ["rro"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800626 bpfs: ["bpf", "netd_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000627 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900628 }
629
630 prebuilt_etc {
631 name: "myetc",
632 src: "myprebuilt",
633 }
634
635 apex {
636 name: "myapex",
637 defaults: ["myapex-defaults"],
638 }
639
640 apex_key {
641 name: "myapex.key",
642 public_key: "testkey.avbpubkey",
643 private_key: "testkey.pem",
644 }
645
646 cc_library {
647 name: "mylib",
648 system_shared_libs: [],
649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000650 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900651 }
652
653 java_library {
654 name: "myjar",
655 srcs: ["foo/bar/MyClass.java"],
656 sdk_version: "none",
657 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000658 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900659 }
660
661 android_app {
662 name: "AppFoo",
663 srcs: ["foo/bar/MyClass.java"],
664 sdk_version: "none",
665 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000666 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900667 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900668
669 runtime_resource_overlay {
670 name: "rro",
671 theme: "blue",
672 }
673
markchien2f59ec92020-09-02 16:23:38 +0800674 bpf {
675 name: "bpf",
676 srcs: ["bpf.c", "bpf2.c"],
677 }
678
Ken Chenfad7f9d2021-11-10 22:02:57 +0800679 bpf {
680 name: "netd_test",
681 srcs: ["netd_test.c"],
682 sub_dir: "netd",
683 }
684
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000686 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900687 "etc/myetc",
688 "javalib/myjar.jar",
689 "lib64/mylib.so",
690 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900691 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800692 "etc/bpf/bpf.o",
693 "etc/bpf/bpf2.o",
Ken Chenfad7f9d2021-11-10 22:02:57 +0800694 "etc/bpf/netd/netd_test.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 })
696}
697
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800699 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900700 apex {
701 name: "myapex",
702 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000703 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900704 }
705
706 apex_key {
707 name: "myapex.key",
708 public_key: "testkey.avbpubkey",
709 private_key: "testkey.pem",
710 }
711 `)
712
713 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900714 args := module.Rule("apexRule").Args
715 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
716 t.Error("manifest should be apex_manifest.pb, but " + manifest)
717 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900718}
719
Liz Kammer4854a7d2021-05-27 14:28:27 -0400720func TestApexManifestMinSdkVersion(t *testing.T) {
721 ctx := testApex(t, `
722 apex_defaults {
723 name: "my_defaults",
724 key: "myapex.key",
725 product_specific: true,
726 file_contexts: ":my-file-contexts",
727 updatable: false,
728 }
729 apex {
730 name: "myapex_30",
731 min_sdk_version: "30",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_current",
737 min_sdk_version: "current",
738 defaults: ["my_defaults"],
739 }
740
741 apex {
742 name: "myapex_none",
743 defaults: ["my_defaults"],
744 }
745
746 apex_key {
747 name: "myapex.key",
748 public_key: "testkey.avbpubkey",
749 private_key: "testkey.pem",
750 }
751
752 filegroup {
753 name: "my-file-contexts",
754 srcs: ["product_specific_file_contexts"],
755 }
756 `, withFiles(map[string][]byte{
757 "product_specific_file_contexts": nil,
758 }), android.FixtureModifyProductVariables(
759 func(variables android.FixtureProductVariables) {
760 variables.Unbundled_build = proptools.BoolPtr(true)
761 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
762 }), android.FixtureMergeEnv(map[string]string{
763 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
764 }))
765
766 testCases := []struct {
767 module string
768 minSdkVersion string
769 }{
770 {
771 module: "myapex_30",
772 minSdkVersion: "30",
773 },
774 {
775 module: "myapex_current",
776 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
777 },
778 {
779 module: "myapex_none",
780 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
781 },
782 }
783 for _, tc := range testCases {
784 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
785 args := module.Rule("apexRule").Args
786 optFlags := args["opt_flags"]
787 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
788 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
789 }
790 }
791}
792
Alex Light5098a612018-11-29 17:12:15 -0800793func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800794 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800795 apex {
796 name: "myapex",
797 key: "myapex.key",
798 payload_type: "zip",
799 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000800 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800801 }
802
803 apex_key {
804 name: "myapex.key",
805 public_key: "testkey.avbpubkey",
806 private_key: "testkey.pem",
807 }
808
809 cc_library {
810 name: "mylib",
811 srcs: ["mylib.cpp"],
812 shared_libs: ["mylib2"],
813 system_shared_libs: [],
814 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000815 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800816 }
817
818 cc_library {
819 name: "mylib2",
820 srcs: ["mylib.cpp"],
821 system_shared_libs: [],
822 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000823 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800824 }
825 `)
826
Sundong Ahnabb64432019-10-22 13:58:29 +0900827 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800828 copyCmds := zipApexRule.Args["copy_commands"]
829
830 // Ensure that main rule creates an output
831 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
832
833 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700834 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800835
836 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700837 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800838
839 // Ensure that both direct and indirect deps are copied into apex
840 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
841 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900842}
843
844func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800845 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900846 apex {
847 name: "myapex",
848 key: "myapex.key",
849 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900850 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000851 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900852 }
853
854 apex_key {
855 name: "myapex.key",
856 public_key: "testkey.avbpubkey",
857 private_key: "testkey.pem",
858 }
859
860 cc_library {
861 name: "mylib",
862 srcs: ["mylib.cpp"],
863 shared_libs: ["mylib2", "mylib3"],
864 system_shared_libs: [],
865 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000866 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 }
868
869 cc_library {
870 name: "mylib2",
871 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900872 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873 system_shared_libs: [],
874 stl: "none",
875 stubs: {
876 versions: ["1", "2", "3"],
877 },
878 }
879
880 cc_library {
881 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900882 srcs: ["mylib.cpp"],
883 shared_libs: ["mylib4"],
884 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900885 stl: "none",
886 stubs: {
887 versions: ["10", "11", "12"],
888 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000889 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900890 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900891
892 cc_library {
893 name: "mylib4",
894 srcs: ["mylib.cpp"],
895 system_shared_libs: [],
896 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000897 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900898 }
Jiyong Park105dc322021-06-11 17:22:09 +0900899
900 rust_binary {
901 name: "foo.rust",
902 srcs: ["foo.rs"],
903 shared_libs: ["libfoo.shared_from_rust"],
904 prefer_rlib: true,
905 apex_available: ["myapex"],
906 }
907
908 cc_library_shared {
909 name: "libfoo.shared_from_rust",
910 srcs: ["mylib.cpp"],
911 system_shared_libs: [],
912 stl: "none",
913 stubs: {
914 versions: ["10", "11", "12"],
915 },
916 }
917
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918 `)
919
Sundong Ahnabb64432019-10-22 13:58:29 +0900920 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 copyCmds := apexRule.Args["copy_commands"]
922
923 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800924 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900925
926 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800927 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928
929 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800930 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931
Colin Crossaede88c2020-08-11 12:17:01 -0700932 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900933
934 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900935 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900937 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900938
939 // 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 -0700940 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900941 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700942 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900943
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700944 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
945 // is replaced by sharing of "cFlags" in cc/builder.go.
946 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
947 // module variable representing "cflags". So it was not detected by ensureNotContains.
948 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
949 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
950 // including the original cflags's "-include mylib.h".
951 //
Jiyong Park64379952018-12-13 18:37:29 +0900952 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700953 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
954 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900955
956 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700957 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900958
Jooyung Hana57af4a2020-01-23 05:36:59 +0000959 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900960 "lib64/mylib.so",
961 "lib64/mylib3.so",
962 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900963 "bin/foo.rust",
964 "lib64/libc++.so", // by the implicit dependency from foo.rust
965 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900966 })
Jiyong Park105dc322021-06-11 17:22:09 +0900967
968 // Ensure that stub dependency from a rust module is not included
969 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
970 // The rust module is linked to the stub cc library
971 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
972 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
973 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900974}
975
Jiyong Park1bc84122021-06-22 20:23:05 +0900976func TestApexCanUsePrivateApis(t *testing.T) {
977 ctx := testApex(t, `
978 apex {
979 name: "myapex",
980 key: "myapex.key",
981 native_shared_libs: ["mylib"],
982 binaries: ["foo.rust"],
983 updatable: false,
984 platform_apis: true,
985 }
986
987 apex_key {
988 name: "myapex.key",
989 public_key: "testkey.avbpubkey",
990 private_key: "testkey.pem",
991 }
992
993 cc_library {
994 name: "mylib",
995 srcs: ["mylib.cpp"],
996 shared_libs: ["mylib2"],
997 system_shared_libs: [],
998 stl: "none",
999 apex_available: [ "myapex" ],
1000 }
1001
1002 cc_library {
1003 name: "mylib2",
1004 srcs: ["mylib.cpp"],
1005 cflags: ["-include mylib.h"],
1006 system_shared_libs: [],
1007 stl: "none",
1008 stubs: {
1009 versions: ["1", "2", "3"],
1010 },
1011 }
1012
1013 rust_binary {
1014 name: "foo.rust",
1015 srcs: ["foo.rs"],
1016 shared_libs: ["libfoo.shared_from_rust"],
1017 prefer_rlib: true,
1018 apex_available: ["myapex"],
1019 }
1020
1021 cc_library_shared {
1022 name: "libfoo.shared_from_rust",
1023 srcs: ["mylib.cpp"],
1024 system_shared_libs: [],
1025 stl: "none",
1026 stubs: {
1027 versions: ["10", "11", "12"],
1028 },
1029 }
1030 `)
1031
1032 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1033 copyCmds := apexRule.Args["copy_commands"]
1034
1035 // Ensure that indirect stubs dep is not included
1036 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1037 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1038
1039 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1040 // of the platform_apis: true)
1041 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000_private").Rule("ld").Args["libFlags"]
1042 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1043 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1044 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000_private").Rule("rustc").Args["linkFlags"]
1045 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1046 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1047}
1048
Colin Cross7812fd32020-09-25 12:35:10 -07001049func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1050 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001051 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001052 apex {
1053 name: "myapex",
1054 key: "myapex.key",
1055 native_shared_libs: ["mylib", "mylib3"],
1056 min_sdk_version: "29",
1057 }
1058
1059 apex_key {
1060 name: "myapex.key",
1061 public_key: "testkey.avbpubkey",
1062 private_key: "testkey.pem",
1063 }
1064
1065 cc_library {
1066 name: "mylib",
1067 srcs: ["mylib.cpp"],
1068 shared_libs: ["mylib2", "mylib3"],
1069 system_shared_libs: [],
1070 stl: "none",
1071 apex_available: [ "myapex" ],
1072 min_sdk_version: "28",
1073 }
1074
1075 cc_library {
1076 name: "mylib2",
1077 srcs: ["mylib.cpp"],
1078 cflags: ["-include mylib.h"],
1079 system_shared_libs: [],
1080 stl: "none",
1081 stubs: {
1082 versions: ["28", "29", "30", "current"],
1083 },
1084 min_sdk_version: "28",
1085 }
1086
1087 cc_library {
1088 name: "mylib3",
1089 srcs: ["mylib.cpp"],
1090 shared_libs: ["mylib4"],
1091 system_shared_libs: [],
1092 stl: "none",
1093 stubs: {
1094 versions: ["28", "29", "30", "current"],
1095 },
1096 apex_available: [ "myapex" ],
1097 min_sdk_version: "28",
1098 }
1099
1100 cc_library {
1101 name: "mylib4",
1102 srcs: ["mylib.cpp"],
1103 system_shared_libs: [],
1104 stl: "none",
1105 apex_available: [ "myapex" ],
1106 min_sdk_version: "28",
1107 }
1108 `)
1109
1110 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1111 copyCmds := apexRule.Args["copy_commands"]
1112
1113 // Ensure that direct non-stubs dep is always included
1114 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1115
1116 // Ensure that indirect stubs dep is not included
1117 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1118
1119 // Ensure that direct stubs dep is included
1120 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1121
1122 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1123
Jiyong Park55549df2021-02-26 23:57:23 +09001124 // Ensure that mylib is linking with the latest version of stub for mylib2
1125 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001126 // ... and not linking to the non-stub (impl) variant of mylib2
1127 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1128
1129 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1130 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1131 // .. and not linking to the stubs variant of mylib3
1132 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1133
1134 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001135 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001136 ensureNotContains(t, mylib2Cflags, "-include ")
1137
1138 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -07001139 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -07001140
1141 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1142 "lib64/mylib.so",
1143 "lib64/mylib3.so",
1144 "lib64/mylib4.so",
1145 })
1146}
1147
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001148func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1149 t.Parallel()
1150 // myapex (Z)
1151 // mylib -----------------.
1152 // |
1153 // otherapex (29) |
1154 // libstub's versions: 29 Z current
1155 // |
1156 // <platform> |
1157 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001158 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001159 apex {
1160 name: "myapex",
1161 key: "myapex.key",
1162 native_shared_libs: ["mylib"],
1163 min_sdk_version: "Z", // non-final
1164 }
1165
1166 cc_library {
1167 name: "mylib",
1168 srcs: ["mylib.cpp"],
1169 shared_libs: ["libstub"],
1170 apex_available: ["myapex"],
1171 min_sdk_version: "Z",
1172 }
1173
1174 apex_key {
1175 name: "myapex.key",
1176 public_key: "testkey.avbpubkey",
1177 private_key: "testkey.pem",
1178 }
1179
1180 apex {
1181 name: "otherapex",
1182 key: "myapex.key",
1183 native_shared_libs: ["libstub"],
1184 min_sdk_version: "29",
1185 }
1186
1187 cc_library {
1188 name: "libstub",
1189 srcs: ["mylib.cpp"],
1190 stubs: {
1191 versions: ["29", "Z", "current"],
1192 },
1193 apex_available: ["otherapex"],
1194 min_sdk_version: "29",
1195 }
1196
1197 // platform module depending on libstub from otherapex should use the latest stub("current")
1198 cc_library {
1199 name: "libplatform",
1200 srcs: ["mylib.cpp"],
1201 shared_libs: ["libstub"],
1202 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001203 `,
1204 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1205 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1206 variables.Platform_sdk_final = proptools.BoolPtr(false)
1207 variables.Platform_version_active_codenames = []string{"Z"}
1208 }),
1209 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001210
Jiyong Park55549df2021-02-26 23:57:23 +09001211 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001212 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001213 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001214 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001215 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001216
1217 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1218 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1219 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1220 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1221 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1222}
1223
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001224func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001225 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001226 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001227 name: "myapex2",
1228 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001230 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001231 }
1232
1233 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001234 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001235 public_key: "testkey.avbpubkey",
1236 private_key: "testkey.pem",
1237 }
1238
1239 cc_library {
1240 name: "mylib",
1241 srcs: ["mylib.cpp"],
1242 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001243 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001244 system_shared_libs: [],
1245 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001246 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001247 }
1248
1249 cc_library {
1250 name: "libfoo",
1251 srcs: ["mylib.cpp"],
1252 shared_libs: ["libbar"],
1253 system_shared_libs: [],
1254 stl: "none",
1255 stubs: {
1256 versions: ["10", "20", "30"],
1257 },
1258 }
1259
1260 cc_library {
1261 name: "libbar",
1262 srcs: ["mylib.cpp"],
1263 system_shared_libs: [],
1264 stl: "none",
1265 }
1266
Jiyong Park678c8812020-02-07 17:25:49 +09001267 cc_library_static {
1268 name: "libbaz",
1269 srcs: ["mylib.cpp"],
1270 system_shared_libs: [],
1271 stl: "none",
1272 apex_available: [ "myapex2" ],
1273 }
1274
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001275 `)
1276
Jiyong Park83dc74b2020-01-14 18:38:44 +09001277 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278 copyCmds := apexRule.Args["copy_commands"]
1279
1280 // Ensure that direct non-stubs dep is always included
1281 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1282
1283 // Ensure that indirect stubs dep is not included
1284 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1285
1286 // Ensure that dependency of stubs is not included
1287 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1288
Colin Crossaede88c2020-08-11 12:17:01 -07001289 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001290
1291 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001292 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001293 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001294 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001295
Jiyong Park3ff16992019-12-27 14:11:47 +09001296 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001297
1298 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1299 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001300
Artur Satayeva8bd1132020-04-27 18:07:06 +01001301 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001302 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001303
Artur Satayeva8bd1132020-04-27 18:07:06 +01001304 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001305 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001306}
1307
Jooyung Hand3639552019-08-09 12:57:43 +09001308func TestApexWithRuntimeLibsDependency(t *testing.T) {
1309 /*
1310 myapex
1311 |
1312 v (runtime_libs)
1313 mylib ------+------> libfoo [provides stub]
1314 |
1315 `------> libbar
1316 */
Colin Cross1c460562021-02-16 17:55:47 -08001317 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001318 apex {
1319 name: "myapex",
1320 key: "myapex.key",
1321 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001322 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001323 }
1324
1325 apex_key {
1326 name: "myapex.key",
1327 public_key: "testkey.avbpubkey",
1328 private_key: "testkey.pem",
1329 }
1330
1331 cc_library {
1332 name: "mylib",
1333 srcs: ["mylib.cpp"],
1334 runtime_libs: ["libfoo", "libbar"],
1335 system_shared_libs: [],
1336 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001337 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001338 }
1339
1340 cc_library {
1341 name: "libfoo",
1342 srcs: ["mylib.cpp"],
1343 system_shared_libs: [],
1344 stl: "none",
1345 stubs: {
1346 versions: ["10", "20", "30"],
1347 },
1348 }
1349
1350 cc_library {
1351 name: "libbar",
1352 srcs: ["mylib.cpp"],
1353 system_shared_libs: [],
1354 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001355 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001356 }
1357
1358 `)
1359
Sundong Ahnabb64432019-10-22 13:58:29 +09001360 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001361 copyCmds := apexRule.Args["copy_commands"]
1362
1363 // Ensure that direct non-stubs dep is always included
1364 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1365
1366 // Ensure that indirect stubs dep is not included
1367 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1368
1369 // Ensure that runtime_libs dep in included
1370 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1371
Sundong Ahnabb64432019-10-22 13:58:29 +09001372 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001373 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1374 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001375
1376}
1377
Paul Duffina02cae32021-03-09 01:44:06 +00001378var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1379 cc.PrepareForTestWithCcBuildComponents,
1380 PrepareForTestWithApexBuildComponents,
1381 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001382 apex {
1383 name: "com.android.runtime",
1384 key: "com.android.runtime.key",
1385 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001386 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001387 }
1388
1389 apex_key {
1390 name: "com.android.runtime.key",
1391 public_key: "testkey.avbpubkey",
1392 private_key: "testkey.pem",
1393 }
Paul Duffina02cae32021-03-09 01:44:06 +00001394 `),
1395 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1396)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001397
Paul Duffina02cae32021-03-09 01:44:06 +00001398func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001399 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001400 cc_library {
1401 name: "libc",
1402 no_libcrt: true,
1403 nocrt: true,
1404 stl: "none",
1405 system_shared_libs: [],
1406 stubs: { versions: ["1"] },
1407 apex_available: ["com.android.runtime"],
1408
1409 sanitize: {
1410 hwaddress: true,
1411 }
1412 }
1413
1414 cc_prebuilt_library_shared {
1415 name: "libclang_rt.hwasan-aarch64-android",
1416 no_libcrt: true,
1417 nocrt: true,
1418 stl: "none",
1419 system_shared_libs: [],
1420 srcs: [""],
1421 stubs: { versions: ["1"] },
1422
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
1434 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1435
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 {
1462 name: "libclang_rt.hwasan-aarch64-android",
1463 no_libcrt: true,
1464 nocrt: true,
1465 stl: "none",
1466 system_shared_libs: [],
1467 srcs: [""],
1468 stubs: { versions: ["1"] },
1469
1470 sanitize: {
1471 never: true,
1472 },
1473 }
Paul Duffina02cae32021-03-09 01:44:06 +00001474 `)
1475 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001476
1477 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1478 "lib64/bionic/libc.so",
1479 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1480 })
1481
1482 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1483
1484 installed := hwasan.Description("install libclang_rt.hwasan")
1485 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1486
1487 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1488 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1489 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1490}
1491
Jooyung Han61b66e92020-03-21 14:21:46 +00001492func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1493 testcases := []struct {
1494 name string
1495 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001496 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001497 shouldLink string
1498 shouldNotLink []string
1499 }{
1500 {
Jiyong Park55549df2021-02-26 23:57:23 +09001501 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001502 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001503 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001504 shouldLink: "current",
1505 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001506 },
1507 {
Jiyong Park55549df2021-02-26 23:57:23 +09001508 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001509 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001510 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001511 shouldLink: "current",
1512 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001513 },
1514 }
1515 for _, tc := range testcases {
1516 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001517 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001518 apex {
1519 name: "myapex",
1520 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001521 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001522 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001523 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001524 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001525
Jooyung Han61b66e92020-03-21 14:21:46 +00001526 apex_key {
1527 name: "myapex.key",
1528 public_key: "testkey.avbpubkey",
1529 private_key: "testkey.pem",
1530 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001531
Jooyung Han61b66e92020-03-21 14:21:46 +00001532 cc_library {
1533 name: "mylib",
1534 srcs: ["mylib.cpp"],
1535 vendor_available: true,
1536 shared_libs: ["libbar"],
1537 system_shared_libs: [],
1538 stl: "none",
1539 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001540 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001541 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001542
Jooyung Han61b66e92020-03-21 14:21:46 +00001543 cc_library {
1544 name: "libbar",
1545 srcs: ["mylib.cpp"],
1546 system_shared_libs: [],
1547 stl: "none",
1548 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001549 llndk: {
1550 symbol_file: "libbar.map.txt",
1551 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001552 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001553 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001554 withUnbundledBuild,
1555 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001556
Jooyung Han61b66e92020-03-21 14:21:46 +00001557 // Ensure that LLNDK dep is not included
1558 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1559 "lib64/mylib.so",
1560 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001561
Jooyung Han61b66e92020-03-21 14:21:46 +00001562 // Ensure that LLNDK dep is required
1563 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1564 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1565 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001566
Steven Moreland2c4000c2021-04-27 02:08:49 +00001567 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1568 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001569 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001570 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001571 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001572
Steven Moreland2c4000c2021-04-27 02:08:49 +00001573 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001574 ver := tc.shouldLink
1575 if tc.shouldLink == "current" {
1576 ver = strconv.Itoa(android.FutureApiLevelInt)
1577 }
1578 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001579 })
1580 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001581}
1582
Jiyong Park25fc6a92018-11-18 18:02:45 +09001583func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001584 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001585 apex {
1586 name: "myapex",
1587 key: "myapex.key",
1588 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001589 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001590 }
1591
1592 apex_key {
1593 name: "myapex.key",
1594 public_key: "testkey.avbpubkey",
1595 private_key: "testkey.pem",
1596 }
1597
1598 cc_library {
1599 name: "mylib",
1600 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001601 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001602 shared_libs: ["libdl#27"],
1603 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001604 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001605 }
1606
1607 cc_library_shared {
1608 name: "mylib_shared",
1609 srcs: ["mylib.cpp"],
1610 shared_libs: ["libdl#27"],
1611 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001612 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001613 }
1614
1615 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001616 name: "libBootstrap",
1617 srcs: ["mylib.cpp"],
1618 stl: "none",
1619 bootstrap: true,
1620 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001621 `)
1622
Sundong Ahnabb64432019-10-22 13:58:29 +09001623 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001624 copyCmds := apexRule.Args["copy_commands"]
1625
1626 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001627 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001628 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1629 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001630
1631 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001632 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001633
Colin Crossaede88c2020-08-11 12:17:01 -07001634 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1635 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1636 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001637
1638 // For dependency to libc
1639 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001640 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001641 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001642 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001643 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001644 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1645 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001646
1647 // For dependency to libm
1648 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001649 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001650 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001651 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001652 // ... and is not compiling with the stub
1653 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1654 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1655
1656 // For dependency to libdl
1657 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001658 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001659 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001660 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1661 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001662 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001663 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001664 // ... Cflags from stub is correctly exported to mylib
1665 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1666 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001667
1668 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001669 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1670 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1671 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1672 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001673}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001674
Jooyung Han749dc692020-04-15 11:03:39 +09001675func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001676 // there are three links between liba --> libz.
1677 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001678 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001679 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001680 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001681 apex {
1682 name: "myapex",
1683 key: "myapex.key",
1684 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001685 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001686 }
1687
1688 apex {
1689 name: "otherapex",
1690 key: "myapex.key",
1691 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001692 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001693 }
1694
1695 apex_key {
1696 name: "myapex.key",
1697 public_key: "testkey.avbpubkey",
1698 private_key: "testkey.pem",
1699 }
1700
1701 cc_library {
1702 name: "libx",
1703 shared_libs: ["liba"],
1704 system_shared_libs: [],
1705 stl: "none",
1706 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001707 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001708 }
1709
1710 cc_library {
1711 name: "liby",
1712 shared_libs: ["liba"],
1713 system_shared_libs: [],
1714 stl: "none",
1715 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001716 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001717 }
1718
1719 cc_library {
1720 name: "liba",
1721 shared_libs: ["libz"],
1722 system_shared_libs: [],
1723 stl: "none",
1724 apex_available: [
1725 "//apex_available:anyapex",
1726 "//apex_available:platform",
1727 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001728 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001729 }
1730
1731 cc_library {
1732 name: "libz",
1733 system_shared_libs: [],
1734 stl: "none",
1735 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001736 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001737 },
1738 }
Jooyung Han749dc692020-04-15 11:03:39 +09001739 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001740
1741 expectLink := func(from, from_variant, to, to_variant string) {
1742 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1743 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1744 }
1745 expectNoLink := func(from, from_variant, to, to_variant string) {
1746 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1747 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1748 }
1749 // platform liba is linked to non-stub version
1750 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001751 // liba in myapex is linked to current
1752 expectLink("liba", "shared_apex29", "libz", "shared_current")
1753 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001754 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001755 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001756 // liba in otherapex is linked to current
1757 expectLink("liba", "shared_apex30", "libz", "shared_current")
1758 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001759 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1760 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001761}
1762
Jooyung Hanaed150d2020-04-02 01:41:41 +09001763func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001764 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001765 apex {
1766 name: "myapex",
1767 key: "myapex.key",
1768 native_shared_libs: ["libx"],
1769 min_sdk_version: "R",
1770 }
1771
1772 apex_key {
1773 name: "myapex.key",
1774 public_key: "testkey.avbpubkey",
1775 private_key: "testkey.pem",
1776 }
1777
1778 cc_library {
1779 name: "libx",
1780 shared_libs: ["libz"],
1781 system_shared_libs: [],
1782 stl: "none",
1783 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001784 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001785 }
1786
1787 cc_library {
1788 name: "libz",
1789 system_shared_libs: [],
1790 stl: "none",
1791 stubs: {
1792 versions: ["29", "R"],
1793 },
1794 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001795 `,
1796 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1797 variables.Platform_version_active_codenames = []string{"R"}
1798 }),
1799 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001800
1801 expectLink := func(from, from_variant, to, to_variant string) {
1802 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1803 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1804 }
1805 expectNoLink := func(from, from_variant, to, to_variant string) {
1806 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1807 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1808 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001809 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1810 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001811 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1812 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001813}
1814
Jooyung Han4c4da062021-06-23 10:23:16 +09001815func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1816 testApex(t, `
1817 apex {
1818 name: "myapex",
1819 key: "myapex.key",
1820 java_libs: ["libx"],
1821 min_sdk_version: "S",
1822 }
1823
1824 apex_key {
1825 name: "myapex.key",
1826 public_key: "testkey.avbpubkey",
1827 private_key: "testkey.pem",
1828 }
1829
1830 java_library {
1831 name: "libx",
1832 srcs: ["a.java"],
1833 apex_available: [ "myapex" ],
1834 sdk_version: "current",
1835 min_sdk_version: "S", // should be okay
1836 }
1837 `,
1838 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1839 variables.Platform_version_active_codenames = []string{"S"}
1840 variables.Platform_sdk_codename = proptools.StringPtr("S")
1841 }),
1842 )
1843}
1844
Jooyung Han749dc692020-04-15 11:03:39 +09001845func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001846 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001847 apex {
1848 name: "myapex",
1849 key: "myapex.key",
1850 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001851 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001852 }
1853
1854 apex_key {
1855 name: "myapex.key",
1856 public_key: "testkey.avbpubkey",
1857 private_key: "testkey.pem",
1858 }
1859
1860 cc_library {
1861 name: "libx",
1862 shared_libs: ["libz"],
1863 system_shared_libs: [],
1864 stl: "none",
1865 apex_available: [ "myapex" ],
1866 }
1867
1868 cc_library {
1869 name: "libz",
1870 system_shared_libs: [],
1871 stl: "none",
1872 stubs: {
1873 versions: ["1", "2"],
1874 },
1875 }
1876 `)
1877
1878 expectLink := func(from, from_variant, to, to_variant string) {
1879 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1880 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1881 }
1882 expectNoLink := func(from, from_variant, to, to_variant string) {
1883 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1884 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1885 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001886 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001887 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001888 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001889 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001890}
1891
Jiyong Park5df7bd32021-08-25 16:18:46 +09001892func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1893 ctx := testApex(t, `
1894 apex {
1895 name: "myapex",
1896 key: "myapex.key",
1897 native_shared_libs: ["mylib"],
1898 updatable: false,
1899 vendor: true,
1900 min_sdk_version: "29",
1901 }
1902
1903 apex_key {
1904 name: "myapex.key",
1905 public_key: "testkey.avbpubkey",
1906 private_key: "testkey.pem",
1907 }
1908
1909 cc_library {
1910 name: "mylib",
1911 vendor_available: true,
1912 system_shared_libs: [],
1913 stl: "none",
1914 apex_available: [ "myapex" ],
1915 min_sdk_version: "29",
1916 }
1917 `)
1918
1919 vendorVariant := "android_vendor.29_arm64_armv8-a"
1920
1921 // First check that the correct variant of crtbegin_so is used.
1922 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1923 crtBegin := names(ldRule.Args["crtBegin"])
1924 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1925
1926 // Ensure that the crtbegin_so used by the APEX is targeting 29
1927 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1928 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1929}
1930
Jooyung Han03b51852020-02-26 22:45:42 +09001931func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001932 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001933 apex {
1934 name: "myapex",
1935 key: "myapex.key",
1936 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001937 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001938 }
1939
1940 apex_key {
1941 name: "myapex.key",
1942 public_key: "testkey.avbpubkey",
1943 private_key: "testkey.pem",
1944 }
1945
1946 cc_library {
1947 name: "libx",
1948 system_shared_libs: [],
1949 stl: "none",
1950 apex_available: [ "myapex" ],
1951 stubs: {
1952 versions: ["1", "2"],
1953 },
1954 }
1955
1956 cc_library {
1957 name: "libz",
1958 shared_libs: ["libx"],
1959 system_shared_libs: [],
1960 stl: "none",
1961 }
1962 `)
1963
1964 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001965 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001966 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1967 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1968 }
1969 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001970 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001971 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1972 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1973 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001974 expectLink("libz", "shared", "libx", "shared_current")
1975 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001976 expectNoLink("libz", "shared", "libz", "shared_1")
1977 expectNoLink("libz", "shared", "libz", "shared")
1978}
1979
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001980var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1981 func(variables android.FixtureProductVariables) {
1982 variables.SanitizeDevice = []string{"hwaddress"}
1983 },
1984)
1985
Jooyung Han75568392020-03-20 04:29:24 +09001986func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001987 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001988 apex {
1989 name: "myapex",
1990 key: "myapex.key",
1991 native_shared_libs: ["libx"],
1992 min_sdk_version: "29",
1993 }
1994
1995 apex_key {
1996 name: "myapex.key",
1997 public_key: "testkey.avbpubkey",
1998 private_key: "testkey.pem",
1999 }
2000
2001 cc_library {
2002 name: "libx",
2003 shared_libs: ["libbar"],
2004 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002005 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002006 }
2007
2008 cc_library {
2009 name: "libbar",
2010 stubs: {
2011 versions: ["29", "30"],
2012 },
2013 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002014 `,
2015 prepareForTestWithSantitizeHwaddress,
2016 )
Jooyung Han03b51852020-02-26 22:45:42 +09002017 expectLink := func(from, from_variant, to, to_variant string) {
2018 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2019 libFlags := ld.Args["libFlags"]
2020 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2021 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002022 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002023}
2024
Jooyung Han75568392020-03-20 04:29:24 +09002025func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002026 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002027 apex {
2028 name: "myapex",
2029 key: "myapex.key",
2030 native_shared_libs: ["libx"],
2031 min_sdk_version: "29",
2032 }
2033
2034 apex_key {
2035 name: "myapex.key",
2036 public_key: "testkey.avbpubkey",
2037 private_key: "testkey.pem",
2038 }
2039
2040 cc_library {
2041 name: "libx",
2042 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002043 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002044 }
Jooyung Han75568392020-03-20 04:29:24 +09002045 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002046
2047 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002048 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002049 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002050 // note that platform variant is not.
2051 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002052 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002053}
2054
Jooyung Han749dc692020-04-15 11:03:39 +09002055func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2056 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002057 apex {
2058 name: "myapex",
2059 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002060 native_shared_libs: ["mylib"],
2061 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002062 }
2063
2064 apex_key {
2065 name: "myapex.key",
2066 public_key: "testkey.avbpubkey",
2067 private_key: "testkey.pem",
2068 }
Jooyung Han749dc692020-04-15 11:03:39 +09002069
2070 cc_library {
2071 name: "mylib",
2072 srcs: ["mylib.cpp"],
2073 system_shared_libs: [],
2074 stl: "none",
2075 apex_available: [
2076 "myapex",
2077 ],
2078 min_sdk_version: "30",
2079 }
2080 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002081
2082 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2083 apex {
2084 name: "myapex",
2085 key: "myapex.key",
2086 native_shared_libs: ["libfoo.ffi"],
2087 min_sdk_version: "29",
2088 }
2089
2090 apex_key {
2091 name: "myapex.key",
2092 public_key: "testkey.avbpubkey",
2093 private_key: "testkey.pem",
2094 }
2095
2096 rust_ffi_shared {
2097 name: "libfoo.ffi",
2098 srcs: ["foo.rs"],
2099 crate_name: "foo",
2100 apex_available: [
2101 "myapex",
2102 ],
2103 min_sdk_version: "30",
2104 }
2105 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002106
2107 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2108 apex {
2109 name: "myapex",
2110 key: "myapex.key",
2111 java_libs: ["libfoo"],
2112 min_sdk_version: "29",
2113 }
2114
2115 apex_key {
2116 name: "myapex.key",
2117 public_key: "testkey.avbpubkey",
2118 private_key: "testkey.pem",
2119 }
2120
2121 java_import {
2122 name: "libfoo",
2123 jars: ["libfoo.jar"],
2124 apex_available: [
2125 "myapex",
2126 ],
2127 min_sdk_version: "30",
2128 }
2129 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002130}
2131
2132func TestApexMinSdkVersion_Okay(t *testing.T) {
2133 testApex(t, `
2134 apex {
2135 name: "myapex",
2136 key: "myapex.key",
2137 native_shared_libs: ["libfoo"],
2138 java_libs: ["libbar"],
2139 min_sdk_version: "29",
2140 }
2141
2142 apex_key {
2143 name: "myapex.key",
2144 public_key: "testkey.avbpubkey",
2145 private_key: "testkey.pem",
2146 }
2147
2148 cc_library {
2149 name: "libfoo",
2150 srcs: ["mylib.cpp"],
2151 shared_libs: ["libfoo_dep"],
2152 apex_available: ["myapex"],
2153 min_sdk_version: "29",
2154 }
2155
2156 cc_library {
2157 name: "libfoo_dep",
2158 srcs: ["mylib.cpp"],
2159 apex_available: ["myapex"],
2160 min_sdk_version: "29",
2161 }
2162
2163 java_library {
2164 name: "libbar",
2165 sdk_version: "current",
2166 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002167 static_libs: [
2168 "libbar_dep",
2169 "libbar_import_dep",
2170 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002171 apex_available: ["myapex"],
2172 min_sdk_version: "29",
2173 }
2174
2175 java_library {
2176 name: "libbar_dep",
2177 sdk_version: "current",
2178 srcs: ["a.java"],
2179 apex_available: ["myapex"],
2180 min_sdk_version: "29",
2181 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002182
2183 java_import {
2184 name: "libbar_import_dep",
2185 jars: ["libbar.jar"],
2186 apex_available: ["myapex"],
2187 min_sdk_version: "29",
2188 }
Jooyung Han03b51852020-02-26 22:45:42 +09002189 `)
2190}
2191
Artur Satayev8cf899a2020-04-15 17:29:42 +01002192func TestJavaStableSdkVersion(t *testing.T) {
2193 testCases := []struct {
2194 name string
2195 expectedError string
2196 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002197 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002198 }{
2199 {
2200 name: "Non-updatable apex with non-stable dep",
2201 bp: `
2202 apex {
2203 name: "myapex",
2204 java_libs: ["myjar"],
2205 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002206 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002207 }
2208 apex_key {
2209 name: "myapex.key",
2210 public_key: "testkey.avbpubkey",
2211 private_key: "testkey.pem",
2212 }
2213 java_library {
2214 name: "myjar",
2215 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002216 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002217 apex_available: ["myapex"],
2218 }
2219 `,
2220 },
2221 {
2222 name: "Updatable apex with stable dep",
2223 bp: `
2224 apex {
2225 name: "myapex",
2226 java_libs: ["myjar"],
2227 key: "myapex.key",
2228 updatable: true,
2229 min_sdk_version: "29",
2230 }
2231 apex_key {
2232 name: "myapex.key",
2233 public_key: "testkey.avbpubkey",
2234 private_key: "testkey.pem",
2235 }
2236 java_library {
2237 name: "myjar",
2238 srcs: ["foo/bar/MyClass.java"],
2239 sdk_version: "current",
2240 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002241 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002242 }
2243 `,
2244 },
2245 {
2246 name: "Updatable apex with non-stable dep",
2247 expectedError: "cannot depend on \"myjar\"",
2248 bp: `
2249 apex {
2250 name: "myapex",
2251 java_libs: ["myjar"],
2252 key: "myapex.key",
2253 updatable: true,
2254 }
2255 apex_key {
2256 name: "myapex.key",
2257 public_key: "testkey.avbpubkey",
2258 private_key: "testkey.pem",
2259 }
2260 java_library {
2261 name: "myjar",
2262 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002263 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002264 apex_available: ["myapex"],
2265 }
2266 `,
2267 },
2268 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002269 name: "Updatable apex with non-stable legacy core platform dep",
2270 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2271 bp: `
2272 apex {
2273 name: "myapex",
2274 java_libs: ["myjar-uses-legacy"],
2275 key: "myapex.key",
2276 updatable: true,
2277 }
2278 apex_key {
2279 name: "myapex.key",
2280 public_key: "testkey.avbpubkey",
2281 private_key: "testkey.pem",
2282 }
2283 java_library {
2284 name: "myjar-uses-legacy",
2285 srcs: ["foo/bar/MyClass.java"],
2286 sdk_version: "core_platform",
2287 apex_available: ["myapex"],
2288 }
2289 `,
2290 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2291 },
2292 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002293 name: "Updatable apex with non-stable transitive dep",
2294 // This is not actually detecting that the transitive dependency is unstable, rather it is
2295 // detecting that the transitive dependency is building against a wider API surface than the
2296 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002297 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002298 bp: `
2299 apex {
2300 name: "myapex",
2301 java_libs: ["myjar"],
2302 key: "myapex.key",
2303 updatable: true,
2304 }
2305 apex_key {
2306 name: "myapex.key",
2307 public_key: "testkey.avbpubkey",
2308 private_key: "testkey.pem",
2309 }
2310 java_library {
2311 name: "myjar",
2312 srcs: ["foo/bar/MyClass.java"],
2313 sdk_version: "current",
2314 apex_available: ["myapex"],
2315 static_libs: ["transitive-jar"],
2316 }
2317 java_library {
2318 name: "transitive-jar",
2319 srcs: ["foo/bar/MyClass.java"],
2320 sdk_version: "core_platform",
2321 apex_available: ["myapex"],
2322 }
2323 `,
2324 },
2325 }
2326
2327 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002328 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2329 continue
2330 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002331 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002332 errorHandler := android.FixtureExpectsNoErrors
2333 if test.expectedError != "" {
2334 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002335 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002336 android.GroupFixturePreparers(
2337 java.PrepareForTestWithJavaDefaultModules,
2338 PrepareForTestWithApexBuildComponents,
2339 prepareForTestWithMyapex,
2340 android.OptionalFixturePreparer(test.preparer),
2341 ).
2342 ExtendWithErrorHandler(errorHandler).
2343 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002344 })
2345 }
2346}
2347
Jooyung Han749dc692020-04-15 11:03:39 +09002348func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2349 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2350 apex {
2351 name: "myapex",
2352 key: "myapex.key",
2353 native_shared_libs: ["mylib"],
2354 min_sdk_version: "29",
2355 }
2356
2357 apex_key {
2358 name: "myapex.key",
2359 public_key: "testkey.avbpubkey",
2360 private_key: "testkey.pem",
2361 }
2362
2363 cc_library {
2364 name: "mylib",
2365 srcs: ["mylib.cpp"],
2366 shared_libs: ["mylib2"],
2367 system_shared_libs: [],
2368 stl: "none",
2369 apex_available: [
2370 "myapex",
2371 ],
2372 min_sdk_version: "29",
2373 }
2374
2375 // indirect part of the apex
2376 cc_library {
2377 name: "mylib2",
2378 srcs: ["mylib.cpp"],
2379 system_shared_libs: [],
2380 stl: "none",
2381 apex_available: [
2382 "myapex",
2383 ],
2384 min_sdk_version: "30",
2385 }
2386 `)
2387}
2388
2389func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2390 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2391 apex {
2392 name: "myapex",
2393 key: "myapex.key",
2394 apps: ["AppFoo"],
2395 min_sdk_version: "29",
2396 }
2397
2398 apex_key {
2399 name: "myapex.key",
2400 public_key: "testkey.avbpubkey",
2401 private_key: "testkey.pem",
2402 }
2403
2404 android_app {
2405 name: "AppFoo",
2406 srcs: ["foo/bar/MyClass.java"],
2407 sdk_version: "current",
2408 min_sdk_version: "29",
2409 system_modules: "none",
2410 stl: "none",
2411 static_libs: ["bar"],
2412 apex_available: [ "myapex" ],
2413 }
2414
2415 java_library {
2416 name: "bar",
2417 sdk_version: "current",
2418 srcs: ["a.java"],
2419 apex_available: [ "myapex" ],
2420 }
2421 `)
2422}
2423
2424func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002425 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002426 apex {
2427 name: "myapex",
2428 key: "myapex.key",
2429 native_shared_libs: ["mylib"],
2430 min_sdk_version: "29",
2431 }
2432
2433 apex_key {
2434 name: "myapex.key",
2435 public_key: "testkey.avbpubkey",
2436 private_key: "testkey.pem",
2437 }
2438
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002439 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002440 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2441 cc_library {
2442 name: "mylib",
2443 srcs: ["mylib.cpp"],
2444 shared_libs: ["mylib2"],
2445 system_shared_libs: [],
2446 stl: "none",
2447 apex_available: ["myapex", "otherapex"],
2448 min_sdk_version: "29",
2449 }
2450
2451 cc_library {
2452 name: "mylib2",
2453 srcs: ["mylib.cpp"],
2454 system_shared_libs: [],
2455 stl: "none",
2456 apex_available: ["otherapex"],
2457 stubs: { versions: ["29", "30"] },
2458 min_sdk_version: "30",
2459 }
2460
2461 apex {
2462 name: "otherapex",
2463 key: "myapex.key",
2464 native_shared_libs: ["mylib", "mylib2"],
2465 min_sdk_version: "30",
2466 }
2467 `)
2468 expectLink := func(from, from_variant, to, to_variant string) {
2469 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2470 libFlags := ld.Args["libFlags"]
2471 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2472 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002473 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002474 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002475}
2476
Jooyung Haned124c32021-01-26 11:43:46 +09002477func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002478 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2479 func(variables android.FixtureProductVariables) {
2480 variables.Platform_sdk_codename = proptools.StringPtr("S")
2481 variables.Platform_version_active_codenames = []string{"S"}
2482 },
2483 )
Jooyung Haned124c32021-01-26 11:43:46 +09002484 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2485 apex {
2486 name: "myapex",
2487 key: "myapex.key",
2488 native_shared_libs: ["libfoo"],
2489 min_sdk_version: "S",
2490 }
2491 apex_key {
2492 name: "myapex.key",
2493 public_key: "testkey.avbpubkey",
2494 private_key: "testkey.pem",
2495 }
2496 cc_library {
2497 name: "libfoo",
2498 shared_libs: ["libbar"],
2499 apex_available: ["myapex"],
2500 min_sdk_version: "29",
2501 }
2502 cc_library {
2503 name: "libbar",
2504 apex_available: ["myapex"],
2505 }
2506 `, withSAsActiveCodeNames)
2507}
2508
2509func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002510 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2511 variables.Platform_sdk_codename = proptools.StringPtr("S")
2512 variables.Platform_version_active_codenames = []string{"S", "T"}
2513 })
Colin Cross1c460562021-02-16 17:55:47 -08002514 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002515 apex {
2516 name: "myapex",
2517 key: "myapex.key",
2518 native_shared_libs: ["libfoo"],
2519 min_sdk_version: "S",
2520 }
2521 apex_key {
2522 name: "myapex.key",
2523 public_key: "testkey.avbpubkey",
2524 private_key: "testkey.pem",
2525 }
2526 cc_library {
2527 name: "libfoo",
2528 shared_libs: ["libbar"],
2529 apex_available: ["myapex"],
2530 min_sdk_version: "S",
2531 }
2532 cc_library {
2533 name: "libbar",
2534 stubs: {
2535 symbol_file: "libbar.map.txt",
2536 versions: ["30", "S", "T"],
2537 },
2538 }
2539 `, withSAsActiveCodeNames)
2540
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002541 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002542 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2543 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002544 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002545}
2546
Jiyong Park7c2ee712018-12-07 00:42:25 +09002547func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002548 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002549 apex {
2550 name: "myapex",
2551 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002552 native_shared_libs: ["mylib"],
2553 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002554 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002555 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002556 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002557 }
2558
2559 apex_key {
2560 name: "myapex.key",
2561 public_key: "testkey.avbpubkey",
2562 private_key: "testkey.pem",
2563 }
2564
2565 prebuilt_etc {
2566 name: "myetc",
2567 src: "myprebuilt",
2568 sub_dir: "foo/bar",
2569 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002570
2571 cc_library {
2572 name: "mylib",
2573 srcs: ["mylib.cpp"],
2574 relative_install_path: "foo/bar",
2575 system_shared_libs: [],
2576 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002577 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002578 }
2579
2580 cc_binary {
2581 name: "mybin",
2582 srcs: ["mylib.cpp"],
2583 relative_install_path: "foo/bar",
2584 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002585 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002586 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002587 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002588 `)
2589
Sundong Ahnabb64432019-10-22 13:58:29 +09002590 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002591 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002592
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002593 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002594 ensureContains(t, cmd, "/etc ")
2595 ensureContains(t, cmd, "/etc/foo ")
2596 ensureContains(t, cmd, "/etc/foo/bar ")
2597 ensureContains(t, cmd, "/lib64 ")
2598 ensureContains(t, cmd, "/lib64/foo ")
2599 ensureContains(t, cmd, "/lib64/foo/bar ")
2600 ensureContains(t, cmd, "/lib ")
2601 ensureContains(t, cmd, "/lib/foo ")
2602 ensureContains(t, cmd, "/lib/foo/bar ")
2603 ensureContains(t, cmd, "/bin ")
2604 ensureContains(t, cmd, "/bin/foo ")
2605 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002606}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002607
Jooyung Han35155c42020-02-06 17:33:20 +09002608func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002609 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002610 apex {
2611 name: "myapex",
2612 key: "myapex.key",
2613 multilib: {
2614 both: {
2615 native_shared_libs: ["mylib"],
2616 binaries: ["mybin"],
2617 },
2618 },
2619 compile_multilib: "both",
2620 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002621 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002622 }
2623
2624 apex_key {
2625 name: "myapex.key",
2626 public_key: "testkey.avbpubkey",
2627 private_key: "testkey.pem",
2628 }
2629
2630 cc_library {
2631 name: "mylib",
2632 relative_install_path: "foo/bar",
2633 system_shared_libs: [],
2634 stl: "none",
2635 apex_available: [ "myapex" ],
2636 native_bridge_supported: true,
2637 }
2638
2639 cc_binary {
2640 name: "mybin",
2641 relative_install_path: "foo/bar",
2642 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002643 stl: "none",
2644 apex_available: [ "myapex" ],
2645 native_bridge_supported: true,
2646 compile_multilib: "both", // default is "first" for binary
2647 multilib: {
2648 lib64: {
2649 suffix: "64",
2650 },
2651 },
2652 }
2653 `, withNativeBridgeEnabled)
2654 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2655 "bin/foo/bar/mybin",
2656 "bin/foo/bar/mybin64",
2657 "bin/arm/foo/bar/mybin",
2658 "bin/arm64/foo/bar/mybin64",
2659 "lib/foo/bar/mylib.so",
2660 "lib/arm/foo/bar/mylib.so",
2661 "lib64/foo/bar/mylib.so",
2662 "lib64/arm64/foo/bar/mylib.so",
2663 })
2664}
2665
Jooyung Han85d61762020-06-24 23:50:26 +09002666func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002667 result := android.GroupFixturePreparers(
2668 prepareForApexTest,
2669 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2670 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002671 apex {
2672 name: "myapex",
2673 key: "myapex.key",
2674 binaries: ["mybin"],
2675 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002676 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002677 }
2678 apex_key {
2679 name: "myapex.key",
2680 public_key: "testkey.avbpubkey",
2681 private_key: "testkey.pem",
2682 }
2683 cc_binary {
2684 name: "mybin",
2685 vendor: true,
2686 shared_libs: ["libfoo"],
2687 }
2688 cc_library {
2689 name: "libfoo",
2690 proprietary: true,
2691 }
2692 `)
2693
Colin Crossc68db4b2021-11-11 18:59:15 -08002694 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002695 "bin/mybin",
2696 "lib64/libfoo.so",
2697 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2698 "lib64/libc++.so",
2699 })
2700
Colin Crossc68db4b2021-11-11 18:59:15 -08002701 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2702 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002703 name := apexBundle.BaseModuleName()
2704 prefix := "TARGET_"
2705 var builder strings.Builder
2706 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002707 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002708 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002709 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002710
Colin Crossc68db4b2021-11-11 18:59:15 -08002711 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002712 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2713 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002714}
2715
Jooyung Handf78e212020-07-22 15:54:47 +09002716func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002717 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002718 apex {
2719 name: "myapex",
2720 key: "myapex.key",
2721 binaries: ["mybin"],
2722 vendor: true,
2723 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002724 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002725 }
2726 apex_key {
2727 name: "myapex.key",
2728 public_key: "testkey.avbpubkey",
2729 private_key: "testkey.pem",
2730 }
2731 cc_binary {
2732 name: "mybin",
2733 vendor: true,
2734 shared_libs: ["libvndk", "libvendor"],
2735 }
2736 cc_library {
2737 name: "libvndk",
2738 vndk: {
2739 enabled: true,
2740 },
2741 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002742 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002743 }
2744 cc_library {
2745 name: "libvendor",
2746 vendor: true,
2747 }
2748 `)
2749
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002750 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002751
Paul Duffina71a67a2021-03-29 00:42:57 +01002752 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002753 libs := names(ldRule.Args["libFlags"])
2754 // VNDK libs(libvndk/libc++) as they are
Paul Duffin37ba3442021-03-29 00:21:08 +01002755 ensureListContains(t, libs, "out/soong/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2756 ensureListContains(t, libs, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"libc++/"+vendorVariant+"_shared/libc++.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002757 // non-stable Vendor libs as APEX variants
Paul Duffin37ba3442021-03-29 00:21:08 +01002758 ensureListContains(t, libs, "out/soong/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002759
2760 // VNDK libs are not included when use_vndk_as_stable: true
2761 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2762 "bin/mybin",
2763 "lib64/libvendor.so",
2764 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002765
2766 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2767 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2768 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002769}
2770
Justin Yun13decfb2021-03-08 19:25:55 +09002771func TestProductVariant(t *testing.T) {
2772 ctx := testApex(t, `
2773 apex {
2774 name: "myapex",
2775 key: "myapex.key",
2776 updatable: false,
2777 product_specific: true,
2778 binaries: ["foo"],
2779 }
2780
2781 apex_key {
2782 name: "myapex.key",
2783 public_key: "testkey.avbpubkey",
2784 private_key: "testkey.pem",
2785 }
2786
2787 cc_binary {
2788 name: "foo",
2789 product_available: true,
2790 apex_available: ["myapex"],
2791 srcs: ["foo.cpp"],
2792 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002793 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2794 variables.ProductVndkVersion = proptools.StringPtr("current")
2795 }),
2796 )
Justin Yun13decfb2021-03-08 19:25:55 +09002797
2798 cflags := strings.Fields(
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002799 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002800 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2801 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2802 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2803 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2804}
2805
Jooyung Han8e5685d2020-09-21 11:02:57 +09002806func TestApex_withPrebuiltFirmware(t *testing.T) {
2807 testCases := []struct {
2808 name string
2809 additionalProp string
2810 }{
2811 {"system apex with prebuilt_firmware", ""},
2812 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2813 }
2814 for _, tc := range testCases {
2815 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002816 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002817 apex {
2818 name: "myapex",
2819 key: "myapex.key",
2820 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002821 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002822 `+tc.additionalProp+`
2823 }
2824 apex_key {
2825 name: "myapex.key",
2826 public_key: "testkey.avbpubkey",
2827 private_key: "testkey.pem",
2828 }
2829 prebuilt_firmware {
2830 name: "myfirmware",
2831 src: "myfirmware.bin",
2832 filename_from_src: true,
2833 `+tc.additionalProp+`
2834 }
2835 `)
2836 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2837 "etc/firmware/myfirmware.bin",
2838 })
2839 })
2840 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002841}
2842
Jooyung Hanefb184e2020-06-25 17:14:25 +09002843func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002844 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002845 apex {
2846 name: "myapex",
2847 key: "myapex.key",
2848 vendor: true,
2849 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002850 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002851 }
2852
2853 apex_key {
2854 name: "myapex.key",
2855 public_key: "testkey.avbpubkey",
2856 private_key: "testkey.pem",
2857 }
2858
2859 cc_library {
2860 name: "mylib",
2861 vendor_available: true,
2862 }
2863 `)
2864
2865 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002866 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002867 name := apexBundle.BaseModuleName()
2868 prefix := "TARGET_"
2869 var builder strings.Builder
2870 data.Custom(&builder, name, prefix, "", data)
2871 androidMk := builder.String()
2872 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2873}
2874
Jooyung Han2ed99d02020-06-24 23:26:26 +09002875func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002876 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002877 apex {
2878 name: "myapex",
2879 key: "myapex.key",
2880 vintf_fragments: ["fragment.xml"],
2881 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002882 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002883 }
2884 apex_key {
2885 name: "myapex.key",
2886 public_key: "testkey.avbpubkey",
2887 private_key: "testkey.pem",
2888 }
2889 cc_binary {
2890 name: "mybin",
2891 }
2892 `)
2893
2894 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002895 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002896 name := apexBundle.BaseModuleName()
2897 prefix := "TARGET_"
2898 var builder strings.Builder
2899 data.Custom(&builder, name, prefix, "", data)
2900 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002901 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002902 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002903}
2904
Jiyong Park16e91a02018-12-20 18:18:08 +09002905func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002906 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002907 apex {
2908 name: "myapex",
2909 key: "myapex.key",
2910 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002911 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09002912 }
2913
2914 apex_key {
2915 name: "myapex.key",
2916 public_key: "testkey.avbpubkey",
2917 private_key: "testkey.pem",
2918 }
2919
2920 cc_library {
2921 name: "mylib",
2922 srcs: ["mylib.cpp"],
2923 system_shared_libs: [],
2924 stl: "none",
2925 stubs: {
2926 versions: ["1", "2", "3"],
2927 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002928 apex_available: [
2929 "//apex_available:platform",
2930 "myapex",
2931 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002932 }
2933
2934 cc_binary {
2935 name: "not_in_apex",
2936 srcs: ["mylib.cpp"],
2937 static_libs: ["mylib"],
2938 static_executable: true,
2939 system_shared_libs: [],
2940 stl: "none",
2941 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002942 `)
2943
Colin Cross7113d202019-11-20 16:39:12 -08002944 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002945
2946 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002947 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002948}
Jiyong Park9335a262018-12-24 11:31:58 +09002949
2950func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002951 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002952 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002953 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002954 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002955 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002956 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002957 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002958 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09002959 }
2960
2961 cc_library {
2962 name: "mylib",
2963 srcs: ["mylib.cpp"],
2964 system_shared_libs: [],
2965 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002966 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002967 }
2968
2969 apex_key {
2970 name: "myapex.key",
2971 public_key: "testkey.avbpubkey",
2972 private_key: "testkey.pem",
2973 }
2974
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002975 android_app_certificate {
2976 name: "myapex.certificate",
2977 certificate: "testkey",
2978 }
2979
2980 android_app_certificate {
2981 name: "myapex.certificate.override",
2982 certificate: "testkey.override",
2983 }
2984
Jiyong Park9335a262018-12-24 11:31:58 +09002985 `)
2986
2987 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002988 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002989
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002990 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2991 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002992 "vendor/foo/devkeys/testkey.avbpubkey")
2993 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002994 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2995 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002996 "vendor/foo/devkeys/testkey.pem")
2997 }
2998
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002999 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003000 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003001 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003002 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003003 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003004 }
3005}
Jiyong Park58e364a2019-01-19 19:24:06 +09003006
Jooyung Hanf121a652019-12-17 14:30:11 +09003007func TestCertificate(t *testing.T) {
3008 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003009 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003010 apex {
3011 name: "myapex",
3012 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003013 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003014 }
3015 apex_key {
3016 name: "myapex.key",
3017 public_key: "testkey.avbpubkey",
3018 private_key: "testkey.pem",
3019 }`)
3020 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3021 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3022 if actual := rule.Args["certificates"]; actual != expected {
3023 t.Errorf("certificates should be %q, not %q", expected, actual)
3024 }
3025 })
3026 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003027 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003028 apex {
3029 name: "myapex_keytest",
3030 key: "myapex.key",
3031 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003032 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003033 }
3034 apex_key {
3035 name: "myapex.key",
3036 public_key: "testkey.avbpubkey",
3037 private_key: "testkey.pem",
3038 }
3039 android_app_certificate {
3040 name: "myapex.certificate.override",
3041 certificate: "testkey.override",
3042 }`)
3043 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3044 expected := "testkey.override.x509.pem testkey.override.pk8"
3045 if actual := rule.Args["certificates"]; actual != expected {
3046 t.Errorf("certificates should be %q, not %q", expected, actual)
3047 }
3048 })
3049 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003050 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003051 apex {
3052 name: "myapex",
3053 key: "myapex.key",
3054 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003055 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003056 }
3057 apex_key {
3058 name: "myapex.key",
3059 public_key: "testkey.avbpubkey",
3060 private_key: "testkey.pem",
3061 }
3062 android_app_certificate {
3063 name: "myapex.certificate",
3064 certificate: "testkey",
3065 }`)
3066 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3067 expected := "testkey.x509.pem testkey.pk8"
3068 if actual := rule.Args["certificates"]; actual != expected {
3069 t.Errorf("certificates should be %q, not %q", expected, actual)
3070 }
3071 })
3072 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003073 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003074 apex {
3075 name: "myapex_keytest",
3076 key: "myapex.key",
3077 file_contexts: ":myapex-file_contexts",
3078 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003079 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003080 }
3081 apex_key {
3082 name: "myapex.key",
3083 public_key: "testkey.avbpubkey",
3084 private_key: "testkey.pem",
3085 }
3086 android_app_certificate {
3087 name: "myapex.certificate.override",
3088 certificate: "testkey.override",
3089 }`)
3090 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3091 expected := "testkey.override.x509.pem testkey.override.pk8"
3092 if actual := rule.Args["certificates"]; actual != expected {
3093 t.Errorf("certificates should be %q, not %q", expected, actual)
3094 }
3095 })
3096 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003097 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003098 apex {
3099 name: "myapex",
3100 key: "myapex.key",
3101 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003102 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003103 }
3104 apex_key {
3105 name: "myapex.key",
3106 public_key: "testkey.avbpubkey",
3107 private_key: "testkey.pem",
3108 }`)
3109 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3110 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3111 if actual := rule.Args["certificates"]; actual != expected {
3112 t.Errorf("certificates should be %q, not %q", expected, actual)
3113 }
3114 })
3115 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003116 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003117 apex {
3118 name: "myapex_keytest",
3119 key: "myapex.key",
3120 file_contexts: ":myapex-file_contexts",
3121 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003122 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003123 }
3124 apex_key {
3125 name: "myapex.key",
3126 public_key: "testkey.avbpubkey",
3127 private_key: "testkey.pem",
3128 }
3129 android_app_certificate {
3130 name: "myapex.certificate.override",
3131 certificate: "testkey.override",
3132 }`)
3133 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3134 expected := "testkey.override.x509.pem testkey.override.pk8"
3135 if actual := rule.Args["certificates"]; actual != expected {
3136 t.Errorf("certificates should be %q, not %q", expected, actual)
3137 }
3138 })
3139}
3140
Jiyong Park58e364a2019-01-19 19:24:06 +09003141func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003142 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003143 apex {
3144 name: "myapex",
3145 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003146 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003147 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003148 }
3149
3150 apex {
3151 name: "otherapex",
3152 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003153 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003154 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003155 }
3156
3157 apex_key {
3158 name: "myapex.key",
3159 public_key: "testkey.avbpubkey",
3160 private_key: "testkey.pem",
3161 }
3162
3163 cc_library {
3164 name: "mylib",
3165 srcs: ["mylib.cpp"],
3166 system_shared_libs: [],
3167 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003168 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003169 "myapex",
3170 "otherapex",
3171 ],
Jooyung Han24282772020-03-21 23:20:55 +09003172 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003173 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003174 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003175 cc_library {
3176 name: "mylib2",
3177 srcs: ["mylib.cpp"],
3178 system_shared_libs: [],
3179 stl: "none",
3180 apex_available: [
3181 "myapex",
3182 "otherapex",
3183 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003184 static_libs: ["mylib3"],
3185 recovery_available: true,
3186 min_sdk_version: "29",
3187 }
3188 cc_library {
3189 name: "mylib3",
3190 srcs: ["mylib.cpp"],
3191 system_shared_libs: [],
3192 stl: "none",
3193 apex_available: [
3194 "myapex",
3195 "otherapex",
3196 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003197 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003198 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003199 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003200 `)
3201
Jooyung Hanc87a0592020-03-02 17:44:33 +09003202 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003203 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003204 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003205 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003206
Jooyung Hanccce2f22020-03-07 03:45:53 +09003207 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003208 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003209 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003210 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003211
Jooyung Hanccce2f22020-03-07 03:45:53 +09003212 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003213 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003214 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003215 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003216
Colin Crossaede88c2020-08-11 12:17:01 -07003217 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3218 // each variant defines additional macros to distinguish which apex variant it is built for
3219
3220 // non-APEX variant does not have __ANDROID_APEX__ defined
3221 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3222 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3223
Dan Albertb19953d2020-11-17 15:29:36 -08003224 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003225 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3226 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003227 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003228
Jooyung Hanc87a0592020-03-02 17:44:33 +09003229 // non-APEX variant does not have __ANDROID_APEX__ defined
3230 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3231 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3232
Dan Albertb19953d2020-11-17 15:29:36 -08003233 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003234 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003235 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003236 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003237}
Jiyong Park7e636d02019-01-28 16:16:54 +09003238
3239func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003240 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003241 apex {
3242 name: "myapex",
3243 key: "myapex.key",
3244 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003245 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003246 }
3247
3248 apex_key {
3249 name: "myapex.key",
3250 public_key: "testkey.avbpubkey",
3251 private_key: "testkey.pem",
3252 }
3253
3254 cc_library_headers {
3255 name: "mylib_headers",
3256 export_include_dirs: ["my_include"],
3257 system_shared_libs: [],
3258 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003259 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003260 }
3261
3262 cc_library {
3263 name: "mylib",
3264 srcs: ["mylib.cpp"],
3265 system_shared_libs: [],
3266 stl: "none",
3267 header_libs: ["mylib_headers"],
3268 export_header_lib_headers: ["mylib_headers"],
3269 stubs: {
3270 versions: ["1", "2", "3"],
3271 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003272 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003273 }
3274
3275 cc_library {
3276 name: "otherlib",
3277 srcs: ["mylib.cpp"],
3278 system_shared_libs: [],
3279 stl: "none",
3280 shared_libs: ["mylib"],
3281 }
3282 `)
3283
Colin Cross7113d202019-11-20 16:39:12 -08003284 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003285
3286 // Ensure that the include path of the header lib is exported to 'otherlib'
3287 ensureContains(t, cFlags, "-Imy_include")
3288}
Alex Light9670d332019-01-29 18:07:33 -08003289
Jiyong Park7cd10e32020-01-14 09:22:18 +09003290type fileInApex struct {
3291 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003292 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003293 isLink bool
3294}
3295
Jooyung Hana57af4a2020-01-23 05:36:59 +00003296func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003297 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003298 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003299 copyCmds := apexRule.Args["copy_commands"]
3300 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003301 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003302 for _, cmd := range strings.Split(copyCmds, "&&") {
3303 cmd = strings.TrimSpace(cmd)
3304 if cmd == "" {
3305 continue
3306 }
3307 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003308 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003309 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003310 switch terms[0] {
3311 case "mkdir":
3312 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003313 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003314 t.Fatal("copyCmds contains invalid cp command", cmd)
3315 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003316 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003317 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003318 isLink = false
3319 case "ln":
3320 if len(terms) != 3 && len(terms) != 4 {
3321 // ln LINK TARGET or ln -s LINK TARGET
3322 t.Fatal("copyCmds contains invalid ln command", cmd)
3323 }
3324 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003325 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003326 isLink = true
3327 default:
3328 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3329 }
3330 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003331 index := strings.Index(dst, imageApexDir)
3332 if index == -1 {
3333 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3334 }
3335 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003336 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003337 }
3338 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003339 return ret
3340}
3341
Jooyung Hana57af4a2020-01-23 05:36:59 +00003342func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3343 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003344 var failed bool
3345 var surplus []string
3346 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003347 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003348 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003349 for _, expected := range files {
3350 if matched, _ := path.Match(expected, file.path); matched {
3351 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003352 mactchFound = true
3353 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003354 }
3355 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003356 if !mactchFound {
3357 surplus = append(surplus, file.path)
3358 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003359 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003360
Jooyung Han31c470b2019-10-18 16:26:59 +09003361 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003362 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003363 t.Log("surplus files", surplus)
3364 failed = true
3365 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003366
3367 if len(files) > len(filesMatched) {
3368 var missing []string
3369 for _, expected := range files {
3370 if !filesMatched[expected] {
3371 missing = append(missing, expected)
3372 }
3373 }
3374 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003375 t.Log("missing files", missing)
3376 failed = true
3377 }
3378 if failed {
3379 t.Fail()
3380 }
3381}
3382
Jooyung Han344d5432019-08-23 11:17:39 +09003383func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003384 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003385 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003386 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003387 "etc/llndk.libraries.29.txt",
3388 "etc/vndkcore.libraries.29.txt",
3389 "etc/vndksp.libraries.29.txt",
3390 "etc/vndkprivate.libraries.29.txt",
3391 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003392 }
3393 testCases := []struct {
3394 vndkVersion string
3395 expectedFiles []string
3396 }{
3397 {
3398 vndkVersion: "current",
3399 expectedFiles: append(commonFiles,
3400 "lib/libvndk.so",
3401 "lib/libvndksp.so",
3402 "lib64/libvndk.so",
3403 "lib64/libvndksp.so"),
3404 },
3405 {
3406 vndkVersion: "",
3407 expectedFiles: append(commonFiles,
3408 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3409 "lib/libvndksp.so",
3410 "lib64/libvndksp.so"),
3411 },
3412 }
3413 for _, tc := range testCases {
3414 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3415 ctx := testApex(t, `
3416 apex_vndk {
3417 name: "com.android.vndk.current",
3418 key: "com.android.vndk.current.key",
3419 updatable: false,
3420 }
3421
3422 apex_key {
3423 name: "com.android.vndk.current.key",
3424 public_key: "testkey.avbpubkey",
3425 private_key: "testkey.pem",
3426 }
3427
3428 cc_library {
3429 name: "libvndk",
3430 srcs: ["mylib.cpp"],
3431 vendor_available: true,
3432 product_available: true,
3433 vndk: {
3434 enabled: true,
3435 },
3436 system_shared_libs: [],
3437 stl: "none",
3438 apex_available: [ "com.android.vndk.current" ],
3439 }
3440
3441 cc_library {
3442 name: "libvndksp",
3443 srcs: ["mylib.cpp"],
3444 vendor_available: true,
3445 product_available: true,
3446 vndk: {
3447 enabled: true,
3448 support_system_process: true,
3449 },
3450 system_shared_libs: [],
3451 stl: "none",
3452 apex_available: [ "com.android.vndk.current" ],
3453 }
3454
3455 // VNDK-Ext should not cause any problems
3456
3457 cc_library {
3458 name: "libvndk.ext",
3459 srcs: ["mylib2.cpp"],
3460 vendor: true,
3461 vndk: {
3462 enabled: true,
3463 extends: "libvndk",
3464 },
3465 system_shared_libs: [],
3466 stl: "none",
3467 }
3468
3469 cc_library {
3470 name: "libvndksp.ext",
3471 srcs: ["mylib2.cpp"],
3472 vendor: true,
3473 vndk: {
3474 enabled: true,
3475 support_system_process: true,
3476 extends: "libvndksp",
3477 },
3478 system_shared_libs: [],
3479 stl: "none",
3480 }
3481 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3482 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3483 }))
3484 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3485 })
3486 }
Jooyung Han344d5432019-08-23 11:17:39 +09003487}
3488
3489func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003490 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003491 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003492 name: "com.android.vndk.current",
3493 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003494 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003495 }
3496
3497 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003498 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003499 public_key: "testkey.avbpubkey",
3500 private_key: "testkey.pem",
3501 }
3502
3503 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003504 name: "libvndk",
3505 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003506 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003507 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003508 vndk: {
3509 enabled: true,
3510 },
3511 system_shared_libs: [],
3512 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003513 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003514 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003515
3516 cc_prebuilt_library_shared {
3517 name: "libvndk.arm",
3518 srcs: ["libvndk.arm.so"],
3519 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003520 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003521 vndk: {
3522 enabled: true,
3523 },
3524 enabled: false,
3525 arch: {
3526 arm: {
3527 enabled: true,
3528 },
3529 },
3530 system_shared_libs: [],
3531 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003532 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003533 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003534 `+vndkLibrariesTxtFiles("current"),
3535 withFiles(map[string][]byte{
3536 "libvndk.so": nil,
3537 "libvndk.arm.so": nil,
3538 }))
Colin Cross2807f002021-03-02 10:15:29 -08003539 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003540 "lib/libvndk.so",
3541 "lib/libvndk.arm.so",
3542 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003543 "lib/libc++.so",
3544 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003545 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003546 })
Jooyung Han344d5432019-08-23 11:17:39 +09003547}
3548
Jooyung Han39edb6c2019-11-06 16:53:07 +09003549func vndkLibrariesTxtFiles(vers ...string) (result string) {
3550 for _, v := range vers {
3551 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003552 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003553 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003554 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003555 name: "` + txt + `.libraries.txt",
3556 }
3557 `
3558 }
3559 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003560 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003561 result += `
3562 prebuilt_etc {
3563 name: "` + txt + `.libraries.` + v + `.txt",
3564 src: "dummy.txt",
3565 }
3566 `
3567 }
3568 }
3569 }
3570 return
3571}
3572
Jooyung Han344d5432019-08-23 11:17:39 +09003573func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003574 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003575 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003576 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003577 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003578 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003579 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003580 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003581 }
3582
3583 apex_key {
3584 name: "myapex.key",
3585 public_key: "testkey.avbpubkey",
3586 private_key: "testkey.pem",
3587 }
3588
Jooyung Han31c470b2019-10-18 16:26:59 +09003589 vndk_prebuilt_shared {
3590 name: "libvndk27",
3591 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003592 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003593 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003594 vndk: {
3595 enabled: true,
3596 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003597 target_arch: "arm64",
3598 arch: {
3599 arm: {
3600 srcs: ["libvndk27_arm.so"],
3601 },
3602 arm64: {
3603 srcs: ["libvndk27_arm64.so"],
3604 },
3605 },
Colin Cross2807f002021-03-02 10:15:29 -08003606 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003607 }
3608
3609 vndk_prebuilt_shared {
3610 name: "libvndk27",
3611 version: "27",
3612 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003613 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003614 vndk: {
3615 enabled: true,
3616 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003617 target_arch: "x86_64",
3618 arch: {
3619 x86: {
3620 srcs: ["libvndk27_x86.so"],
3621 },
3622 x86_64: {
3623 srcs: ["libvndk27_x86_64.so"],
3624 },
3625 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003626 }
3627 `+vndkLibrariesTxtFiles("27"),
3628 withFiles(map[string][]byte{
3629 "libvndk27_arm.so": nil,
3630 "libvndk27_arm64.so": nil,
3631 "libvndk27_x86.so": nil,
3632 "libvndk27_x86_64.so": nil,
3633 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003634
Colin Cross2807f002021-03-02 10:15:29 -08003635 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003636 "lib/libvndk27_arm.so",
3637 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003638 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003639 })
Jooyung Han344d5432019-08-23 11:17:39 +09003640}
3641
Jooyung Han90eee022019-10-01 20:02:42 +09003642func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003643 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003644 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003645 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003646 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003647 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003648 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003649 }
3650 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003651 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003652 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003653 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003654 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003655 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003656 }
3657 apex_key {
3658 name: "myapex.key",
3659 public_key: "testkey.avbpubkey",
3660 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003661 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003662
3663 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003664 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003665 actual := proptools.String(bundle.properties.Apex_name)
3666 if !reflect.DeepEqual(actual, expected) {
3667 t.Errorf("Got '%v', expected '%v'", actual, expected)
3668 }
3669 }
3670
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003671 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003672 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003673}
3674
Jooyung Han344d5432019-08-23 11:17:39 +09003675func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003676 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003677 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003678 name: "com.android.vndk.current",
3679 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003680 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003681 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003682 }
3683
3684 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003685 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003686 public_key: "testkey.avbpubkey",
3687 private_key: "testkey.pem",
3688 }
3689
3690 cc_library {
3691 name: "libvndk",
3692 srcs: ["mylib.cpp"],
3693 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003694 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003695 native_bridge_supported: true,
3696 host_supported: true,
3697 vndk: {
3698 enabled: true,
3699 },
3700 system_shared_libs: [],
3701 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003702 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003703 }
Colin Cross2807f002021-03-02 10:15:29 -08003704 `+vndkLibrariesTxtFiles("current"),
3705 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003706
Colin Cross2807f002021-03-02 10:15:29 -08003707 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003708 "lib/libvndk.so",
3709 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003710 "lib/libc++.so",
3711 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003712 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003713 })
Jooyung Han344d5432019-08-23 11:17:39 +09003714}
3715
3716func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003717 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003718 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003719 name: "com.android.vndk.current",
3720 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003721 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003722 native_bridge_supported: true,
3723 }
3724
3725 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003726 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003727 public_key: "testkey.avbpubkey",
3728 private_key: "testkey.pem",
3729 }
3730
3731 cc_library {
3732 name: "libvndk",
3733 srcs: ["mylib.cpp"],
3734 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003735 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003736 native_bridge_supported: true,
3737 host_supported: true,
3738 vndk: {
3739 enabled: true,
3740 },
3741 system_shared_libs: [],
3742 stl: "none",
3743 }
3744 `)
3745}
3746
Jooyung Han31c470b2019-10-18 16:26:59 +09003747func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003748 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003749 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003750 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003751 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003752 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003753 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003754 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003755 }
3756
3757 apex_key {
3758 name: "myapex.key",
3759 public_key: "testkey.avbpubkey",
3760 private_key: "testkey.pem",
3761 }
3762
3763 vndk_prebuilt_shared {
3764 name: "libvndk27",
3765 version: "27",
3766 target_arch: "arm",
3767 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003768 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003769 vndk: {
3770 enabled: true,
3771 },
3772 arch: {
3773 arm: {
3774 srcs: ["libvndk27.so"],
3775 }
3776 },
3777 }
3778
3779 vndk_prebuilt_shared {
3780 name: "libvndk27",
3781 version: "27",
3782 target_arch: "arm",
3783 binder32bit: true,
3784 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003785 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003786 vndk: {
3787 enabled: true,
3788 },
3789 arch: {
3790 arm: {
3791 srcs: ["libvndk27binder32.so"],
3792 }
3793 },
Colin Cross2807f002021-03-02 10:15:29 -08003794 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003795 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003796 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003797 withFiles(map[string][]byte{
3798 "libvndk27.so": nil,
3799 "libvndk27binder32.so": nil,
3800 }),
3801 withBinder32bit,
3802 withTargets(map[android.OsType][]android.Target{
3803 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003804 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3805 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003806 },
3807 }),
3808 )
3809
Colin Cross2807f002021-03-02 10:15:29 -08003810 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003811 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003812 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003813 })
3814}
3815
Jooyung Han45a96772020-06-15 14:59:42 +09003816func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003817 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003818 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003819 name: "com.android.vndk.current",
3820 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003821 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003822 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003823 }
3824
3825 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003826 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003827 public_key: "testkey.avbpubkey",
3828 private_key: "testkey.pem",
3829 }
3830
3831 cc_library {
3832 name: "libz",
3833 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003834 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003835 vndk: {
3836 enabled: true,
3837 },
3838 stubs: {
3839 symbol_file: "libz.map.txt",
3840 versions: ["30"],
3841 }
3842 }
3843 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3844 "libz.map.txt": nil,
3845 }))
3846
Colin Cross2807f002021-03-02 10:15:29 -08003847 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003848 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3849 ensureListEmpty(t, provideNativeLibs)
3850}
3851
Jooyung Hane1633032019-08-01 17:41:43 +09003852func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003853 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003854 apex {
3855 name: "myapex_nodep",
3856 key: "myapex.key",
3857 native_shared_libs: ["lib_nodep"],
3858 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003859 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003860 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003861 }
3862
3863 apex {
3864 name: "myapex_dep",
3865 key: "myapex.key",
3866 native_shared_libs: ["lib_dep"],
3867 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003868 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003869 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003870 }
3871
3872 apex {
3873 name: "myapex_provider",
3874 key: "myapex.key",
3875 native_shared_libs: ["libfoo"],
3876 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003877 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003878 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003879 }
3880
3881 apex {
3882 name: "myapex_selfcontained",
3883 key: "myapex.key",
3884 native_shared_libs: ["lib_dep", "libfoo"],
3885 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003886 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003887 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003888 }
3889
3890 apex_key {
3891 name: "myapex.key",
3892 public_key: "testkey.avbpubkey",
3893 private_key: "testkey.pem",
3894 }
3895
3896 cc_library {
3897 name: "lib_nodep",
3898 srcs: ["mylib.cpp"],
3899 system_shared_libs: [],
3900 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003901 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003902 }
3903
3904 cc_library {
3905 name: "lib_dep",
3906 srcs: ["mylib.cpp"],
3907 shared_libs: ["libfoo"],
3908 system_shared_libs: [],
3909 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003910 apex_available: [
3911 "myapex_dep",
3912 "myapex_provider",
3913 "myapex_selfcontained",
3914 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003915 }
3916
3917 cc_library {
3918 name: "libfoo",
3919 srcs: ["mytest.cpp"],
3920 stubs: {
3921 versions: ["1"],
3922 },
3923 system_shared_libs: [],
3924 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003925 apex_available: [
3926 "myapex_provider",
3927 "myapex_selfcontained",
3928 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003929 }
3930 `)
3931
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003932 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003933 var provideNativeLibs, requireNativeLibs []string
3934
Sundong Ahnabb64432019-10-22 13:58:29 +09003935 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003936 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3937 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003938 ensureListEmpty(t, provideNativeLibs)
3939 ensureListEmpty(t, requireNativeLibs)
3940
Sundong Ahnabb64432019-10-22 13:58:29 +09003941 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003942 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3943 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003944 ensureListEmpty(t, provideNativeLibs)
3945 ensureListContains(t, requireNativeLibs, "libfoo.so")
3946
Sundong Ahnabb64432019-10-22 13:58:29 +09003947 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003948 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3949 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003950 ensureListContains(t, provideNativeLibs, "libfoo.so")
3951 ensureListEmpty(t, requireNativeLibs)
3952
Sundong Ahnabb64432019-10-22 13:58:29 +09003953 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003954 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3955 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003956 ensureListContains(t, provideNativeLibs, "libfoo.so")
3957 ensureListEmpty(t, requireNativeLibs)
3958}
3959
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003960func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003961 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003962 apex {
3963 name: "myapex",
3964 key: "myapex.key",
3965 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003966 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003967 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003968 }
3969
3970 apex_key {
3971 name: "myapex.key",
3972 public_key: "testkey.avbpubkey",
3973 private_key: "testkey.pem",
3974 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003975
3976 cc_library {
3977 name: "mylib",
3978 srcs: ["mylib.cpp"],
3979 system_shared_libs: [],
3980 stl: "none",
3981 apex_available: [
3982 "//apex_available:platform",
3983 "myapex",
3984 ],
3985 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003986 `)
3987
Martin Stjernholmbfffae72021-06-24 14:37:13 +01003988 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003989 apexManifestRule := module.Rule("apexManifestRule")
3990 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3991 apexRule := module.Rule("apexRule")
3992 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003993
Martin Stjernholmbfffae72021-06-24 14:37:13 +01003994 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003995 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09003996 name := apexBundle.BaseModuleName()
3997 prefix := "TARGET_"
3998 var builder strings.Builder
3999 data.Custom(&builder, name, prefix, "", data)
4000 androidMk := builder.String()
4001 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4002 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004003}
4004
Alex Light0851b882019-02-07 13:20:53 -08004005func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004006 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004007 apex {
4008 name: "myapex",
4009 key: "myapex.key",
4010 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004011 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004012 }
4013
4014 apex_key {
4015 name: "myapex.key",
4016 public_key: "testkey.avbpubkey",
4017 private_key: "testkey.pem",
4018 }
4019
4020 cc_library {
4021 name: "mylib_common",
4022 srcs: ["mylib.cpp"],
4023 system_shared_libs: [],
4024 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004025 apex_available: [
4026 "//apex_available:platform",
4027 "myapex",
4028 ],
Alex Light0851b882019-02-07 13:20:53 -08004029 }
4030 `)
4031
Sundong Ahnabb64432019-10-22 13:58:29 +09004032 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004033 apexRule := module.Rule("apexRule")
4034 copyCmds := apexRule.Args["copy_commands"]
4035
4036 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4037 t.Log("Apex was a test apex!")
4038 t.Fail()
4039 }
4040 // Ensure that main rule creates an output
4041 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4042
4043 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004044 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004045
4046 // Ensure that both direct and indirect deps are copied into apex
4047 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4048
Colin Cross7113d202019-11-20 16:39:12 -08004049 // Ensure that the platform variant ends with _shared
4050 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004051
Colin Cross56a83212020-09-15 18:30:11 -07004052 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004053 t.Log("Found mylib_common not in any apex!")
4054 t.Fail()
4055 }
4056}
4057
4058func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004059 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004060 apex_test {
4061 name: "myapex",
4062 key: "myapex.key",
4063 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004064 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004065 }
4066
4067 apex_key {
4068 name: "myapex.key",
4069 public_key: "testkey.avbpubkey",
4070 private_key: "testkey.pem",
4071 }
4072
4073 cc_library {
4074 name: "mylib_common_test",
4075 srcs: ["mylib.cpp"],
4076 system_shared_libs: [],
4077 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004078 // TODO: remove //apex_available:platform
4079 apex_available: [
4080 "//apex_available:platform",
4081 "myapex",
4082 ],
Alex Light0851b882019-02-07 13:20:53 -08004083 }
4084 `)
4085
Sundong Ahnabb64432019-10-22 13:58:29 +09004086 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004087 apexRule := module.Rule("apexRule")
4088 copyCmds := apexRule.Args["copy_commands"]
4089
4090 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4091 t.Log("Apex was not a test apex!")
4092 t.Fail()
4093 }
4094 // Ensure that main rule creates an output
4095 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4096
4097 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004098 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004099
4100 // Ensure that both direct and indirect deps are copied into apex
4101 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4102
Colin Cross7113d202019-11-20 16:39:12 -08004103 // Ensure that the platform variant ends with _shared
4104 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004105}
4106
Alex Light9670d332019-01-29 18:07:33 -08004107func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004108 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004109 apex {
4110 name: "myapex",
4111 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004112 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004113 multilib: {
4114 first: {
4115 native_shared_libs: ["mylib_common"],
4116 }
4117 },
4118 target: {
4119 android: {
4120 multilib: {
4121 first: {
4122 native_shared_libs: ["mylib"],
4123 }
4124 }
4125 },
4126 host: {
4127 multilib: {
4128 first: {
4129 native_shared_libs: ["mylib2"],
4130 }
4131 }
4132 }
4133 }
4134 }
4135
4136 apex_key {
4137 name: "myapex.key",
4138 public_key: "testkey.avbpubkey",
4139 private_key: "testkey.pem",
4140 }
4141
4142 cc_library {
4143 name: "mylib",
4144 srcs: ["mylib.cpp"],
4145 system_shared_libs: [],
4146 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004147 // TODO: remove //apex_available:platform
4148 apex_available: [
4149 "//apex_available:platform",
4150 "myapex",
4151 ],
Alex Light9670d332019-01-29 18:07:33 -08004152 }
4153
4154 cc_library {
4155 name: "mylib_common",
4156 srcs: ["mylib.cpp"],
4157 system_shared_libs: [],
4158 stl: "none",
4159 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004160 // TODO: remove //apex_available:platform
4161 apex_available: [
4162 "//apex_available:platform",
4163 "myapex",
4164 ],
Alex Light9670d332019-01-29 18:07:33 -08004165 }
4166
4167 cc_library {
4168 name: "mylib2",
4169 srcs: ["mylib.cpp"],
4170 system_shared_libs: [],
4171 stl: "none",
4172 compile_multilib: "first",
4173 }
4174 `)
4175
Sundong Ahnabb64432019-10-22 13:58:29 +09004176 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004177 copyCmds := apexRule.Args["copy_commands"]
4178
4179 // Ensure that main rule creates an output
4180 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4181
4182 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004183 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4184 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4185 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004186
4187 // Ensure that both direct and indirect deps are copied into apex
4188 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4189 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4190 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4191
Colin Cross7113d202019-11-20 16:39:12 -08004192 // Ensure that the platform variant ends with _shared
4193 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4194 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4195 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004196}
Jiyong Park04480cf2019-02-06 00:16:29 +09004197
Jiyong Park59140302020-12-14 18:44:04 +09004198func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004199 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004200 apex {
4201 name: "myapex",
4202 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004203 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004204 arch: {
4205 arm64: {
4206 native_shared_libs: ["mylib.arm64"],
4207 },
4208 x86_64: {
4209 native_shared_libs: ["mylib.x64"],
4210 },
4211 }
4212 }
4213
4214 apex_key {
4215 name: "myapex.key",
4216 public_key: "testkey.avbpubkey",
4217 private_key: "testkey.pem",
4218 }
4219
4220 cc_library {
4221 name: "mylib.arm64",
4222 srcs: ["mylib.cpp"],
4223 system_shared_libs: [],
4224 stl: "none",
4225 // TODO: remove //apex_available:platform
4226 apex_available: [
4227 "//apex_available:platform",
4228 "myapex",
4229 ],
4230 }
4231
4232 cc_library {
4233 name: "mylib.x64",
4234 srcs: ["mylib.cpp"],
4235 system_shared_libs: [],
4236 stl: "none",
4237 // TODO: remove //apex_available:platform
4238 apex_available: [
4239 "//apex_available:platform",
4240 "myapex",
4241 ],
4242 }
4243 `)
4244
4245 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4246 copyCmds := apexRule.Args["copy_commands"]
4247
4248 // Ensure that apex variant is created for the direct dep
4249 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4250 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4251
4252 // Ensure that both direct and indirect deps are copied into apex
4253 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4254 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4255}
4256
Jiyong Park04480cf2019-02-06 00:16:29 +09004257func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004258 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004259 apex {
4260 name: "myapex",
4261 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004262 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004263 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004264 }
4265
4266 apex_key {
4267 name: "myapex.key",
4268 public_key: "testkey.avbpubkey",
4269 private_key: "testkey.pem",
4270 }
4271
4272 sh_binary {
4273 name: "myscript",
4274 src: "mylib.cpp",
4275 filename: "myscript.sh",
4276 sub_dir: "script",
4277 }
4278 `)
4279
Sundong Ahnabb64432019-10-22 13:58:29 +09004280 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004281 copyCmds := apexRule.Args["copy_commands"]
4282
4283 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4284}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004285
Jooyung Han91df2082019-11-20 01:49:42 +09004286func TestApexInVariousPartition(t *testing.T) {
4287 testcases := []struct {
4288 propName, parition, flattenedPartition string
4289 }{
4290 {"", "system", "system_ext"},
4291 {"product_specific: true", "product", "product"},
4292 {"soc_specific: true", "vendor", "vendor"},
4293 {"proprietary: true", "vendor", "vendor"},
4294 {"vendor: true", "vendor", "vendor"},
4295 {"system_ext_specific: true", "system_ext", "system_ext"},
4296 }
4297 for _, tc := range testcases {
4298 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004299 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004300 apex {
4301 name: "myapex",
4302 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004303 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004304 `+tc.propName+`
4305 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004306
Jooyung Han91df2082019-11-20 01:49:42 +09004307 apex_key {
4308 name: "myapex.key",
4309 public_key: "testkey.avbpubkey",
4310 private_key: "testkey.pem",
4311 }
4312 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004313
Jooyung Han91df2082019-11-20 01:49:42 +09004314 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004315 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4316 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004317 if actual != expected {
4318 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4319 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004320
Jooyung Han91df2082019-11-20 01:49:42 +09004321 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004322 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4323 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004324 if actual != expected {
4325 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4326 }
4327 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004328 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004329}
Jiyong Park67882562019-03-21 01:11:21 +09004330
Jooyung Han580eb4f2020-06-24 19:33:06 +09004331func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004332 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004333 apex {
4334 name: "myapex",
4335 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004336 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004337 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004338
Jooyung Han580eb4f2020-06-24 19:33:06 +09004339 apex_key {
4340 name: "myapex.key",
4341 public_key: "testkey.avbpubkey",
4342 private_key: "testkey.pem",
4343 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004344 `)
4345 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004346 rule := module.Output("file_contexts")
4347 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4348}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004349
Jooyung Han580eb4f2020-06-24 19:33:06 +09004350func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004351 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004352 apex {
4353 name: "myapex",
4354 key: "myapex.key",
4355 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004356 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004357 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004358
Jooyung Han580eb4f2020-06-24 19:33:06 +09004359 apex_key {
4360 name: "myapex.key",
4361 public_key: "testkey.avbpubkey",
4362 private_key: "testkey.pem",
4363 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004364 `, withFiles(map[string][]byte{
4365 "my_own_file_contexts": nil,
4366 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004367}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004368
Jooyung Han580eb4f2020-06-24 19:33:06 +09004369func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004370 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004371 apex {
4372 name: "myapex",
4373 key: "myapex.key",
4374 product_specific: true,
4375 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004376 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004377 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004378
Jooyung Han580eb4f2020-06-24 19:33:06 +09004379 apex_key {
4380 name: "myapex.key",
4381 public_key: "testkey.avbpubkey",
4382 private_key: "testkey.pem",
4383 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004384 `)
4385
Colin Cross1c460562021-02-16 17:55:47 -08004386 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004387 apex {
4388 name: "myapex",
4389 key: "myapex.key",
4390 product_specific: true,
4391 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004392 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004393 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004394
Jooyung Han580eb4f2020-06-24 19:33:06 +09004395 apex_key {
4396 name: "myapex.key",
4397 public_key: "testkey.avbpubkey",
4398 private_key: "testkey.pem",
4399 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004400 `, withFiles(map[string][]byte{
4401 "product_specific_file_contexts": nil,
4402 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004403 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4404 rule := module.Output("file_contexts")
4405 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4406}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004407
Jooyung Han580eb4f2020-06-24 19:33:06 +09004408func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004409 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004410 apex {
4411 name: "myapex",
4412 key: "myapex.key",
4413 product_specific: true,
4414 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004415 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004416 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004417
Jooyung Han580eb4f2020-06-24 19:33:06 +09004418 apex_key {
4419 name: "myapex.key",
4420 public_key: "testkey.avbpubkey",
4421 private_key: "testkey.pem",
4422 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004423
Jooyung Han580eb4f2020-06-24 19:33:06 +09004424 filegroup {
4425 name: "my-file-contexts",
4426 srcs: ["product_specific_file_contexts"],
4427 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004428 `, withFiles(map[string][]byte{
4429 "product_specific_file_contexts": nil,
4430 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004431 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4432 rule := module.Output("file_contexts")
4433 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004434}
4435
Jiyong Park67882562019-03-21 01:11:21 +09004436func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004437 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004438 apex_key {
4439 name: "myapex.key",
4440 public_key: ":my.avbpubkey",
4441 private_key: ":my.pem",
4442 product_specific: true,
4443 }
4444
4445 filegroup {
4446 name: "my.avbpubkey",
4447 srcs: ["testkey2.avbpubkey"],
4448 }
4449
4450 filegroup {
4451 name: "my.pem",
4452 srcs: ["testkey2.pem"],
4453 }
4454 `)
4455
4456 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4457 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004458 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004459 if actual_pubkey != expected_pubkey {
4460 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4461 }
4462 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004463 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004464 if actual_privkey != expected_privkey {
4465 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4466 }
4467}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004468
4469func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004470 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004471 prebuilt_apex {
4472 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004473 arch: {
4474 arm64: {
4475 src: "myapex-arm64.apex",
4476 },
4477 arm: {
4478 src: "myapex-arm.apex",
4479 },
4480 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004481 }
4482 `)
4483
Paul Duffin6717d882021-06-15 19:09:41 +01004484 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004485
Jiyong Parkc95714e2019-03-29 14:23:10 +09004486 expectedInput := "myapex-arm64.apex"
4487 if prebuilt.inputApex.String() != expectedInput {
4488 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4489 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004490}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004491
Paul Duffinc0609c62021-03-01 17:27:16 +00004492func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004493 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004494 prebuilt_apex {
4495 name: "myapex",
4496 }
4497 `)
4498}
4499
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004500func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004501 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004502 prebuilt_apex {
4503 name: "myapex",
4504 src: "myapex-arm.apex",
4505 filename: "notmyapex.apex",
4506 }
4507 `)
4508
Paul Duffin6717d882021-06-15 19:09:41 +01004509 p := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004510
4511 expected := "notmyapex.apex"
4512 if p.installFilename != expected {
4513 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4514 }
4515}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004516
Samiul Islam7c02e262021-09-08 17:48:28 +01004517func TestApexSetFilenameOverride(t *testing.T) {
4518 testApex(t, `
4519 apex_set {
4520 name: "com.company.android.myapex",
4521 apex_name: "com.android.myapex",
4522 set: "company-myapex.apks",
4523 filename: "com.company.android.myapex.apex"
4524 }
4525 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4526
4527 testApex(t, `
4528 apex_set {
4529 name: "com.company.android.myapex",
4530 apex_name: "com.android.myapex",
4531 set: "company-myapex.apks",
4532 filename: "com.company.android.myapex.capex"
4533 }
4534 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4535
4536 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4537 apex_set {
4538 name: "com.company.android.myapex",
4539 apex_name: "com.android.myapex",
4540 set: "company-myapex.apks",
4541 filename: "some-random-suffix"
4542 }
4543 `)
4544}
4545
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004546func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004547 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004548 prebuilt_apex {
4549 name: "myapex.prebuilt",
4550 src: "myapex-arm.apex",
4551 overrides: [
4552 "myapex",
4553 ],
4554 }
4555 `)
4556
Paul Duffin6717d882021-06-15 19:09:41 +01004557 p := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt").Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004558
4559 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004560 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004561 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004562 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004563 }
4564}
4565
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004566func TestPrebuiltApexName(t *testing.T) {
4567 testApex(t, `
4568 prebuilt_apex {
4569 name: "com.company.android.myapex",
4570 apex_name: "com.android.myapex",
4571 src: "company-myapex-arm.apex",
4572 }
4573 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4574
4575 testApex(t, `
4576 apex_set {
4577 name: "com.company.android.myapex",
4578 apex_name: "com.android.myapex",
4579 set: "company-myapex.apks",
4580 }
4581 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4582}
4583
4584func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4585 _ = android.GroupFixturePreparers(
4586 java.PrepareForTestWithJavaDefaultModules,
4587 PrepareForTestWithApexBuildComponents,
4588 android.FixtureWithRootAndroidBp(`
4589 platform_bootclasspath {
4590 name: "platform-bootclasspath",
4591 fragments: [
4592 {
4593 apex: "com.android.art",
4594 module: "art-bootclasspath-fragment",
4595 },
4596 ],
4597 }
4598
4599 prebuilt_apex {
4600 name: "com.company.android.art",
4601 apex_name: "com.android.art",
4602 src: "com.company.android.art-arm.apex",
4603 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4604 }
4605
4606 prebuilt_bootclasspath_fragment {
4607 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004608 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004609 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004610 hidden_api: {
4611 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4612 metadata: "my-bootclasspath-fragment/metadata.csv",
4613 index: "my-bootclasspath-fragment/index.csv",
4614 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4615 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4616 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004617 }
4618
4619 java_import {
4620 name: "core-oj",
4621 jars: ["prebuilt.jar"],
4622 }
4623 `),
4624 ).RunTest(t)
4625}
4626
Paul Duffin092153d2021-01-26 11:42:39 +00004627// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4628// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004629func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004630 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004631
Paul Duffin89886cb2021-02-05 16:44:03 +00004632 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004633 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004634 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004635 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004636 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004637 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004638 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4639 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4640 android.NormalizePathForTesting(dexJarBuildPath))
4641 }
4642
4643 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004644 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004645 // Make sure the import has been given the correct path to the dex jar.
4646 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4647 dexJarBuildPath := p.DexJarInstallPath()
4648 stem := android.RemoveOptionalPrebuiltPrefix(name)
4649 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4650 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4651 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004652 }
4653
Paul Duffin39853512021-02-26 11:09:39 +00004654 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004655 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004656 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004657 android.AssertArrayString(t, "Check if there is no source variant",
4658 []string{"android_common"},
4659 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004660 }
4661
4662 t.Run("prebuilt only", func(t *testing.T) {
4663 bp := `
4664 prebuilt_apex {
4665 name: "myapex",
4666 arch: {
4667 arm64: {
4668 src: "myapex-arm64.apex",
4669 },
4670 arm: {
4671 src: "myapex-arm.apex",
4672 },
4673 },
Paul Duffin39853512021-02-26 11:09:39 +00004674 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004675 }
4676
4677 java_import {
4678 name: "libfoo",
4679 jars: ["libfoo.jar"],
4680 }
Paul Duffin39853512021-02-26 11:09:39 +00004681
4682 java_sdk_library_import {
4683 name: "libbar",
4684 public: {
4685 jars: ["libbar.jar"],
4686 },
4687 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004688 `
4689
4690 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4691 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4692
Martin Stjernholm44825602021-09-17 01:44:12 +01004693 deapexerName := deapexerModuleName("myapex")
4694 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4695
Paul Duffinf6932af2021-02-26 18:21:56 +00004696 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004697 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004698 rule := deapexer.Rule("deapexer")
4699 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4700 t.Errorf("expected: %q, found: %q", expected, actual)
4701 }
4702
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004703 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004704 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004705 rule = prebuiltApex.Rule("android/soong/android.Cp")
4706 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4707 t.Errorf("expected: %q, found: %q", expected, actual)
4708 }
4709
Paul Duffin89886cb2021-02-05 16:44:03 +00004710 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004711 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004712
4713 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004714 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004715 })
4716
4717 t.Run("prebuilt with source preferred", func(t *testing.T) {
4718
4719 bp := `
4720 prebuilt_apex {
4721 name: "myapex",
4722 arch: {
4723 arm64: {
4724 src: "myapex-arm64.apex",
4725 },
4726 arm: {
4727 src: "myapex-arm.apex",
4728 },
4729 },
Paul Duffin39853512021-02-26 11:09:39 +00004730 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004731 }
4732
4733 java_import {
4734 name: "libfoo",
4735 jars: ["libfoo.jar"],
4736 }
4737
4738 java_library {
4739 name: "libfoo",
4740 }
Paul Duffin39853512021-02-26 11:09:39 +00004741
4742 java_sdk_library_import {
4743 name: "libbar",
4744 public: {
4745 jars: ["libbar.jar"],
4746 },
4747 }
4748
4749 java_sdk_library {
4750 name: "libbar",
4751 srcs: ["foo/bar/MyClass.java"],
4752 unsafe_ignore_missing_latest_api: true,
4753 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004754 `
4755
4756 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4757 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4758
Paul Duffin89886cb2021-02-05 16:44:03 +00004759 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004760 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004761 ensureNoSourceVariant(t, ctx, "libfoo")
4762
4763 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004764 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004765 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004766 })
4767
4768 t.Run("prebuilt preferred with source", func(t *testing.T) {
4769 bp := `
4770 prebuilt_apex {
4771 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004772 arch: {
4773 arm64: {
4774 src: "myapex-arm64.apex",
4775 },
4776 arm: {
4777 src: "myapex-arm.apex",
4778 },
4779 },
Paul Duffin39853512021-02-26 11:09:39 +00004780 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004781 }
4782
4783 java_import {
4784 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004785 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004786 jars: ["libfoo.jar"],
4787 }
4788
4789 java_library {
4790 name: "libfoo",
4791 }
Paul Duffin39853512021-02-26 11:09:39 +00004792
4793 java_sdk_library_import {
4794 name: "libbar",
4795 prefer: true,
4796 public: {
4797 jars: ["libbar.jar"],
4798 },
4799 }
4800
4801 java_sdk_library {
4802 name: "libbar",
4803 srcs: ["foo/bar/MyClass.java"],
4804 unsafe_ignore_missing_latest_api: true,
4805 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004806 `
4807
4808 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4809 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4810
Paul Duffin89886cb2021-02-05 16:44:03 +00004811 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004812 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004813 ensureNoSourceVariant(t, ctx, "libfoo")
4814
4815 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004816 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004817 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004818 })
4819}
4820
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004821func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004822 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004823 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004824 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4825 // is disabled.
4826 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4827 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004828
Paul Duffin37856732021-02-26 14:24:15 +00004829 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4830 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004831 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004832 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004833 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004834 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004835 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004836 foundLibfooJar = true
4837 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004838 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004839 }
4840 }
4841 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004842 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 +00004843 }
4844 }
4845
Paul Duffin40a3f652021-07-19 13:11:24 +01004846 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004847 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004848 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004849 var rule android.TestingBuildParams
4850
4851 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4852 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004853 }
4854
Paul Duffin40a3f652021-07-19 13:11:24 +01004855 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4856 t.Helper()
4857 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4858 var rule android.TestingBuildParams
4859
4860 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4861 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4862 }
4863
Paul Duffin89f570a2021-06-16 01:42:33 +01004864 fragment := java.ApexVariantReference{
4865 Apex: proptools.StringPtr("myapex"),
4866 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4867 }
4868
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004869 t.Run("prebuilt only", func(t *testing.T) {
4870 bp := `
4871 prebuilt_apex {
4872 name: "myapex",
4873 arch: {
4874 arm64: {
4875 src: "myapex-arm64.apex",
4876 },
4877 arm: {
4878 src: "myapex-arm.apex",
4879 },
4880 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004881 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4882 }
4883
4884 prebuilt_bootclasspath_fragment {
4885 name: "my-bootclasspath-fragment",
4886 contents: ["libfoo", "libbar"],
4887 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004888 hidden_api: {
4889 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4890 metadata: "my-bootclasspath-fragment/metadata.csv",
4891 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004892 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4893 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4894 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004895 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004896 }
4897
4898 java_import {
4899 name: "libfoo",
4900 jars: ["libfoo.jar"],
4901 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004902 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004903 }
Paul Duffin37856732021-02-26 14:24:15 +00004904
4905 java_sdk_library_import {
4906 name: "libbar",
4907 public: {
4908 jars: ["libbar.jar"],
4909 },
4910 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004911 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01004912 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00004913 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004914 `
4915
Paul Duffin89f570a2021-06-16 01:42:33 +01004916 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01004917 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4918 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004919
Paul Duffin537ea3d2021-05-14 10:38:00 +01004920 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01004921 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01004922 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01004923 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01004924 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
4925 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004926 })
4927
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004928 t.Run("apex_set only", func(t *testing.T) {
4929 bp := `
4930 apex_set {
4931 name: "myapex",
4932 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01004933 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4934 }
4935
4936 prebuilt_bootclasspath_fragment {
4937 name: "my-bootclasspath-fragment",
4938 contents: ["libfoo", "libbar"],
4939 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004940 hidden_api: {
4941 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4942 metadata: "my-bootclasspath-fragment/metadata.csv",
4943 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004944 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4945 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4946 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004947 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004948 }
4949
4950 java_import {
4951 name: "libfoo",
4952 jars: ["libfoo.jar"],
4953 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004954 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004955 }
4956
4957 java_sdk_library_import {
4958 name: "libbar",
4959 public: {
4960 jars: ["libbar.jar"],
4961 },
4962 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004963 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01004964 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004965 }
4966 `
4967
Paul Duffin89f570a2021-06-16 01:42:33 +01004968 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004969 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4970 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
4971
Paul Duffin537ea3d2021-05-14 10:38:00 +01004972 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01004973 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01004974 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01004975 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01004976 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
4977 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004978 })
4979
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004980 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4981 bp := `
4982 prebuilt_apex {
4983 name: "myapex",
4984 arch: {
4985 arm64: {
4986 src: "myapex-arm64.apex",
4987 },
4988 arm: {
4989 src: "myapex-arm.apex",
4990 },
4991 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004992 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4993 }
4994
4995 prebuilt_bootclasspath_fragment {
4996 name: "my-bootclasspath-fragment",
4997 contents: ["libfoo", "libbar"],
4998 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004999 hidden_api: {
5000 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5001 metadata: "my-bootclasspath-fragment/metadata.csv",
5002 index: "my-bootclasspath-fragment/index.csv",
5003 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5004 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5005 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005006 }
5007
5008 java_import {
5009 name: "libfoo",
5010 jars: ["libfoo.jar"],
5011 apex_available: ["myapex"],
5012 }
5013
5014 java_library {
5015 name: "libfoo",
5016 srcs: ["foo/bar/MyClass.java"],
5017 apex_available: ["myapex"],
5018 }
Paul Duffin37856732021-02-26 14:24:15 +00005019
5020 java_sdk_library_import {
5021 name: "libbar",
5022 public: {
5023 jars: ["libbar.jar"],
5024 },
5025 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005026 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005027 }
5028
5029 java_sdk_library {
5030 name: "libbar",
5031 srcs: ["foo/bar/MyClass.java"],
5032 unsafe_ignore_missing_latest_api: true,
5033 apex_available: ["myapex"],
5034 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005035 `
5036
5037 // In this test the source (java_library) libfoo is active since the
5038 // prebuilt (java_import) defaults to prefer:false. However the
5039 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5040 // find the dex boot jar in it. We either need to disable the source libfoo
5041 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005042 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005043 // dexbootjar check is skipped if AllowMissingDependencies is true
5044 preparerAllowMissingDeps := android.GroupFixturePreparers(
5045 preparer,
5046 android.PrepareForTestWithAllowMissingDependencies,
5047 )
5048 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005049 })
5050
5051 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5052 bp := `
5053 prebuilt_apex {
5054 name: "myapex",
5055 arch: {
5056 arm64: {
5057 src: "myapex-arm64.apex",
5058 },
5059 arm: {
5060 src: "myapex-arm.apex",
5061 },
5062 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005063 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5064 }
5065
5066 prebuilt_bootclasspath_fragment {
5067 name: "my-bootclasspath-fragment",
5068 contents: ["libfoo", "libbar"],
5069 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005070 hidden_api: {
5071 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5072 metadata: "my-bootclasspath-fragment/metadata.csv",
5073 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005074 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5075 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5076 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005077 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005078 }
5079
5080 java_import {
5081 name: "libfoo",
5082 prefer: true,
5083 jars: ["libfoo.jar"],
5084 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005085 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005086 }
5087
5088 java_library {
5089 name: "libfoo",
5090 srcs: ["foo/bar/MyClass.java"],
5091 apex_available: ["myapex"],
5092 }
Paul Duffin37856732021-02-26 14:24:15 +00005093
5094 java_sdk_library_import {
5095 name: "libbar",
5096 prefer: true,
5097 public: {
5098 jars: ["libbar.jar"],
5099 },
5100 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005101 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005102 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005103 }
5104
5105 java_sdk_library {
5106 name: "libbar",
5107 srcs: ["foo/bar/MyClass.java"],
5108 unsafe_ignore_missing_latest_api: true,
5109 apex_available: ["myapex"],
5110 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005111 `
5112
Paul Duffin89f570a2021-06-16 01:42:33 +01005113 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005114 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5115 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005116
Paul Duffin537ea3d2021-05-14 10:38:00 +01005117 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005118 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005119 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005120 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005121 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5122 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005123 })
5124
5125 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5126 bp := `
5127 apex {
5128 name: "myapex",
5129 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005130 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005131 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005132 }
5133
5134 apex_key {
5135 name: "myapex.key",
5136 public_key: "testkey.avbpubkey",
5137 private_key: "testkey.pem",
5138 }
5139
5140 prebuilt_apex {
5141 name: "myapex",
5142 arch: {
5143 arm64: {
5144 src: "myapex-arm64.apex",
5145 },
5146 arm: {
5147 src: "myapex-arm.apex",
5148 },
5149 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005150 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5151 }
5152
5153 prebuilt_bootclasspath_fragment {
5154 name: "my-bootclasspath-fragment",
5155 contents: ["libfoo", "libbar"],
5156 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005157 hidden_api: {
5158 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5159 metadata: "my-bootclasspath-fragment/metadata.csv",
5160 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005161 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5162 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5163 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005164 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005165 }
5166
5167 java_import {
5168 name: "libfoo",
5169 jars: ["libfoo.jar"],
5170 apex_available: ["myapex"],
5171 }
5172
5173 java_library {
5174 name: "libfoo",
5175 srcs: ["foo/bar/MyClass.java"],
5176 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005177 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005178 }
Paul Duffin37856732021-02-26 14:24:15 +00005179
5180 java_sdk_library_import {
5181 name: "libbar",
5182 public: {
5183 jars: ["libbar.jar"],
5184 },
5185 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005186 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005187 }
5188
5189 java_sdk_library {
5190 name: "libbar",
5191 srcs: ["foo/bar/MyClass.java"],
5192 unsafe_ignore_missing_latest_api: true,
5193 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005194 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005195 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005196 `
5197
Paul Duffin89f570a2021-06-16 01:42:33 +01005198 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005199 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5200 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005201
Paul Duffin537ea3d2021-05-14 10:38:00 +01005202 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005203 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005204 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005205 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005206 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5207 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005208 })
5209
5210 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5211 bp := `
5212 apex {
5213 name: "myapex",
5214 enabled: false,
5215 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005216 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005217 }
5218
5219 apex_key {
5220 name: "myapex.key",
5221 public_key: "testkey.avbpubkey",
5222 private_key: "testkey.pem",
5223 }
5224
5225 prebuilt_apex {
5226 name: "myapex",
5227 arch: {
5228 arm64: {
5229 src: "myapex-arm64.apex",
5230 },
5231 arm: {
5232 src: "myapex-arm.apex",
5233 },
5234 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005235 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5236 }
5237
5238 prebuilt_bootclasspath_fragment {
5239 name: "my-bootclasspath-fragment",
5240 contents: ["libfoo", "libbar"],
5241 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005242 hidden_api: {
5243 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5244 metadata: "my-bootclasspath-fragment/metadata.csv",
5245 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005246 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5247 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5248 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005249 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005250 }
5251
5252 java_import {
5253 name: "libfoo",
5254 prefer: true,
5255 jars: ["libfoo.jar"],
5256 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005257 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005258 }
5259
5260 java_library {
5261 name: "libfoo",
5262 srcs: ["foo/bar/MyClass.java"],
5263 apex_available: ["myapex"],
5264 }
Paul Duffin37856732021-02-26 14:24:15 +00005265
5266 java_sdk_library_import {
5267 name: "libbar",
5268 prefer: true,
5269 public: {
5270 jars: ["libbar.jar"],
5271 },
5272 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005273 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005274 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005275 }
5276
5277 java_sdk_library {
5278 name: "libbar",
5279 srcs: ["foo/bar/MyClass.java"],
5280 unsafe_ignore_missing_latest_api: true,
5281 apex_available: ["myapex"],
5282 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005283 `
5284
Paul Duffin89f570a2021-06-16 01:42:33 +01005285 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005286 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5287 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005288
Paul Duffin537ea3d2021-05-14 10:38:00 +01005289 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005290 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005291 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005292 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005293 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5294 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005295 })
5296}
5297
Roland Levillain630846d2019-06-26 12:48:34 +01005298func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005299 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005300 apex_test {
5301 name: "myapex",
5302 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005303 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005304 tests: [
5305 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005306 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005307 ],
5308 }
5309
5310 apex_key {
5311 name: "myapex.key",
5312 public_key: "testkey.avbpubkey",
5313 private_key: "testkey.pem",
5314 }
5315
Liz Kammer1c14a212020-05-12 15:26:55 -07005316 filegroup {
5317 name: "fg",
5318 srcs: [
5319 "baz",
5320 "bar/baz"
5321 ],
5322 }
5323
Roland Levillain630846d2019-06-26 12:48:34 +01005324 cc_test {
5325 name: "mytest",
5326 gtest: false,
5327 srcs: ["mytest.cpp"],
5328 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005329 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005330 system_shared_libs: [],
5331 static_executable: true,
5332 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005333 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005334 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005335
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005336 cc_library {
5337 name: "mylib",
5338 srcs: ["mylib.cpp"],
5339 system_shared_libs: [],
5340 stl: "none",
5341 }
5342
Liz Kammer5bd365f2020-05-27 15:15:11 -07005343 filegroup {
5344 name: "fg2",
5345 srcs: [
5346 "testdata/baz"
5347 ],
5348 }
5349
Roland Levillain9b5fde92019-06-28 15:41:19 +01005350 cc_test {
5351 name: "mytests",
5352 gtest: false,
5353 srcs: [
5354 "mytest1.cpp",
5355 "mytest2.cpp",
5356 "mytest3.cpp",
5357 ],
5358 test_per_src: true,
5359 relative_install_path: "test",
5360 system_shared_libs: [],
5361 static_executable: true,
5362 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005363 data: [
5364 ":fg",
5365 ":fg2",
5366 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005367 }
Roland Levillain630846d2019-06-26 12:48:34 +01005368 `)
5369
Sundong Ahnabb64432019-10-22 13:58:29 +09005370 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005371 copyCmds := apexRule.Args["copy_commands"]
5372
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005373 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005374 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005375 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005376
Liz Kammer1c14a212020-05-12 15:26:55 -07005377 //Ensure that test data are copied into apex.
5378 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5379 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5380
Roland Levillain9b5fde92019-06-28 15:41:19 +01005381 // Ensure that test deps built with `test_per_src` are copied into apex.
5382 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5383 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5384 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005385
5386 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005387 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005388 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005389 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005390 prefix := "TARGET_"
5391 var builder strings.Builder
5392 data.Custom(&builder, name, prefix, "", data)
5393 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005394 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5395 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5396 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5397 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005398 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005399 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005400 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005401
5402 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005403 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005404 data.Custom(&builder, name, prefix, "", data)
5405 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005406 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5407 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005408}
5409
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005410func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005411 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005412 apex {
5413 name: "myapex",
5414 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005415 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005416 }
5417 apex_key {
5418 name: "myapex.key",
5419 public_key: "testkey.avbpubkey",
5420 private_key: "testkey.pem",
5421 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005422 `,
5423 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5424 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5425 }),
5426 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005427 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005428 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005429 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005430 var builder strings.Builder
5431 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5432 androidMk := builder.String()
5433 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5434}
5435
Jooyung Hand48f3c32019-08-23 11:18:57 +09005436func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5437 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5438 apex {
5439 name: "myapex",
5440 key: "myapex.key",
5441 native_shared_libs: ["libfoo"],
5442 }
5443
5444 apex_key {
5445 name: "myapex.key",
5446 public_key: "testkey.avbpubkey",
5447 private_key: "testkey.pem",
5448 }
5449
5450 cc_library {
5451 name: "libfoo",
5452 stl: "none",
5453 system_shared_libs: [],
5454 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005455 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005456 }
5457 `)
5458 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5459 apex {
5460 name: "myapex",
5461 key: "myapex.key",
5462 java_libs: ["myjar"],
5463 }
5464
5465 apex_key {
5466 name: "myapex.key",
5467 public_key: "testkey.avbpubkey",
5468 private_key: "testkey.pem",
5469 }
5470
5471 java_library {
5472 name: "myjar",
5473 srcs: ["foo/bar/MyClass.java"],
5474 sdk_version: "none",
5475 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005476 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005477 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005478 }
5479 `)
5480}
5481
Bill Peckhama41a6962021-01-11 10:58:54 -08005482func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005483 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005484 apex {
5485 name: "myapex",
5486 key: "myapex.key",
5487 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005488 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005489 }
5490
5491 apex_key {
5492 name: "myapex.key",
5493 public_key: "testkey.avbpubkey",
5494 private_key: "testkey.pem",
5495 }
5496
5497 java_import {
5498 name: "myjavaimport",
5499 apex_available: ["myapex"],
5500 jars: ["my.jar"],
5501 compile_dex: true,
5502 }
5503 `)
5504
5505 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5506 apexRule := module.Rule("apexRule")
5507 copyCmds := apexRule.Args["copy_commands"]
5508 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5509}
5510
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005511func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005512 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005513 apex {
5514 name: "myapex",
5515 key: "myapex.key",
5516 apps: [
5517 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005518 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005519 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005520 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005521 }
5522
5523 apex_key {
5524 name: "myapex.key",
5525 public_key: "testkey.avbpubkey",
5526 private_key: "testkey.pem",
5527 }
5528
5529 android_app {
5530 name: "AppFoo",
5531 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005532 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005533 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005534 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005535 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005536 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005537 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005538
5539 android_app {
5540 name: "AppFooPriv",
5541 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005542 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005543 system_modules: "none",
5544 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005545 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005546 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005547 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005548
5549 cc_library_shared {
5550 name: "libjni",
5551 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005552 shared_libs: ["libfoo"],
5553 stl: "none",
5554 system_shared_libs: [],
5555 apex_available: [ "myapex" ],
5556 sdk_version: "current",
5557 }
5558
5559 cc_library_shared {
5560 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005561 stl: "none",
5562 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005563 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005564 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005565 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005566 `)
5567
Sundong Ahnabb64432019-10-22 13:58:29 +09005568 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005569 apexRule := module.Rule("apexRule")
5570 copyCmds := apexRule.Args["copy_commands"]
5571
5572 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005573 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005574
Colin Crossaede88c2020-08-11 12:17:01 -07005575 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005576 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005577 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005578 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005579 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005580 // JNI libraries including transitive deps are
5581 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005582 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005583 // ... embedded inside APK (jnilibs.zip)
5584 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5585 // ... and not directly inside the APEX
5586 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5587 }
Dario Frenicde2a032019-10-27 00:29:22 +01005588}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005589
Dario Frenicde2a032019-10-27 00:29:22 +01005590func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005591 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005592 apex {
5593 name: "myapex",
5594 key: "myapex.key",
5595 apps: [
5596 "AppFooPrebuilt",
5597 "AppFooPrivPrebuilt",
5598 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005599 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005600 }
5601
5602 apex_key {
5603 name: "myapex.key",
5604 public_key: "testkey.avbpubkey",
5605 private_key: "testkey.pem",
5606 }
5607
5608 android_app_import {
5609 name: "AppFooPrebuilt",
5610 apk: "PrebuiltAppFoo.apk",
5611 presigned: true,
5612 dex_preopt: {
5613 enabled: false,
5614 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005615 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005616 }
5617
5618 android_app_import {
5619 name: "AppFooPrivPrebuilt",
5620 apk: "PrebuiltAppFooPriv.apk",
5621 privileged: true,
5622 presigned: true,
5623 dex_preopt: {
5624 enabled: false,
5625 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005626 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005627 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005628 }
5629 `)
5630
Sundong Ahnabb64432019-10-22 13:58:29 +09005631 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005632 apexRule := module.Rule("apexRule")
5633 copyCmds := apexRule.Args["copy_commands"]
5634
5635 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005636 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5637}
5638
5639func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005640 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005641 apex {
5642 name: "myapex",
5643 key: "myapex.key",
5644 apps: [
5645 "AppFoo",
5646 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005647 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005648 }
5649
5650 apex_key {
5651 name: "myapex.key",
5652 public_key: "testkey.avbpubkey",
5653 private_key: "testkey.pem",
5654 }
5655
5656 android_app {
5657 name: "AppFoo",
5658 srcs: ["foo/bar/MyClass.java"],
5659 sdk_version: "none",
5660 system_modules: "none",
5661 apex_available: [ "myapex" ],
5662 }
5663
5664 android_app_import {
5665 name: "AppFoo",
5666 apk: "AppFooPrebuilt.apk",
5667 filename: "AppFooPrebuilt.apk",
5668 presigned: true,
5669 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005670 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005671 }
5672 `, withFiles(map[string][]byte{
5673 "AppFooPrebuilt.apk": nil,
5674 }))
5675
5676 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005677 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005678 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005679}
5680
Dario Freni6f3937c2019-12-20 22:58:03 +00005681func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005682 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005683 apex {
5684 name: "myapex",
5685 key: "myapex.key",
5686 apps: [
5687 "TesterHelpAppFoo",
5688 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005689 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005690 }
5691
5692 apex_key {
5693 name: "myapex.key",
5694 public_key: "testkey.avbpubkey",
5695 private_key: "testkey.pem",
5696 }
5697
5698 android_test_helper_app {
5699 name: "TesterHelpAppFoo",
5700 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005701 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005702 }
5703
5704 `)
5705
5706 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5707 apexRule := module.Rule("apexRule")
5708 copyCmds := apexRule.Args["copy_commands"]
5709
5710 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5711}
5712
Jooyung Han18020ea2019-11-13 10:50:48 +09005713func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5714 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005715 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005716 apex {
5717 name: "myapex",
5718 key: "myapex.key",
5719 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005720 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005721 }
5722
5723 apex_key {
5724 name: "myapex.key",
5725 public_key: "testkey.avbpubkey",
5726 private_key: "testkey.pem",
5727 }
5728
5729 apex {
5730 name: "otherapex",
5731 key: "myapex.key",
5732 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005733 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005734 }
5735
5736 cc_defaults {
5737 name: "libfoo-defaults",
5738 apex_available: ["otherapex"],
5739 }
5740
5741 cc_library {
5742 name: "libfoo",
5743 defaults: ["libfoo-defaults"],
5744 stl: "none",
5745 system_shared_libs: [],
5746 }`)
5747}
5748
Paul Duffine52e66f2020-03-30 17:54:29 +01005749func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005750 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005751 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005752 apex {
5753 name: "myapex",
5754 key: "myapex.key",
5755 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005756 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005757 }
5758
5759 apex_key {
5760 name: "myapex.key",
5761 public_key: "testkey.avbpubkey",
5762 private_key: "testkey.pem",
5763 }
5764
5765 apex {
5766 name: "otherapex",
5767 key: "otherapex.key",
5768 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005769 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005770 }
5771
5772 apex_key {
5773 name: "otherapex.key",
5774 public_key: "testkey.avbpubkey",
5775 private_key: "testkey.pem",
5776 }
5777
5778 cc_library {
5779 name: "libfoo",
5780 stl: "none",
5781 system_shared_libs: [],
5782 apex_available: ["otherapex"],
5783 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005784}
Jiyong Park127b40b2019-09-30 16:04:35 +09005785
Paul Duffine52e66f2020-03-30 17:54:29 +01005786func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005787 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005788 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005789.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005790.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005791.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005792.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005793.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005794.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005795 apex {
5796 name: "myapex",
5797 key: "myapex.key",
5798 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005799 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005800 }
5801
5802 apex_key {
5803 name: "myapex.key",
5804 public_key: "testkey.avbpubkey",
5805 private_key: "testkey.pem",
5806 }
5807
Jiyong Park127b40b2019-09-30 16:04:35 +09005808 cc_library {
5809 name: "libfoo",
5810 stl: "none",
5811 shared_libs: ["libbar"],
5812 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005813 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005814 }
5815
5816 cc_library {
5817 name: "libbar",
5818 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005819 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005820 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005821 apex_available: ["myapex"],
5822 }
5823
5824 cc_library {
5825 name: "libbaz",
5826 stl: "none",
5827 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005828 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005829}
Jiyong Park127b40b2019-09-30 16:04:35 +09005830
Paul Duffine52e66f2020-03-30 17:54:29 +01005831func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005832 testApexError(t, "\"otherapex\" is not a valid module name", `
5833 apex {
5834 name: "myapex",
5835 key: "myapex.key",
5836 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005837 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005838 }
5839
5840 apex_key {
5841 name: "myapex.key",
5842 public_key: "testkey.avbpubkey",
5843 private_key: "testkey.pem",
5844 }
5845
5846 cc_library {
5847 name: "libfoo",
5848 stl: "none",
5849 system_shared_libs: [],
5850 apex_available: ["otherapex"],
5851 }`)
5852
Paul Duffine52e66f2020-03-30 17:54:29 +01005853 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005854 apex {
5855 name: "myapex",
5856 key: "myapex.key",
5857 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005858 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005859 }
5860
5861 apex_key {
5862 name: "myapex.key",
5863 public_key: "testkey.avbpubkey",
5864 private_key: "testkey.pem",
5865 }
5866
5867 cc_library {
5868 name: "libfoo",
5869 stl: "none",
5870 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005871 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005872 apex_available: ["myapex"],
5873 }
5874
5875 cc_library {
5876 name: "libbar",
5877 stl: "none",
5878 system_shared_libs: [],
5879 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005880 }
5881
5882 cc_library {
5883 name: "libbaz",
5884 stl: "none",
5885 system_shared_libs: [],
5886 stubs: {
5887 versions: ["10", "20", "30"],
5888 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005889 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005890}
Jiyong Park127b40b2019-09-30 16:04:35 +09005891
Jiyong Park89e850a2020-04-07 16:37:39 +09005892func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005893 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005894 apex {
5895 name: "myapex",
5896 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005897 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005898 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005899 }
5900
5901 apex_key {
5902 name: "myapex.key",
5903 public_key: "testkey.avbpubkey",
5904 private_key: "testkey.pem",
5905 }
5906
5907 cc_library {
5908 name: "libfoo",
5909 stl: "none",
5910 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005911 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005912 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005913 }
5914
5915 cc_library {
5916 name: "libfoo2",
5917 stl: "none",
5918 system_shared_libs: [],
5919 shared_libs: ["libbaz"],
5920 apex_available: ["//apex_available:platform"],
5921 }
5922
5923 cc_library {
5924 name: "libbar",
5925 stl: "none",
5926 system_shared_libs: [],
5927 apex_available: ["myapex"],
5928 }
5929
5930 cc_library {
5931 name: "libbaz",
5932 stl: "none",
5933 system_shared_libs: [],
5934 apex_available: ["myapex"],
5935 stubs: {
5936 versions: ["1"],
5937 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005938 }`)
5939
Jiyong Park89e850a2020-04-07 16:37:39 +09005940 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5941 // because it depends on libbar which isn't available to platform
5942 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5943 if libfoo.NotAvailableForPlatform() != true {
5944 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5945 }
5946
5947 // libfoo2 however can be available to platform because it depends on libbaz which provides
5948 // stubs
5949 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5950 if libfoo2.NotAvailableForPlatform() == true {
5951 t.Errorf("%q should be available to platform", libfoo2.String())
5952 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005953}
Jiyong Parka90ca002019-10-07 15:47:24 +09005954
Paul Duffine52e66f2020-03-30 17:54:29 +01005955func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005956 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005957 apex {
5958 name: "myapex",
5959 key: "myapex.key",
5960 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005961 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09005962 }
5963
5964 apex_key {
5965 name: "myapex.key",
5966 public_key: "testkey.avbpubkey",
5967 private_key: "testkey.pem",
5968 }
5969
5970 cc_library {
5971 name: "libfoo",
5972 stl: "none",
5973 system_shared_libs: [],
5974 apex_available: ["myapex"],
5975 static: {
5976 apex_available: ["//apex_available:platform"],
5977 },
5978 }`)
5979
Jiyong Park89e850a2020-04-07 16:37:39 +09005980 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5981 if libfooShared.NotAvailableForPlatform() != true {
5982 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5983 }
5984 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5985 if libfooStatic.NotAvailableForPlatform() != false {
5986 t.Errorf("%q should be available to platform", libfooStatic.String())
5987 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005988}
5989
Jiyong Park5d790c32019-11-15 18:40:32 +09005990func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005991 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005992 apex {
5993 name: "myapex",
5994 key: "myapex.key",
5995 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08005996 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07005997 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005998 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005999 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006000 }
6001
6002 override_apex {
6003 name: "override_myapex",
6004 base: "myapex",
6005 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08006006 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006007 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006008 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006009 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006010 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006011 key: "mynewapex.key",
6012 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006013 }
6014
6015 apex_key {
6016 name: "myapex.key",
6017 public_key: "testkey.avbpubkey",
6018 private_key: "testkey.pem",
6019 }
6020
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006021 apex_key {
6022 name: "mynewapex.key",
6023 public_key: "testkey2.avbpubkey",
6024 private_key: "testkey2.pem",
6025 }
6026
6027 android_app_certificate {
6028 name: "myapex.certificate",
6029 certificate: "testkey",
6030 }
6031
Jiyong Park5d790c32019-11-15 18:40:32 +09006032 android_app {
6033 name: "app",
6034 srcs: ["foo/bar/MyClass.java"],
6035 package_name: "foo",
6036 sdk_version: "none",
6037 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006038 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006039 }
6040
6041 override_android_app {
6042 name: "override_app",
6043 base: "app",
6044 package_name: "bar",
6045 }
markchien7c803b82021-08-26 22:10:06 +08006046
6047 bpf {
6048 name: "bpf",
6049 srcs: ["bpf.c"],
6050 }
6051
6052 bpf {
6053 name: "override_bpf",
6054 srcs: ["override_bpf.c"],
6055 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006056
6057 prebuilt_etc {
6058 name: "myetc",
6059 src: "myprebuilt",
6060 }
6061
6062 prebuilt_etc {
6063 name: "override_myetc",
6064 src: "override_myprebuilt",
6065 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006066 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006067
Jiyong Park317645e2019-12-05 13:20:58 +09006068 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6069 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6070 if originalVariant.GetOverriddenBy() != "" {
6071 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6072 }
6073 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6074 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6075 }
6076
Jiyong Park5d790c32019-11-15 18:40:32 +09006077 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6078 apexRule := module.Rule("apexRule")
6079 copyCmds := apexRule.Args["copy_commands"]
6080
6081 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006082 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006083
markchien7c803b82021-08-26 22:10:06 +08006084 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6085 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6086
Daniel Norman5a3ce132021-08-26 15:44:43 -07006087 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6088 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6089
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006090 apexBundle := module.Module().(*apexBundle)
6091 name := apexBundle.Name()
6092 if name != "override_myapex" {
6093 t.Errorf("name should be \"override_myapex\", but was %q", name)
6094 }
6095
Baligh Uddin004d7172020-02-19 21:29:28 -08006096 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6097 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6098 }
6099
Jiyong Park20bacab2020-03-03 11:45:41 +09006100 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006101 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006102 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6103
6104 signApkRule := module.Rule("signapk")
6105 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006106
Colin Crossaa255532020-07-03 13:18:24 -07006107 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006108 var builder strings.Builder
6109 data.Custom(&builder, name, "TARGET_", "", data)
6110 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006111 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006112 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006113 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
6114 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006115 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006116 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006117 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006118 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006119 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6120 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006121}
6122
Jooyung Han214bf372019-11-12 13:03:50 +09006123func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006124 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006125 apex {
6126 name: "myapex",
6127 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006128 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006129 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006130 }
6131
6132 apex_key {
6133 name: "myapex.key",
6134 public_key: "testkey.avbpubkey",
6135 private_key: "testkey.pem",
6136 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006137
6138 cc_library {
6139 name: "mylib",
6140 srcs: ["mylib.cpp"],
6141 stl: "libc++",
6142 system_shared_libs: [],
6143 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006144 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006145 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006146 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006147
6148 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6149 args := module.Rule("apexRule").Args
6150 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006151 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006152
6153 // The copies of the libraries in the apex should have one more dependency than
6154 // the ones outside the apex, namely the unwinder. Ideally we should check
6155 // the dependency names directly here but for some reason the names are blank in
6156 // this test.
6157 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006158 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006159 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6160 if len(apexImplicits) != len(nonApexImplicits)+1 {
6161 t.Errorf("%q missing unwinder dep", lib)
6162 }
6163 }
Jooyung Han214bf372019-11-12 13:03:50 +09006164}
6165
Paul Duffine05480a2021-03-08 15:07:14 +00006166var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006167 "api/current.txt": nil,
6168 "api/removed.txt": nil,
6169 "api/system-current.txt": nil,
6170 "api/system-removed.txt": nil,
6171 "api/test-current.txt": nil,
6172 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006173
Anton Hanssondff2c782020-12-21 17:10:01 +00006174 "100/public/api/foo.txt": nil,
6175 "100/public/api/foo-removed.txt": nil,
6176 "100/system/api/foo.txt": nil,
6177 "100/system/api/foo-removed.txt": nil,
6178
Paul Duffineedc5d52020-06-12 17:46:39 +01006179 // For java_sdk_library_import
6180 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006181}
6182
Jooyung Han58f26ab2019-12-18 15:34:32 +09006183func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006184 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006185 apex {
6186 name: "myapex",
6187 key: "myapex.key",
6188 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006189 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006190 }
6191
6192 apex_key {
6193 name: "myapex.key",
6194 public_key: "testkey.avbpubkey",
6195 private_key: "testkey.pem",
6196 }
6197
6198 java_sdk_library {
6199 name: "foo",
6200 srcs: ["a.java"],
6201 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006202 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006203 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006204
6205 prebuilt_apis {
6206 name: "sdk",
6207 api_dirs: ["100"],
6208 }
Paul Duffin9b879592020-05-26 13:21:35 +01006209 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006210
6211 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006212 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006213 "javalib/foo.jar",
6214 "etc/permissions/foo.xml",
6215 })
6216 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006217 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006218 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 +09006219}
6220
Paul Duffin9b879592020-05-26 13:21:35 +01006221func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006222 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006223 apex {
6224 name: "myapex",
6225 key: "myapex.key",
6226 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006227 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006228 }
6229
6230 apex_key {
6231 name: "myapex.key",
6232 public_key: "testkey.avbpubkey",
6233 private_key: "testkey.pem",
6234 }
6235
6236 java_sdk_library {
6237 name: "foo",
6238 srcs: ["a.java"],
6239 api_packages: ["foo"],
6240 apex_available: ["myapex"],
6241 sdk_version: "none",
6242 system_modules: "none",
6243 }
6244
6245 java_library {
6246 name: "bar",
6247 srcs: ["a.java"],
6248 libs: ["foo"],
6249 apex_available: ["myapex"],
6250 sdk_version: "none",
6251 system_modules: "none",
6252 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006253
6254 prebuilt_apis {
6255 name: "sdk",
6256 api_dirs: ["100"],
6257 }
Paul Duffin9b879592020-05-26 13:21:35 +01006258 `, withFiles(filesForSdkLibrary))
6259
6260 // java_sdk_library installs both impl jar and permission XML
6261 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6262 "javalib/bar.jar",
6263 "javalib/foo.jar",
6264 "etc/permissions/foo.xml",
6265 })
6266
6267 // The bar library should depend on the implementation jar.
6268 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006269 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006270 t.Errorf("expected %q, found %#q", expected, actual)
6271 }
6272}
6273
6274func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006275 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006276 apex {
6277 name: "myapex",
6278 key: "myapex.key",
6279 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006280 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006281 }
6282
6283 apex_key {
6284 name: "myapex.key",
6285 public_key: "testkey.avbpubkey",
6286 private_key: "testkey.pem",
6287 }
6288
6289 java_sdk_library {
6290 name: "foo",
6291 srcs: ["a.java"],
6292 api_packages: ["foo"],
6293 apex_available: ["myapex"],
6294 sdk_version: "none",
6295 system_modules: "none",
6296 }
6297
6298 java_library {
6299 name: "bar",
6300 srcs: ["a.java"],
6301 libs: ["foo"],
6302 sdk_version: "none",
6303 system_modules: "none",
6304 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006305
6306 prebuilt_apis {
6307 name: "sdk",
6308 api_dirs: ["100"],
6309 }
Paul Duffin9b879592020-05-26 13:21:35 +01006310 `, withFiles(filesForSdkLibrary))
6311
6312 // java_sdk_library installs both impl jar and permission XML
6313 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6314 "javalib/foo.jar",
6315 "etc/permissions/foo.xml",
6316 })
6317
6318 // The bar library should depend on the stubs jar.
6319 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006320 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006321 t.Errorf("expected %q, found %#q", expected, actual)
6322 }
6323}
6324
Paul Duffineedc5d52020-06-12 17:46:39 +01006325func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006326 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006327 prebuilt_apis {
6328 name: "sdk",
6329 api_dirs: ["100"],
6330 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006331 withFiles(map[string][]byte{
6332 "apex/a.java": nil,
6333 "apex/apex_manifest.json": nil,
6334 "apex/Android.bp": []byte(`
6335 package {
6336 default_visibility: ["//visibility:private"],
6337 }
6338
6339 apex {
6340 name: "myapex",
6341 key: "myapex.key",
6342 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006343 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006344 }
6345
6346 apex_key {
6347 name: "myapex.key",
6348 public_key: "testkey.avbpubkey",
6349 private_key: "testkey.pem",
6350 }
6351
6352 java_library {
6353 name: "bar",
6354 srcs: ["a.java"],
6355 libs: ["foo"],
6356 apex_available: ["myapex"],
6357 sdk_version: "none",
6358 system_modules: "none",
6359 }
6360`),
6361 "source/a.java": nil,
6362 "source/api/current.txt": nil,
6363 "source/api/removed.txt": nil,
6364 "source/Android.bp": []byte(`
6365 package {
6366 default_visibility: ["//visibility:private"],
6367 }
6368
6369 java_sdk_library {
6370 name: "foo",
6371 visibility: ["//apex"],
6372 srcs: ["a.java"],
6373 api_packages: ["foo"],
6374 apex_available: ["myapex"],
6375 sdk_version: "none",
6376 system_modules: "none",
6377 public: {
6378 enabled: true,
6379 },
6380 }
6381`),
6382 "prebuilt/a.jar": nil,
6383 "prebuilt/Android.bp": []byte(`
6384 package {
6385 default_visibility: ["//visibility:private"],
6386 }
6387
6388 java_sdk_library_import {
6389 name: "foo",
6390 visibility: ["//apex", "//source"],
6391 apex_available: ["myapex"],
6392 prefer: true,
6393 public: {
6394 jars: ["a.jar"],
6395 },
6396 }
6397`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006398 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006399 )
6400
6401 // java_sdk_library installs both impl jar and permission XML
6402 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6403 "javalib/bar.jar",
6404 "javalib/foo.jar",
6405 "etc/permissions/foo.xml",
6406 })
6407
6408 // The bar library should depend on the implementation jar.
6409 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006410 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006411 t.Errorf("expected %q, found %#q", expected, actual)
6412 }
6413}
6414
6415func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6416 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6417 apex {
6418 name: "myapex",
6419 key: "myapex.key",
6420 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006421 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006422 }
6423
6424 apex_key {
6425 name: "myapex.key",
6426 public_key: "testkey.avbpubkey",
6427 private_key: "testkey.pem",
6428 }
6429
6430 java_sdk_library_import {
6431 name: "foo",
6432 apex_available: ["myapex"],
6433 prefer: true,
6434 public: {
6435 jars: ["a.jar"],
6436 },
6437 }
6438
6439 `, withFiles(filesForSdkLibrary))
6440}
6441
atrost6e126252020-01-27 17:01:16 +00006442func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006443 result := android.GroupFixturePreparers(
6444 prepareForApexTest,
6445 java.PrepareForTestWithPlatformCompatConfig,
6446 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006447 apex {
6448 name: "myapex",
6449 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006450 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006451 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006452 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006453 }
6454
6455 apex_key {
6456 name: "myapex.key",
6457 public_key: "testkey.avbpubkey",
6458 private_key: "testkey.pem",
6459 }
6460
6461 platform_compat_config {
6462 name: "myjar-platform-compat-config",
6463 src: ":myjar",
6464 }
6465
6466 java_library {
6467 name: "myjar",
6468 srcs: ["foo/bar/MyClass.java"],
6469 sdk_version: "none",
6470 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006471 apex_available: [ "myapex" ],
6472 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006473
6474 // Make sure that a preferred prebuilt does not affect the apex contents.
6475 prebuilt_platform_compat_config {
6476 name: "myjar-platform-compat-config",
6477 metadata: "compat-config/metadata.xml",
6478 prefer: true,
6479 }
atrost6e126252020-01-27 17:01:16 +00006480 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006481 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006482 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6483 "etc/compatconfig/myjar-platform-compat-config.xml",
6484 "javalib/myjar.jar",
6485 })
6486}
6487
Jiyong Park479321d2019-12-16 11:47:12 +09006488func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6489 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6490 apex {
6491 name: "myapex",
6492 key: "myapex.key",
6493 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006494 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006495 }
6496
6497 apex_key {
6498 name: "myapex.key",
6499 public_key: "testkey.avbpubkey",
6500 private_key: "testkey.pem",
6501 }
6502
6503 java_library {
6504 name: "myjar",
6505 srcs: ["foo/bar/MyClass.java"],
6506 sdk_version: "none",
6507 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006508 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006509 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006510 }
6511 `)
6512}
6513
Jiyong Park7afd1072019-12-30 16:56:33 +09006514func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006515 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006516 apex {
6517 name: "myapex",
6518 key: "myapex.key",
6519 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006520 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006521 }
6522
6523 apex_key {
6524 name: "myapex.key",
6525 public_key: "testkey.avbpubkey",
6526 private_key: "testkey.pem",
6527 }
6528
6529 cc_library {
6530 name: "mylib",
6531 srcs: ["mylib.cpp"],
6532 system_shared_libs: [],
6533 stl: "none",
6534 required: ["a", "b"],
6535 host_required: ["c", "d"],
6536 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006537 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006538 }
6539 `)
6540
6541 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006542 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006543 name := apexBundle.BaseModuleName()
6544 prefix := "TARGET_"
6545 var builder strings.Builder
6546 data.Custom(&builder, name, prefix, "", data)
6547 androidMk := builder.String()
6548 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6549 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6550 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6551}
6552
Jiyong Park7cd10e32020-01-14 09:22:18 +09006553func TestSymlinksFromApexToSystem(t *testing.T) {
6554 bp := `
6555 apex {
6556 name: "myapex",
6557 key: "myapex.key",
6558 native_shared_libs: ["mylib"],
6559 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006560 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006561 }
6562
Jiyong Park9d677202020-02-19 16:29:35 +09006563 apex {
6564 name: "myapex.updatable",
6565 key: "myapex.key",
6566 native_shared_libs: ["mylib"],
6567 java_libs: ["myjar"],
6568 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006569 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006570 }
6571
Jiyong Park7cd10e32020-01-14 09:22:18 +09006572 apex_key {
6573 name: "myapex.key",
6574 public_key: "testkey.avbpubkey",
6575 private_key: "testkey.pem",
6576 }
6577
6578 cc_library {
6579 name: "mylib",
6580 srcs: ["mylib.cpp"],
6581 shared_libs: ["myotherlib"],
6582 system_shared_libs: [],
6583 stl: "none",
6584 apex_available: [
6585 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006586 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006587 "//apex_available:platform",
6588 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006589 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006590 }
6591
6592 cc_library {
6593 name: "myotherlib",
6594 srcs: ["mylib.cpp"],
6595 system_shared_libs: [],
6596 stl: "none",
6597 apex_available: [
6598 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006599 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006600 "//apex_available:platform",
6601 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006602 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006603 }
6604
6605 java_library {
6606 name: "myjar",
6607 srcs: ["foo/bar/MyClass.java"],
6608 sdk_version: "none",
6609 system_modules: "none",
6610 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006611 apex_available: [
6612 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006613 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006614 "//apex_available:platform",
6615 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006616 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006617 }
6618
6619 java_library {
6620 name: "myotherjar",
6621 srcs: ["foo/bar/MyClass.java"],
6622 sdk_version: "none",
6623 system_modules: "none",
6624 apex_available: [
6625 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006626 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006627 "//apex_available:platform",
6628 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006629 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006630 }
6631 `
6632
6633 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6634 for _, f := range files {
6635 if f.path == file {
6636 if f.isLink {
6637 t.Errorf("%q is not a real file", file)
6638 }
6639 return
6640 }
6641 }
6642 t.Errorf("%q is not found", file)
6643 }
6644
6645 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6646 for _, f := range files {
6647 if f.path == file {
6648 if !f.isLink {
6649 t.Errorf("%q is not a symlink", file)
6650 }
6651 return
6652 }
6653 }
6654 t.Errorf("%q is not found", file)
6655 }
6656
Jiyong Park9d677202020-02-19 16:29:35 +09006657 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6658 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006659 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006660 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006661 ensureRealfileExists(t, files, "javalib/myjar.jar")
6662 ensureRealfileExists(t, files, "lib64/mylib.so")
6663 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6664
Jiyong Park9d677202020-02-19 16:29:35 +09006665 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6666 ensureRealfileExists(t, files, "javalib/myjar.jar")
6667 ensureRealfileExists(t, files, "lib64/mylib.so")
6668 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6669
6670 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006671 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006672 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006673 ensureRealfileExists(t, files, "javalib/myjar.jar")
6674 ensureRealfileExists(t, files, "lib64/mylib.so")
6675 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006676
6677 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6678 ensureRealfileExists(t, files, "javalib/myjar.jar")
6679 ensureRealfileExists(t, files, "lib64/mylib.so")
6680 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006681}
6682
Yo Chiange8128052020-07-23 20:09:18 +08006683func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006684 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006685 apex {
6686 name: "myapex",
6687 key: "myapex.key",
6688 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006689 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006690 }
6691
6692 apex_key {
6693 name: "myapex.key",
6694 public_key: "testkey.avbpubkey",
6695 private_key: "testkey.pem",
6696 }
6697
6698 cc_library_shared {
6699 name: "mylib",
6700 srcs: ["mylib.cpp"],
6701 shared_libs: ["myotherlib"],
6702 system_shared_libs: [],
6703 stl: "none",
6704 apex_available: [
6705 "myapex",
6706 "//apex_available:platform",
6707 ],
6708 }
6709
6710 cc_prebuilt_library_shared {
6711 name: "myotherlib",
6712 srcs: ["prebuilt.so"],
6713 system_shared_libs: [],
6714 stl: "none",
6715 apex_available: [
6716 "myapex",
6717 "//apex_available:platform",
6718 ],
6719 }
6720 `)
6721
6722 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006723 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006724 var builder strings.Builder
6725 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6726 androidMk := builder.String()
6727 // `myotherlib` is added to `myapex` as symlink
6728 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6729 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6730 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6731 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006732 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 +08006733}
6734
Jooyung Han643adc42020-02-27 13:50:06 +09006735func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006736 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006737 apex {
6738 name: "myapex",
6739 key: "myapex.key",
6740 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006741 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006742 }
6743
6744 apex_key {
6745 name: "myapex.key",
6746 public_key: "testkey.avbpubkey",
6747 private_key: "testkey.pem",
6748 }
6749
6750 cc_library {
6751 name: "mylib",
6752 srcs: ["mylib.cpp"],
6753 shared_libs: ["mylib2"],
6754 system_shared_libs: [],
6755 stl: "none",
6756 apex_available: [ "myapex" ],
6757 }
6758
6759 cc_library {
6760 name: "mylib2",
6761 srcs: ["mylib.cpp"],
6762 system_shared_libs: [],
6763 stl: "none",
6764 apex_available: [ "myapex" ],
6765 }
6766 `)
6767
6768 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6769 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6770 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6771 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6772 "lib64/mylib.so",
6773 "lib64/mylib2.so",
6774 })
6775}
6776
Jooyung Han49f67012020-04-17 13:43:10 +09006777func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006778 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006779 apex {
6780 name: "myapex",
6781 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006782 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006783 }
6784 apex_key {
6785 name: "myapex.key",
6786 public_key: "testkey.avbpubkey",
6787 private_key: "testkey.pem",
6788 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006789 `,
6790 android.FixtureModifyConfig(func(config android.Config) {
6791 delete(config.Targets, android.Android)
6792 config.AndroidCommonTarget = android.Target{}
6793 }),
6794 )
Jooyung Han49f67012020-04-17 13:43:10 +09006795
6796 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6797 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6798 }
6799}
6800
Jiyong Parkbd159612020-02-28 15:22:21 +09006801func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006802 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006803 apex {
6804 name: "myapex",
6805 key: "myapex.key",
6806 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006807 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006808 }
6809
6810 apex_key {
6811 name: "myapex.key",
6812 public_key: "testkey.avbpubkey",
6813 private_key: "testkey.pem",
6814 }
6815
6816 android_app {
6817 name: "AppFoo",
6818 srcs: ["foo/bar/MyClass.java"],
6819 sdk_version: "none",
6820 system_modules: "none",
6821 apex_available: [ "myapex" ],
6822 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006823 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006824
Colin Crosscf371cc2020-11-13 11:48:42 -08006825 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006826 content := bundleConfigRule.Args["content"]
6827
6828 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006829 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09006830}
6831
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006832func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006833 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006834 apex {
6835 name: "myapex",
6836 key: "myapex.key",
6837 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006838 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006839 }
6840
6841 apex_key {
6842 name: "myapex.key",
6843 public_key: "testkey.avbpubkey",
6844 private_key: "testkey.pem",
6845 }
6846
6847 android_app_set {
6848 name: "AppSet",
6849 set: "AppSet.apks",
6850 }`)
6851 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006852 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006853 content := bundleConfigRule.Args["content"]
6854 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6855 s := mod.Rule("apexRule").Args["copy_commands"]
6856 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6857 if len(copyCmds) != 3 {
6858 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6859 }
6860 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6861 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6862 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6863}
6864
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006865func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01006866 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006867 apex_set {
6868 name: "myapex",
6869 filename: "foo_v2.apex",
6870 sanitized: {
6871 none: { set: "myapex.apks", },
6872 hwaddress: { set: "myapex.hwasan.apks", },
6873 },
Paul Duffin24704672021-04-06 16:09:30 +01006874 }
6875 `
6876 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006877
Paul Duffin24704672021-04-06 16:09:30 +01006878 // Check that the extractor produces the correct output file from the correct input file.
6879 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006880
Paul Duffin24704672021-04-06 16:09:30 +01006881 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
6882 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006883
Paul Duffin24704672021-04-06 16:09:30 +01006884 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
6885
6886 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01006887 m = ctx.ModuleForTests("myapex", "android_common_myapex")
6888 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01006889
6890 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006891}
6892
Paul Duffin89f570a2021-06-16 01:42:33 +01006893func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006894 t.Helper()
6895
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006896 bp := `
6897 java_library {
6898 name: "some-updatable-apex-lib",
6899 srcs: ["a.java"],
6900 sdk_version: "current",
6901 apex_available: [
6902 "some-updatable-apex",
6903 ],
satayevabcd5972021-08-06 17:49:46 +01006904 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006905 }
6906
6907 java_library {
6908 name: "some-non-updatable-apex-lib",
6909 srcs: ["a.java"],
6910 apex_available: [
6911 "some-non-updatable-apex",
6912 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01006913 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01006914 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006915 }
6916
6917 bootclasspath_fragment {
6918 name: "some-non-updatable-fragment",
6919 contents: ["some-non-updatable-apex-lib"],
6920 apex_available: [
6921 "some-non-updatable-apex",
6922 ],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006923 }
6924
6925 java_library {
6926 name: "some-platform-lib",
6927 srcs: ["a.java"],
6928 sdk_version: "current",
6929 installable: true,
6930 }
6931
6932 java_library {
6933 name: "some-art-lib",
6934 srcs: ["a.java"],
6935 sdk_version: "current",
6936 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006937 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006938 ],
6939 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01006940 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006941 }
6942
6943 apex {
6944 name: "some-updatable-apex",
6945 key: "some-updatable-apex.key",
6946 java_libs: ["some-updatable-apex-lib"],
6947 updatable: true,
6948 min_sdk_version: "current",
6949 }
6950
6951 apex {
6952 name: "some-non-updatable-apex",
6953 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01006954 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006955 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006956 }
6957
6958 apex_key {
6959 name: "some-updatable-apex.key",
6960 }
6961
6962 apex_key {
6963 name: "some-non-updatable-apex.key",
6964 }
6965
6966 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006967 name: "com.android.art.debug",
6968 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01006969 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006970 updatable: true,
6971 min_sdk_version: "current",
6972 }
6973
Paul Duffinf23bc472021-04-27 12:42:20 +01006974 bootclasspath_fragment {
6975 name: "art-bootclasspath-fragment",
6976 image_name: "art",
6977 contents: ["some-art-lib"],
6978 apex_available: [
6979 "com.android.art.debug",
6980 ],
6981 }
6982
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006983 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006984 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006985 }
6986
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006987 filegroup {
6988 name: "some-updatable-apex-file_contexts",
6989 srcs: [
6990 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6991 ],
6992 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006993
6994 filegroup {
6995 name: "some-non-updatable-apex-file_contexts",
6996 srcs: [
6997 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6998 ],
6999 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007000 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007001
Paul Duffin89f570a2021-06-16 01:42:33 +01007002 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007003}
7004
Paul Duffin89f570a2021-06-16 01:42:33 +01007005func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007006 t.Helper()
7007
Paul Duffin55607122021-03-30 23:32:51 +01007008 fs := android.MockFS{
7009 "a.java": nil,
7010 "a.jar": nil,
7011 "apex_manifest.json": nil,
7012 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007013 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007014 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7015 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7016 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007017 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007018 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007019
Paul Duffin55607122021-03-30 23:32:51 +01007020 errorHandler := android.FixtureExpectsNoErrors
7021 if errmsg != "" {
7022 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007023 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007024
Paul Duffin55607122021-03-30 23:32:51 +01007025 result := android.GroupFixturePreparers(
7026 cc.PrepareForTestWithCcDefaultModules,
7027 java.PrepareForTestWithHiddenApiBuildComponents,
7028 java.PrepareForTestWithJavaDefaultModules,
7029 java.PrepareForTestWithJavaSdkLibraryFiles,
7030 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007031 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007032 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007033 android.FixtureModifyMockFS(func(fs android.MockFS) {
7034 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7035 insert := ""
7036 for _, fragment := range fragments {
7037 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7038 }
7039 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7040 platform_bootclasspath {
7041 name: "platform-bootclasspath",
7042 fragments: [
7043 %s
7044 ],
7045 }
7046 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007047 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007048 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007049 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007050 ).
7051 ExtendWithErrorHandler(errorHandler).
7052 RunTestWithBp(t, bp)
7053
7054 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007055}
7056
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007057func TestDuplicateDeapexeresFromPrebuiltApexes(t *testing.T) {
7058 preparers := android.GroupFixturePreparers(
7059 java.PrepareForTestWithJavaDefaultModules,
7060 PrepareForTestWithApexBuildComponents,
7061 ).
7062 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7063 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7064
7065 bpBase := `
7066 apex_set {
7067 name: "com.android.myapex",
7068 installable: true,
7069 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7070 set: "myapex.apks",
7071 }
7072
7073 apex_set {
7074 name: "com.mycompany.android.myapex",
7075 apex_name: "com.android.myapex",
7076 installable: true,
7077 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7078 set: "company-myapex.apks",
7079 }
7080
7081 prebuilt_bootclasspath_fragment {
7082 name: "my-bootclasspath-fragment",
7083 apex_available: ["com.android.myapex"],
7084 %s
7085 }
7086 `
7087
7088 t.Run("java_import", func(t *testing.T) {
7089 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7090 java_import {
7091 name: "libfoo",
7092 jars: ["libfoo.jar"],
7093 apex_available: ["com.android.myapex"],
7094 }
7095 `)
7096 })
7097
7098 t.Run("java_sdk_library_import", func(t *testing.T) {
7099 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7100 java_sdk_library_import {
7101 name: "libfoo",
7102 public: {
7103 jars: ["libbar.jar"],
7104 },
7105 apex_available: ["com.android.myapex"],
7106 }
7107 `)
7108 })
7109
7110 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7111 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7112 image_name: "art",
7113 contents: ["libfoo"],
7114 `)+`
7115 java_sdk_library_import {
7116 name: "libfoo",
7117 public: {
7118 jars: ["libbar.jar"],
7119 },
7120 apex_available: ["com.android.myapex"],
7121 }
7122 `)
7123 })
7124}
7125
Jooyung Han548640b2020-04-27 12:10:30 +09007126func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7127 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7128 apex {
7129 name: "myapex",
7130 key: "myapex.key",
7131 updatable: true,
7132 }
7133
7134 apex_key {
7135 name: "myapex.key",
7136 public_key: "testkey.avbpubkey",
7137 private_key: "testkey.pem",
7138 }
7139 `)
7140}
7141
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007142func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7143 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7144 apex {
7145 name: "myapex",
7146 key: "myapex.key",
7147 }
7148
7149 apex_key {
7150 name: "myapex.key",
7151 public_key: "testkey.avbpubkey",
7152 private_key: "testkey.pem",
7153 }
7154 `)
7155}
7156
Daniel Norman69109112021-12-02 12:52:42 -08007157func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7158 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7159 apex {
7160 name: "myapex",
7161 key: "myapex.key",
7162 updatable: true,
7163 soc_specific: true,
7164 }
7165
7166 apex_key {
7167 name: "myapex.key",
7168 public_key: "testkey.avbpubkey",
7169 private_key: "testkey.pem",
7170 }
7171 `)
7172}
7173
satayevb98371c2021-06-15 16:49:50 +01007174func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7175 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7176 apex {
7177 name: "myapex",
7178 key: "myapex.key",
7179 systemserverclasspath_fragments: [
7180 "mysystemserverclasspathfragment",
7181 ],
7182 min_sdk_version: "29",
7183 updatable: true,
7184 }
7185
7186 apex_key {
7187 name: "myapex.key",
7188 public_key: "testkey.avbpubkey",
7189 private_key: "testkey.pem",
7190 }
7191
7192 java_library {
7193 name: "foo",
7194 srcs: ["b.java"],
7195 min_sdk_version: "29",
7196 installable: true,
7197 apex_available: [
7198 "myapex",
7199 ],
7200 }
7201
7202 systemserverclasspath_fragment {
7203 name: "mysystemserverclasspathfragment",
7204 generate_classpaths_proto: false,
7205 contents: [
7206 "foo",
7207 ],
7208 apex_available: [
7209 "myapex",
7210 ],
7211 }
satayevabcd5972021-08-06 17:49:46 +01007212 `,
7213 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7214 )
satayevb98371c2021-06-15 16:49:50 +01007215}
7216
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007217func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007218 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7219 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7220 // modules to be included in the BootJars.
7221 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7222 return android.GroupFixturePreparers(
7223 dexpreopt.FixtureSetBootJars(bootJars...),
7224 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7225 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7226 }),
7227 )
7228 }
7229
7230 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7231 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7232 // specified in the ArtApexJars configuration.
7233 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7234 return android.GroupFixturePreparers(
7235 dexpreopt.FixtureSetArtBootJars(bootJars...),
7236 dexpreopt.FixtureSetBootJars(bootJars...),
7237 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7238 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7239 }),
7240 )
7241 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007242
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007243 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007244 preparer := android.GroupFixturePreparers(
7245 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7246 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7247 )
7248 fragments := []java.ApexVariantReference{
7249 {
7250 Apex: proptools.StringPtr("com.android.art.debug"),
7251 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7252 },
7253 {
7254 Apex: proptools.StringPtr("some-non-updatable-apex"),
7255 Module: proptools.StringPtr("some-non-updatable-fragment"),
7256 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007257 }
satayevabcd5972021-08-06 17:49:46 +01007258 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007259 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007260
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007261 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007262 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7263 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007264 preparer := android.GroupFixturePreparers(
7265 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7266 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7267 )
Paul Duffin60264a02021-04-12 20:02:36 +01007268 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007269 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007270
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007271 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 +01007272 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 +01007273 // Update the dexpreopt ArtApexJars directly.
7274 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7275 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007276 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007277
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007278 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 +01007279 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 +01007280 // Update the dexpreopt ArtApexJars directly.
7281 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7282 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007283 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007284
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007285 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 +01007286 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 +01007287 preparer := android.GroupFixturePreparers(
7288 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7289 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7290 )
Paul Duffin60264a02021-04-12 20:02:36 +01007291 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007292 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007293
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007294 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 +01007295 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007296 fragment := java.ApexVariantReference{
7297 Apex: proptools.StringPtr("some-non-updatable-apex"),
7298 Module: proptools.StringPtr("some-non-updatable-fragment"),
7299 }
7300 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007301 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007302
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007303 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007304 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007305 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7306 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007307 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007308
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007309 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007310 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007311 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7312 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007313 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007314
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007315 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007316 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007317 // Update the dexpreopt ArtApexJars directly.
7318 preparer := prepareSetArtJars("platform:some-platform-lib")
7319 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007320 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007321
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007322 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007323 preparer := android.GroupFixturePreparers(
7324 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7325 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7326 )
7327 fragments := []java.ApexVariantReference{
7328 {
7329 Apex: proptools.StringPtr("some-non-updatable-apex"),
7330 Module: proptools.StringPtr("some-non-updatable-fragment"),
7331 },
7332 }
7333 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007334 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007335}
7336
7337func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007338 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007339 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007340 fragment := java.ApexVariantReference{
7341 Apex: proptools.StringPtr("myapex"),
7342 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7343 }
7344
Paul Duffin064b70c2020-11-02 17:32:38 +00007345 testDexpreoptWithApexes(t, `
7346 prebuilt_apex {
7347 name: "myapex" ,
7348 arch: {
7349 arm64: {
7350 src: "myapex-arm64.apex",
7351 },
7352 arm: {
7353 src: "myapex-arm.apex",
7354 },
7355 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007356 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7357 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007358
Paul Duffin89f570a2021-06-16 01:42:33 +01007359 prebuilt_bootclasspath_fragment {
7360 name: "my-bootclasspath-fragment",
7361 contents: ["libfoo"],
7362 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007363 hidden_api: {
7364 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7365 metadata: "my-bootclasspath-fragment/metadata.csv",
7366 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007367 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7368 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7369 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007370 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007371 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007372
Paul Duffin89f570a2021-06-16 01:42:33 +01007373 java_import {
7374 name: "libfoo",
7375 jars: ["libfoo.jar"],
7376 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007377 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007378 }
7379 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007380 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007381}
7382
satayevd604b212021-07-21 14:23:52 +01007383func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007384 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007385 bp += `
7386 apex_key {
7387 name: "myapex.key",
7388 public_key: "testkey.avbpubkey",
7389 private_key: "testkey.pem",
7390 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007391 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007392 "lib1/src/A.java": nil,
7393 "lib2/src/B.java": nil,
7394 "system/sepolicy/apex/myapex-file_contexts": nil,
7395 }
7396
Paul Duffin45338f02021-03-30 23:07:52 +01007397 errorHandler := android.FixtureExpectsNoErrors
7398 if errmsg != "" {
7399 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007400 }
Colin Crossae8600b2020-10-29 17:09:13 -07007401
Paul Duffin45338f02021-03-30 23:07:52 +01007402 android.GroupFixturePreparers(
7403 android.PrepareForTestWithAndroidBuildComponents,
7404 java.PrepareForTestWithJavaBuildComponents,
7405 PrepareForTestWithApexBuildComponents,
7406 android.PrepareForTestWithNeverallowRules(rules),
7407 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007408 apexBootJars := make([]string, 0, len(bootJars))
7409 for _, apexBootJar := range bootJars {
7410 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007411 }
satayevd604b212021-07-21 14:23:52 +01007412 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007413 }),
7414 fs.AddToFixture(),
7415 ).
7416 ExtendWithErrorHandler(errorHandler).
7417 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007418}
7419
7420func TestApexPermittedPackagesRules(t *testing.T) {
7421 testcases := []struct {
7422 name string
7423 expectedError string
7424 bp string
7425 bootJars []string
7426 modulesPackages map[string][]string
7427 }{
7428
7429 {
7430 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7431 expectedError: "",
7432 bp: `
7433 java_library {
7434 name: "bcp_lib1",
7435 srcs: ["lib1/src/*.java"],
7436 permitted_packages: ["foo.bar"],
7437 apex_available: ["myapex"],
7438 sdk_version: "none",
7439 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007440 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007441 }
7442 java_library {
7443 name: "nonbcp_lib2",
7444 srcs: ["lib2/src/*.java"],
7445 apex_available: ["myapex"],
7446 permitted_packages: ["a.b"],
7447 sdk_version: "none",
7448 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007449 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007450 }
7451 apex {
7452 name: "myapex",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007453 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007454 key: "myapex.key",
7455 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007456 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007457 }`,
7458 bootJars: []string{"bcp_lib1"},
7459 modulesPackages: map[string][]string{
7460 "myapex": []string{
7461 "foo.bar",
7462 },
7463 },
7464 },
7465 {
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007466 name: "Bootclasspath apex jar not satisfying allowed module packages on Q.",
Andrei Onead967aee2022-01-19 15:36:40 +00007467 expectedError: `(?s)module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only use these package prefixes: foo.bar with min_sdk < T. 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 +01007468 bp: `
7469 java_library {
7470 name: "bcp_lib1",
7471 srcs: ["lib1/src/*.java"],
7472 apex_available: ["myapex"],
7473 permitted_packages: ["foo.bar"],
7474 sdk_version: "none",
7475 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007476 min_sdk_version: "29",
Andrei Onea115e7e72020-06-05 21:14:03 +01007477 }
7478 java_library {
7479 name: "bcp_lib2",
7480 srcs: ["lib2/src/*.java"],
7481 apex_available: ["myapex"],
7482 permitted_packages: ["foo.bar", "bar.baz"],
7483 sdk_version: "none",
7484 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007485 min_sdk_version: "29",
Andrei Onea115e7e72020-06-05 21:14:03 +01007486 }
7487 apex {
7488 name: "myapex",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007489 min_sdk_version: "29",
7490 key: "myapex.key",
7491 java_libs: ["bcp_lib1", "bcp_lib2"],
7492 updatable: false,
7493 }
7494 `,
7495 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7496 modulesPackages: map[string][]string{
7497 "myapex": []string{
7498 "foo.bar",
7499 },
7500 },
7501 },
7502 {
7503 name: "Bootclasspath apex jar not satisfying allowed module packages on R.",
Andrei Onead967aee2022-01-19 15:36:40 +00007504 expectedError: `(?s)module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only use these package prefixes: foo.bar with min_sdk < T. 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.`,
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007505 bp: `
7506 java_library {
7507 name: "bcp_lib1",
7508 srcs: ["lib1/src/*.java"],
7509 apex_available: ["myapex"],
7510 permitted_packages: ["foo.bar"],
7511 sdk_version: "none",
7512 system_modules: "none",
7513 min_sdk_version: "30",
7514 }
7515 java_library {
7516 name: "bcp_lib2",
7517 srcs: ["lib2/src/*.java"],
7518 apex_available: ["myapex"],
7519 permitted_packages: ["foo.bar", "bar.baz"],
7520 sdk_version: "none",
7521 system_modules: "none",
7522 min_sdk_version: "30",
7523 }
7524 apex {
7525 name: "myapex",
7526 min_sdk_version: "30",
7527 key: "myapex.key",
7528 java_libs: ["bcp_lib1", "bcp_lib2"],
7529 updatable: false,
7530 }
7531 `,
7532 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7533 modulesPackages: map[string][]string{
7534 "myapex": []string{
7535 "foo.bar",
7536 },
7537 },
7538 },
7539 {
7540 name: "Bootclasspath apex jar >= T not satisfying Q/R/S allowed module packages.",
7541 expectedError: "",
7542 bp: `
7543 java_library {
7544 name: "bcp_lib1",
7545 srcs: ["lib1/src/*.java"],
7546 apex_available: ["myapex"],
7547 permitted_packages: ["foo.bar"],
7548 sdk_version: "none",
7549 system_modules: "none",
7550 min_sdk_version: "current",
7551 }
7552 java_library {
7553 name: "bcp_lib2",
7554 srcs: ["lib2/src/*.java"],
7555 apex_available: ["myapex"],
7556 permitted_packages: ["foo.bar", "bar.baz"],
7557 sdk_version: "none",
7558 system_modules: "none",
7559 min_sdk_version: "current",
7560 }
7561 apex {
7562 name: "myapex",
7563 min_sdk_version: "current",
Andrei Onea115e7e72020-06-05 21:14:03 +01007564 key: "myapex.key",
7565 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007566 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007567 }
7568 `,
7569 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7570 modulesPackages: map[string][]string{
7571 "myapex": []string{
7572 "foo.bar",
7573 },
7574 },
7575 },
7576 }
7577 for _, tc := range testcases {
7578 t.Run(tc.name, func(t *testing.T) {
7579 rules := createApexPermittedPackagesRules(tc.modulesPackages)
7580 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
7581 })
7582 }
7583}
7584
Jiyong Park62304bb2020-04-13 16:19:48 +09007585func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007586 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09007587 apex {
7588 name: "myapex",
7589 key: "myapex.key",
7590 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007591 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09007592 }
7593
7594 apex_key {
7595 name: "myapex.key",
7596 public_key: "testkey.avbpubkey",
7597 private_key: "testkey.pem",
7598 }
7599
7600 cc_library {
7601 name: "mylib",
7602 srcs: ["mylib.cpp"],
7603 system_shared_libs: [],
7604 stl: "none",
7605 stubs: {
7606 versions: ["1"],
7607 },
7608 apex_available: ["myapex"],
7609 }
7610
7611 cc_library {
7612 name: "myprivlib",
7613 srcs: ["mylib.cpp"],
7614 system_shared_libs: [],
7615 stl: "none",
7616 apex_available: ["myapex"],
7617 }
7618
7619
7620 cc_test {
7621 name: "mytest",
7622 gtest: false,
7623 srcs: ["mylib.cpp"],
7624 system_shared_libs: [],
7625 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09007626 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09007627 test_for: ["myapex"]
7628 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007629
7630 cc_library {
7631 name: "mytestlib",
7632 srcs: ["mylib.cpp"],
7633 system_shared_libs: [],
7634 shared_libs: ["mylib", "myprivlib"],
7635 stl: "none",
7636 test_for: ["myapex"],
7637 }
7638
7639 cc_benchmark {
7640 name: "mybench",
7641 srcs: ["mylib.cpp"],
7642 system_shared_libs: [],
7643 shared_libs: ["mylib", "myprivlib"],
7644 stl: "none",
7645 test_for: ["myapex"],
7646 }
Jiyong Park62304bb2020-04-13 16:19:48 +09007647 `)
7648
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007649 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007650 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007651 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7652 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7653 }
7654
7655 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09007656 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007657 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7658 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7659 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7660}
Jiyong Park46a512f2020-12-04 18:02:13 +09007661
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007662func TestIndirectTestFor(t *testing.T) {
7663 ctx := testApex(t, `
7664 apex {
7665 name: "myapex",
7666 key: "myapex.key",
7667 native_shared_libs: ["mylib", "myprivlib"],
7668 updatable: false,
7669 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007670
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007671 apex_key {
7672 name: "myapex.key",
7673 public_key: "testkey.avbpubkey",
7674 private_key: "testkey.pem",
7675 }
7676
7677 cc_library {
7678 name: "mylib",
7679 srcs: ["mylib.cpp"],
7680 system_shared_libs: [],
7681 stl: "none",
7682 stubs: {
7683 versions: ["1"],
7684 },
7685 apex_available: ["myapex"],
7686 }
7687
7688 cc_library {
7689 name: "myprivlib",
7690 srcs: ["mylib.cpp"],
7691 system_shared_libs: [],
7692 stl: "none",
7693 shared_libs: ["mylib"],
7694 apex_available: ["myapex"],
7695 }
7696
7697 cc_library {
7698 name: "mytestlib",
7699 srcs: ["mylib.cpp"],
7700 system_shared_libs: [],
7701 shared_libs: ["myprivlib"],
7702 stl: "none",
7703 test_for: ["myapex"],
7704 }
7705 `)
7706
7707 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007708 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007709 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7710 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7711 }
7712
7713 // The platform variant of mytestlib links to the platform variant of the
7714 // internal myprivlib.
7715 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
7716
7717 // The platform variant of myprivlib links to the platform variant of mylib
7718 // and bypasses its stubs.
7719 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 +09007720}
7721
Martin Stjernholmec009002021-03-27 15:18:31 +00007722func TestTestForForLibInOtherApex(t *testing.T) {
7723 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
7724 _ = testApex(t, `
7725 apex {
7726 name: "com.android.art",
7727 key: "myapex.key",
7728 native_shared_libs: ["mylib"],
7729 updatable: false,
7730 }
7731
7732 apex {
7733 name: "com.android.art.debug",
7734 key: "myapex.key",
7735 native_shared_libs: ["mylib", "mytestlib"],
7736 updatable: false,
7737 }
7738
7739 apex_key {
7740 name: "myapex.key",
7741 public_key: "testkey.avbpubkey",
7742 private_key: "testkey.pem",
7743 }
7744
7745 cc_library {
7746 name: "mylib",
7747 srcs: ["mylib.cpp"],
7748 system_shared_libs: [],
7749 stl: "none",
7750 stubs: {
7751 versions: ["1"],
7752 },
7753 apex_available: ["com.android.art", "com.android.art.debug"],
7754 }
7755
7756 cc_library {
7757 name: "mytestlib",
7758 srcs: ["mylib.cpp"],
7759 system_shared_libs: [],
7760 shared_libs: ["mylib"],
7761 stl: "none",
7762 apex_available: ["com.android.art.debug"],
7763 test_for: ["com.android.art"],
7764 }
7765 `,
7766 android.MockFS{
7767 "system/sepolicy/apex/com.android.art-file_contexts": nil,
7768 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
7769 }.AddToFixture())
7770}
7771
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007772// TODO(jungjw): Move this to proptools
7773func intPtr(i int) *int {
7774 return &i
7775}
7776
7777func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007778 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007779 apex_set {
7780 name: "myapex",
7781 set: "myapex.apks",
7782 filename: "foo_v2.apex",
7783 overrides: ["foo"],
7784 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007785 `,
7786 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7787 variables.Platform_sdk_version = intPtr(30)
7788 }),
7789 android.FixtureModifyConfig(func(config android.Config) {
7790 config.Targets[android.Android] = []android.Target{
7791 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
7792 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
7793 }
7794 }),
7795 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007796
Paul Duffin24704672021-04-06 16:09:30 +01007797 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007798
7799 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01007800 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007801 actual := extractedApex.Args["abis"]
7802 expected := "ARMEABI_V7A,ARM64_V8A"
7803 if actual != expected {
7804 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7805 }
7806 actual = extractedApex.Args["sdk-version"]
7807 expected = "30"
7808 if actual != expected {
7809 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7810 }
7811
Paul Duffin6717d882021-06-15 19:09:41 +01007812 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007813 a := m.Module().(*ApexSet)
7814 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07007815 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007816 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
7817 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
7818 }
7819}
7820
Jiyong Park7d95a512020-05-10 15:16:24 +09007821func TestNoStaticLinkingToStubsLib(t *testing.T) {
7822 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
7823 apex {
7824 name: "myapex",
7825 key: "myapex.key",
7826 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007827 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09007828 }
7829
7830 apex_key {
7831 name: "myapex.key",
7832 public_key: "testkey.avbpubkey",
7833 private_key: "testkey.pem",
7834 }
7835
7836 cc_library {
7837 name: "mylib",
7838 srcs: ["mylib.cpp"],
7839 static_libs: ["otherlib"],
7840 system_shared_libs: [],
7841 stl: "none",
7842 apex_available: [ "myapex" ],
7843 }
7844
7845 cc_library {
7846 name: "otherlib",
7847 srcs: ["mylib.cpp"],
7848 system_shared_libs: [],
7849 stl: "none",
7850 stubs: {
7851 versions: ["1", "2", "3"],
7852 },
7853 apex_available: [ "myapex" ],
7854 }
7855 `)
7856}
7857
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007858func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007859 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007860 apex {
7861 name: "myapex",
7862 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007863 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09007864 custom_sign_tool: "sign_myapex",
7865 }
7866
7867 apex_key {
7868 name: "myapex.key",
7869 public_key: "testkey.avbpubkey",
7870 private_key: "testkey.pem",
7871 }
7872 `)
7873
7874 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7875 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7876 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"`)
7877}
7878
7879func TestApexKeysTxtOverrides(t *testing.T) {
7880 ctx := testApex(t, `
7881 apex {
7882 name: "myapex",
7883 key: "myapex.key",
7884 updatable: false,
7885 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007886 }
7887
7888 apex_key {
7889 name: "myapex.key",
7890 public_key: "testkey.avbpubkey",
7891 private_key: "testkey.pem",
7892 }
7893
7894 prebuilt_apex {
7895 name: "myapex",
7896 prefer: true,
7897 arch: {
7898 arm64: {
7899 src: "myapex-arm64.apex",
7900 },
7901 arm: {
7902 src: "myapex-arm.apex",
7903 },
7904 },
7905 }
7906
7907 apex_set {
7908 name: "myapex_set",
7909 set: "myapex.apks",
7910 filename: "myapex_set.apex",
7911 overrides: ["myapex"],
7912 }
7913 `)
7914
7915 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7916 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7917 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 +09007918 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 +09007919}
7920
Jooyung Han938b5932020-06-20 12:47:47 +09007921func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007922 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09007923 apex {
7924 name: "myapex",
7925 key: "myapex.key",
7926 apps: ["app"],
7927 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007928 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007929 }
7930
7931 apex_key {
7932 name: "myapex.key",
7933 public_key: "testkey.avbpubkey",
7934 private_key: "testkey.pem",
7935 }
7936
7937 android_app {
7938 name: "app",
7939 srcs: ["foo/bar/MyClass.java"],
7940 package_name: "foo",
7941 sdk_version: "none",
7942 system_modules: "none",
7943 apex_available: [ "myapex" ],
7944 }
7945 `, withFiles(map[string][]byte{
7946 "sub/Android.bp": []byte(`
7947 override_apex {
7948 name: "override_myapex",
7949 base: "myapex",
7950 apps: ["override_app"],
7951 allowed_files: ":allowed",
7952 }
7953 // Overridable "path" property should be referenced indirectly
7954 filegroup {
7955 name: "allowed",
7956 srcs: ["allowed.txt"],
7957 }
7958 override_android_app {
7959 name: "override_app",
7960 base: "app",
7961 package_name: "bar",
7962 }
7963 `),
7964 }))
7965
7966 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7967 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7968 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7969 }
7970
7971 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7972 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7973 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7974 }
7975}
7976
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007977func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007978 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007979 apex {
7980 name: "myapex",
7981 key: "myapex.key",
7982 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007983 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007984 }
7985
7986 apex_key {
7987 name: "myapex.key",
7988 public_key: "testkey.avbpubkey",
7989 private_key: "testkey.pem",
7990 }
7991
7992 cc_library {
7993 name: "mylib",
7994 srcs: ["mylib.cpp"],
7995 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007996 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007997 },
7998 apex_available: ["myapex"],
7999 }
8000
8001 cc_prebuilt_library_shared {
8002 name: "mylib",
8003 prefer: false,
8004 srcs: ["prebuilt.so"],
8005 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008006 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008007 },
8008 apex_available: ["myapex"],
8009 }
8010 `)
8011}
8012
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008013func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008014 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008015 apex {
8016 name: "myapex",
8017 key: "myapex.key",
8018 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008019 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008020 }
8021 apex_key {
8022 name: "myapex.key",
8023 public_key: "testkey.avbpubkey",
8024 private_key: "testkey.pem",
8025 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008026 `,
8027 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8028 variables.CompressedApex = proptools.BoolPtr(true)
8029 }),
8030 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008031
8032 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8033 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8034
8035 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8036 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8037
8038 // Make sure output of bundle is .capex
8039 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8040 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8041
8042 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008043 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008044 var builder strings.Builder
8045 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8046 androidMk := builder.String()
8047 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8048}
8049
Martin Stjernholm2856c662020-12-02 15:03:42 +00008050func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008051 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008052 apex {
8053 name: "myapex",
8054 key: "myapex.key",
8055 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008056 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008057 }
8058
8059 apex_key {
8060 name: "myapex.key",
8061 public_key: "testkey.avbpubkey",
8062 private_key: "testkey.pem",
8063 }
8064
8065 cc_library {
8066 name: "mylib",
8067 srcs: ["mylib.cpp"],
8068 apex_available: ["myapex"],
8069 shared_libs: ["otherlib"],
8070 system_shared_libs: [],
8071 }
8072
8073 cc_library {
8074 name: "otherlib",
8075 srcs: ["mylib.cpp"],
8076 stubs: {
8077 versions: ["current"],
8078 },
8079 }
8080
8081 cc_prebuilt_library_shared {
8082 name: "otherlib",
8083 prefer: true,
8084 srcs: ["prebuilt.so"],
8085 stubs: {
8086 versions: ["current"],
8087 },
8088 }
8089 `)
8090
8091 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008092 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008093 var builder strings.Builder
8094 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8095 androidMk := builder.String()
8096
8097 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8098 // a thing there.
8099 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8100}
8101
Jiyong Parke3867542020-12-03 17:28:25 +09008102func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008103 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008104 apex {
8105 name: "myapex",
8106 key: "myapex.key",
8107 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008108 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008109 }
8110
8111 apex_key {
8112 name: "myapex.key",
8113 public_key: "testkey.avbpubkey",
8114 private_key: "testkey.pem",
8115 }
8116
8117 cc_library {
8118 name: "mylib",
8119 srcs: ["mylib.cpp"],
8120 system_shared_libs: [],
8121 stl: "none",
8122 apex_available: ["myapex"],
8123 shared_libs: ["mylib2"],
8124 target: {
8125 apex: {
8126 exclude_shared_libs: ["mylib2"],
8127 },
8128 },
8129 }
8130
8131 cc_library {
8132 name: "mylib2",
8133 srcs: ["mylib.cpp"],
8134 system_shared_libs: [],
8135 stl: "none",
8136 }
8137 `)
8138
8139 // Check if mylib is linked to mylib2 for the non-apex target
8140 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8141 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8142
8143 // Make sure that the link doesn't occur for the apex target
8144 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8145 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8146
8147 // It shouldn't appear in the copy cmd as well.
8148 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8149 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8150}
8151
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008152func TestPrebuiltStubLibDep(t *testing.T) {
8153 bpBase := `
8154 apex {
8155 name: "myapex",
8156 key: "myapex.key",
8157 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008158 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008159 }
8160 apex_key {
8161 name: "myapex.key",
8162 public_key: "testkey.avbpubkey",
8163 private_key: "testkey.pem",
8164 }
8165 cc_library {
8166 name: "mylib",
8167 srcs: ["mylib.cpp"],
8168 apex_available: ["myapex"],
8169 shared_libs: ["stublib"],
8170 system_shared_libs: [],
8171 }
8172 apex {
8173 name: "otherapex",
8174 enabled: %s,
8175 key: "myapex.key",
8176 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008177 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008178 }
8179 `
8180
8181 stublibSourceBp := `
8182 cc_library {
8183 name: "stublib",
8184 srcs: ["mylib.cpp"],
8185 apex_available: ["otherapex"],
8186 system_shared_libs: [],
8187 stl: "none",
8188 stubs: {
8189 versions: ["1"],
8190 },
8191 }
8192 `
8193
8194 stublibPrebuiltBp := `
8195 cc_prebuilt_library_shared {
8196 name: "stublib",
8197 srcs: ["prebuilt.so"],
8198 apex_available: ["otherapex"],
8199 stubs: {
8200 versions: ["1"],
8201 },
8202 %s
8203 }
8204 `
8205
8206 tests := []struct {
8207 name string
8208 stublibBp string
8209 usePrebuilt bool
8210 modNames []string // Modules to collect AndroidMkEntries for
8211 otherApexEnabled []string
8212 }{
8213 {
8214 name: "only_source",
8215 stublibBp: stublibSourceBp,
8216 usePrebuilt: false,
8217 modNames: []string{"stublib"},
8218 otherApexEnabled: []string{"true", "false"},
8219 },
8220 {
8221 name: "source_preferred",
8222 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8223 usePrebuilt: false,
8224 modNames: []string{"stublib", "prebuilt_stublib"},
8225 otherApexEnabled: []string{"true", "false"},
8226 },
8227 {
8228 name: "prebuilt_preferred",
8229 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8230 usePrebuilt: true,
8231 modNames: []string{"stublib", "prebuilt_stublib"},
8232 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8233 },
8234 {
8235 name: "only_prebuilt",
8236 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8237 usePrebuilt: true,
8238 modNames: []string{"stublib"},
8239 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8240 },
8241 }
8242
8243 for _, test := range tests {
8244 t.Run(test.name, func(t *testing.T) {
8245 for _, otherApexEnabled := range test.otherApexEnabled {
8246 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008247 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008248
8249 type modAndMkEntries struct {
8250 mod *cc.Module
8251 mkEntries android.AndroidMkEntries
8252 }
8253 entries := []*modAndMkEntries{}
8254
8255 // Gather shared lib modules that are installable
8256 for _, modName := range test.modNames {
8257 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8258 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8259 continue
8260 }
8261 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008262 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008263 continue
8264 }
Colin Crossaa255532020-07-03 13:18:24 -07008265 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008266 if ent.Disabled {
8267 continue
8268 }
8269 entries = append(entries, &modAndMkEntries{
8270 mod: mod,
8271 mkEntries: ent,
8272 })
8273 }
8274 }
8275 }
8276
8277 var entry *modAndMkEntries = nil
8278 for _, ent := range entries {
8279 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8280 if entry != nil {
8281 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8282 } else {
8283 entry = ent
8284 }
8285 }
8286 }
8287
8288 if entry == nil {
8289 t.Errorf("AndroidMk entry for \"stublib\" missing")
8290 } else {
8291 isPrebuilt := entry.mod.Prebuilt() != nil
8292 if isPrebuilt != test.usePrebuilt {
8293 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8294 }
8295 if !entry.mod.IsStubs() {
8296 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8297 }
8298 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8299 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8300 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008301 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008302 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008303 if !android.InList(expected, cflags) {
8304 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8305 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008306 }
8307 })
8308 }
8309 })
8310 }
8311}
8312
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008313func TestHostApexInHostOnlyBuild(t *testing.T) {
8314 testApex(t, `
8315 apex {
8316 name: "myapex",
8317 host_supported: true,
8318 key: "myapex.key",
8319 updatable: false,
8320 payload_type: "zip",
8321 }
8322 apex_key {
8323 name: "myapex.key",
8324 public_key: "testkey.avbpubkey",
8325 private_key: "testkey.pem",
8326 }
8327 `,
8328 android.FixtureModifyConfig(func(config android.Config) {
8329 // We may not have device targets in all builds, e.g. in
8330 // prebuilts/build-tools/build-prebuilts.sh
8331 config.Targets[android.Android] = []android.Target{}
8332 }))
8333}
8334
Colin Crossc33e5212021-05-25 18:16:02 -07008335func TestApexJavaCoverage(t *testing.T) {
8336 bp := `
8337 apex {
8338 name: "myapex",
8339 key: "myapex.key",
8340 java_libs: ["mylib"],
8341 bootclasspath_fragments: ["mybootclasspathfragment"],
8342 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8343 updatable: false,
8344 }
8345
8346 apex_key {
8347 name: "myapex.key",
8348 public_key: "testkey.avbpubkey",
8349 private_key: "testkey.pem",
8350 }
8351
8352 java_library {
8353 name: "mylib",
8354 srcs: ["mylib.java"],
8355 apex_available: ["myapex"],
8356 compile_dex: true,
8357 }
8358
8359 bootclasspath_fragment {
8360 name: "mybootclasspathfragment",
8361 contents: ["mybootclasspathlib"],
8362 apex_available: ["myapex"],
8363 }
8364
8365 java_library {
8366 name: "mybootclasspathlib",
8367 srcs: ["mybootclasspathlib.java"],
8368 apex_available: ["myapex"],
8369 compile_dex: true,
8370 }
8371
8372 systemserverclasspath_fragment {
8373 name: "mysystemserverclasspathfragment",
8374 contents: ["mysystemserverclasspathlib"],
8375 apex_available: ["myapex"],
8376 }
8377
8378 java_library {
8379 name: "mysystemserverclasspathlib",
8380 srcs: ["mysystemserverclasspathlib.java"],
8381 apex_available: ["myapex"],
8382 compile_dex: true,
8383 }
8384 `
8385
8386 result := android.GroupFixturePreparers(
8387 PrepareForTestWithApexBuildComponents,
8388 prepareForTestWithMyapex,
8389 java.PrepareForTestWithJavaDefaultModules,
8390 android.PrepareForTestWithAndroidBuildComponents,
8391 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008392 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8393 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008394 android.FixtureMergeEnv(map[string]string{
8395 "EMMA_INSTRUMENT": "true",
8396 }),
8397 ).RunTest(t)
8398
8399 // Make sure jacoco ran on both mylib and mybootclasspathlib
8400 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8401 t.Errorf("Failed to find jacoco rule for mylib")
8402 }
8403 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8404 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8405 }
8406 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8407 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8408 }
8409}
8410
Jiyong Park192600a2021-08-03 07:52:17 +00008411func TestProhibitStaticExecutable(t *testing.T) {
8412 testApexError(t, `executable mybin is static`, `
8413 apex {
8414 name: "myapex",
8415 key: "myapex.key",
8416 binaries: ["mybin"],
8417 min_sdk_version: "29",
8418 }
8419
8420 apex_key {
8421 name: "myapex.key",
8422 public_key: "testkey.avbpubkey",
8423 private_key: "testkey.pem",
8424 }
8425
8426 cc_binary {
8427 name: "mybin",
8428 srcs: ["mylib.cpp"],
8429 relative_install_path: "foo/bar",
8430 static_executable: true,
8431 system_shared_libs: [],
8432 stl: "none",
8433 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008434 min_sdk_version: "29",
8435 }
8436 `)
8437
8438 testApexError(t, `executable mybin.rust is static`, `
8439 apex {
8440 name: "myapex",
8441 key: "myapex.key",
8442 binaries: ["mybin.rust"],
8443 min_sdk_version: "29",
8444 }
8445
8446 apex_key {
8447 name: "myapex.key",
8448 public_key: "testkey.avbpubkey",
8449 private_key: "testkey.pem",
8450 }
8451
8452 rust_binary {
8453 name: "mybin.rust",
8454 srcs: ["foo.rs"],
8455 static_executable: true,
8456 apex_available: ["myapex"],
8457 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008458 }
8459 `)
8460}
8461
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008462func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8463 ctx := testApex(t, `
8464 apex {
8465 name: "myapex",
8466 key: "myapex.key",
8467 updatable: false,
8468 java_libs: ["foo"],
8469 }
8470
8471 apex_key {
8472 name: "myapex.key",
8473 public_key: "testkey.avbpubkey",
8474 private_key: "testkey.pem",
8475 }
8476
8477 java_library {
8478 name: "foo",
8479 srcs: ["foo.java"],
8480 apex_available: ["myapex"],
8481 installable: true,
8482 }
8483 `,
8484 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8485 )
8486
8487 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8488 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8489 var builder strings.Builder
8490 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8491 androidMk := builder.String()
8492 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")
8493}
8494
8495func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8496 ctx := testApex(t, `
8497 prebuilt_apex {
8498 name: "myapex",
8499 arch: {
8500 arm64: {
8501 src: "myapex-arm64.apex",
8502 },
8503 arm: {
8504 src: "myapex-arm.apex",
8505 },
8506 },
8507 exported_java_libs: ["foo"],
8508 }
8509
8510 java_import {
8511 name: "foo",
8512 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008513 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008514 }
8515 `,
8516 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8517 )
8518
8519 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8520 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8521 mainModuleEntries := entriesList[0]
8522 android.AssertArrayString(t,
8523 "LOCAL_REQUIRED_MODULES",
8524 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8525 []string{
8526 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8527 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8528 })
8529}
8530
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008531func TestAndroidMk_RequiredModules(t *testing.T) {
8532 ctx := testApex(t, `
8533 apex {
8534 name: "myapex",
8535 key: "myapex.key",
8536 updatable: false,
8537 java_libs: ["foo"],
8538 required: ["otherapex"],
8539 }
8540
8541 apex {
8542 name: "otherapex",
8543 key: "myapex.key",
8544 updatable: false,
8545 java_libs: ["foo"],
8546 required: ["otherapex"],
8547 }
8548
8549 apex_key {
8550 name: "myapex.key",
8551 public_key: "testkey.avbpubkey",
8552 private_key: "testkey.pem",
8553 }
8554
8555 java_library {
8556 name: "foo",
8557 srcs: ["foo.java"],
8558 apex_available: ["myapex", "otherapex"],
8559 installable: true,
8560 }
8561 `)
8562
8563 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8564 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8565 var builder strings.Builder
8566 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8567 androidMk := builder.String()
8568 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
8569}
8570
satayev758968a2021-12-06 11:42:40 +00008571func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
8572 preparer := android.GroupFixturePreparers(
8573 PrepareForTestWithApexBuildComponents,
8574 prepareForTestWithMyapex,
8575 java.PrepareForTestWithJavaSdkLibraryFiles,
8576 java.PrepareForTestWithJavaDefaultModules,
8577 android.PrepareForTestWithAndroidBuildComponents,
8578 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8579 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
8580 )
8581
8582 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
8583 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8584 preparer.RunTestWithBp(t, `
8585 apex {
8586 name: "myapex",
8587 key: "myapex.key",
8588 bootclasspath_fragments: ["mybootclasspathfragment"],
8589 min_sdk_version: "30",
8590 updatable: false,
8591 }
8592
8593 apex_key {
8594 name: "myapex.key",
8595 public_key: "testkey.avbpubkey",
8596 private_key: "testkey.pem",
8597 }
8598
8599 bootclasspath_fragment {
8600 name: "mybootclasspathfragment",
8601 contents: ["mybootclasspathlib"],
8602 apex_available: ["myapex"],
8603 }
8604
8605 java_sdk_library {
8606 name: "mybootclasspathlib",
8607 srcs: ["mybootclasspathlib.java"],
8608 apex_available: ["myapex"],
8609 compile_dex: true,
8610 unsafe_ignore_missing_latest_api: true,
8611 min_sdk_version: "31",
8612 static_libs: ["util"],
8613 }
8614
8615 java_library {
8616 name: "util",
8617 srcs: ["a.java"],
8618 apex_available: ["myapex"],
8619 min_sdk_version: "31",
8620 static_libs: ["another_util"],
8621 }
8622
8623 java_library {
8624 name: "another_util",
8625 srcs: ["a.java"],
8626 min_sdk_version: "31",
8627 apex_available: ["myapex"],
8628 }
8629 `)
8630 })
8631
8632 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
8633 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8634 preparer.RunTestWithBp(t, `
8635 apex {
8636 name: "myapex",
8637 key: "myapex.key",
8638 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8639 min_sdk_version: "30",
8640 updatable: false,
8641 }
8642
8643 apex_key {
8644 name: "myapex.key",
8645 public_key: "testkey.avbpubkey",
8646 private_key: "testkey.pem",
8647 }
8648
8649 systemserverclasspath_fragment {
8650 name: "mysystemserverclasspathfragment",
8651 contents: ["mysystemserverclasspathlib"],
8652 apex_available: ["myapex"],
8653 }
8654
8655 java_sdk_library {
8656 name: "mysystemserverclasspathlib",
8657 srcs: ["mysystemserverclasspathlib.java"],
8658 apex_available: ["myapex"],
8659 compile_dex: true,
8660 min_sdk_version: "32",
8661 unsafe_ignore_missing_latest_api: true,
8662 static_libs: ["util"],
8663 }
8664
8665 java_library {
8666 name: "util",
8667 srcs: ["a.java"],
8668 apex_available: ["myapex"],
8669 min_sdk_version: "31",
8670 static_libs: ["another_util"],
8671 }
8672
8673 java_library {
8674 name: "another_util",
8675 srcs: ["a.java"],
8676 min_sdk_version: "31",
8677 apex_available: ["myapex"],
8678 }
8679 `)
8680 })
8681
8682 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8683 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
8684 RunTestWithBp(t, `
8685 apex {
8686 name: "myapex",
8687 key: "myapex.key",
8688 bootclasspath_fragments: ["mybootclasspathfragment"],
8689 min_sdk_version: "30",
8690 updatable: false,
8691 }
8692
8693 apex_key {
8694 name: "myapex.key",
8695 public_key: "testkey.avbpubkey",
8696 private_key: "testkey.pem",
8697 }
8698
8699 bootclasspath_fragment {
8700 name: "mybootclasspathfragment",
8701 contents: ["mybootclasspathlib"],
8702 apex_available: ["myapex"],
8703 }
8704
8705 java_sdk_library {
8706 name: "mybootclasspathlib",
8707 srcs: ["mybootclasspathlib.java"],
8708 apex_available: ["myapex"],
8709 compile_dex: true,
8710 unsafe_ignore_missing_latest_api: true,
8711 }
8712 `)
8713 })
8714
8715 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8716 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
8717 RunTestWithBp(t, `
8718 apex {
8719 name: "myapex",
8720 key: "myapex.key",
8721 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8722 min_sdk_version: "30",
8723 updatable: false,
8724 }
8725
8726 apex_key {
8727 name: "myapex.key",
8728 public_key: "testkey.avbpubkey",
8729 private_key: "testkey.pem",
8730 }
8731
8732 systemserverclasspath_fragment {
8733 name: "mysystemserverclasspathfragment",
8734 contents: ["mysystemserverclasspathlib"],
8735 apex_available: ["myapex"],
8736 }
8737
8738 java_sdk_library {
8739 name: "mysystemserverclasspathlib",
8740 srcs: ["mysystemserverclasspathlib.java"],
8741 apex_available: ["myapex"],
8742 compile_dex: true,
8743 unsafe_ignore_missing_latest_api: true,
8744 }
8745 `)
8746 })
8747}
8748
Jiakai Zhang6decef92022-01-12 17:56:19 +00008749// Verifies that the APEX depends on all the Make modules in the list.
8750func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
8751 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
8752 for _, dep := range deps {
8753 android.AssertStringListContains(t, "", a.requiredDeps, dep)
8754 }
8755}
8756
8757// Verifies that the APEX does not depend on any of the Make modules in the list.
8758func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
8759 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
8760 for _, dep := range deps {
8761 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
8762 }
8763}
8764
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07008765func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01008766 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07008767}