blob: 067501ecbd096da11e24fedb55c624d95e193d1e [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 Hanc5a96762022-02-04 11:54:50 +09002716func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2717 testApexError(t, `Trying to include a VNDK library`, `
2718 apex {
2719 name: "myapex",
2720 key: "myapex.key",
2721 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2722 vendor: true,
2723 use_vndk_as_stable: true,
2724 updatable: false,
2725 }
2726 apex_key {
2727 name: "myapex.key",
2728 public_key: "testkey.avbpubkey",
2729 private_key: "testkey.pem",
2730 }`)
2731}
2732
Jooyung Handf78e212020-07-22 15:54:47 +09002733func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002734 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002735 apex {
2736 name: "myapex",
2737 key: "myapex.key",
2738 binaries: ["mybin"],
2739 vendor: true,
2740 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002741 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002742 }
2743 apex_key {
2744 name: "myapex.key",
2745 public_key: "testkey.avbpubkey",
2746 private_key: "testkey.pem",
2747 }
2748 cc_binary {
2749 name: "mybin",
2750 vendor: true,
2751 shared_libs: ["libvndk", "libvendor"],
2752 }
2753 cc_library {
2754 name: "libvndk",
2755 vndk: {
2756 enabled: true,
2757 },
2758 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002759 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002760 }
2761 cc_library {
2762 name: "libvendor",
2763 vendor: true,
2764 }
2765 `)
2766
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002767 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002768
Paul Duffina71a67a2021-03-29 00:42:57 +01002769 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002770 libs := names(ldRule.Args["libFlags"])
2771 // VNDK libs(libvndk/libc++) as they are
Paul Duffin37ba3442021-03-29 00:21:08 +01002772 ensureListContains(t, libs, "out/soong/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2773 ensureListContains(t, libs, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"libc++/"+vendorVariant+"_shared/libc++.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002774 // non-stable Vendor libs as APEX variants
Paul Duffin37ba3442021-03-29 00:21:08 +01002775 ensureListContains(t, libs, "out/soong/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002776
2777 // VNDK libs are not included when use_vndk_as_stable: true
2778 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2779 "bin/mybin",
2780 "lib64/libvendor.so",
2781 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002782
2783 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2784 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2785 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002786}
2787
Justin Yun13decfb2021-03-08 19:25:55 +09002788func TestProductVariant(t *testing.T) {
2789 ctx := testApex(t, `
2790 apex {
2791 name: "myapex",
2792 key: "myapex.key",
2793 updatable: false,
2794 product_specific: true,
2795 binaries: ["foo"],
2796 }
2797
2798 apex_key {
2799 name: "myapex.key",
2800 public_key: "testkey.avbpubkey",
2801 private_key: "testkey.pem",
2802 }
2803
2804 cc_binary {
2805 name: "foo",
2806 product_available: true,
2807 apex_available: ["myapex"],
2808 srcs: ["foo.cpp"],
2809 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002810 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2811 variables.ProductVndkVersion = proptools.StringPtr("current")
2812 }),
2813 )
Justin Yun13decfb2021-03-08 19:25:55 +09002814
2815 cflags := strings.Fields(
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002816 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002817 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2818 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2819 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2820 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2821}
2822
Jooyung Han8e5685d2020-09-21 11:02:57 +09002823func TestApex_withPrebuiltFirmware(t *testing.T) {
2824 testCases := []struct {
2825 name string
2826 additionalProp string
2827 }{
2828 {"system apex with prebuilt_firmware", ""},
2829 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2830 }
2831 for _, tc := range testCases {
2832 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002833 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002834 apex {
2835 name: "myapex",
2836 key: "myapex.key",
2837 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002838 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002839 `+tc.additionalProp+`
2840 }
2841 apex_key {
2842 name: "myapex.key",
2843 public_key: "testkey.avbpubkey",
2844 private_key: "testkey.pem",
2845 }
2846 prebuilt_firmware {
2847 name: "myfirmware",
2848 src: "myfirmware.bin",
2849 filename_from_src: true,
2850 `+tc.additionalProp+`
2851 }
2852 `)
2853 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2854 "etc/firmware/myfirmware.bin",
2855 })
2856 })
2857 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002858}
2859
Jooyung Hanefb184e2020-06-25 17:14:25 +09002860func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002861 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002862 apex {
2863 name: "myapex",
2864 key: "myapex.key",
2865 vendor: true,
2866 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002867 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002868 }
2869
2870 apex_key {
2871 name: "myapex.key",
2872 public_key: "testkey.avbpubkey",
2873 private_key: "testkey.pem",
2874 }
2875
2876 cc_library {
2877 name: "mylib",
2878 vendor_available: true,
2879 }
2880 `)
2881
2882 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002883 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002884 name := apexBundle.BaseModuleName()
2885 prefix := "TARGET_"
2886 var builder strings.Builder
2887 data.Custom(&builder, name, prefix, "", data)
2888 androidMk := builder.String()
2889 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2890}
2891
Jooyung Han2ed99d02020-06-24 23:26:26 +09002892func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002893 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002894 apex {
2895 name: "myapex",
2896 key: "myapex.key",
2897 vintf_fragments: ["fragment.xml"],
2898 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002899 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002900 }
2901 apex_key {
2902 name: "myapex.key",
2903 public_key: "testkey.avbpubkey",
2904 private_key: "testkey.pem",
2905 }
2906 cc_binary {
2907 name: "mybin",
2908 }
2909 `)
2910
2911 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002912 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002913 name := apexBundle.BaseModuleName()
2914 prefix := "TARGET_"
2915 var builder strings.Builder
2916 data.Custom(&builder, name, prefix, "", data)
2917 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002918 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002919 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002920}
2921
Jiyong Park16e91a02018-12-20 18:18:08 +09002922func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002923 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002924 apex {
2925 name: "myapex",
2926 key: "myapex.key",
2927 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002928 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09002929 }
2930
2931 apex_key {
2932 name: "myapex.key",
2933 public_key: "testkey.avbpubkey",
2934 private_key: "testkey.pem",
2935 }
2936
2937 cc_library {
2938 name: "mylib",
2939 srcs: ["mylib.cpp"],
2940 system_shared_libs: [],
2941 stl: "none",
2942 stubs: {
2943 versions: ["1", "2", "3"],
2944 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002945 apex_available: [
2946 "//apex_available:platform",
2947 "myapex",
2948 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002949 }
2950
2951 cc_binary {
2952 name: "not_in_apex",
2953 srcs: ["mylib.cpp"],
2954 static_libs: ["mylib"],
2955 static_executable: true,
2956 system_shared_libs: [],
2957 stl: "none",
2958 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002959 `)
2960
Colin Cross7113d202019-11-20 16:39:12 -08002961 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002962
2963 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002964 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002965}
Jiyong Park9335a262018-12-24 11:31:58 +09002966
2967func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002968 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002969 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002970 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002971 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002972 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002973 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002974 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002975 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09002976 }
2977
2978 cc_library {
2979 name: "mylib",
2980 srcs: ["mylib.cpp"],
2981 system_shared_libs: [],
2982 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002983 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002984 }
2985
2986 apex_key {
2987 name: "myapex.key",
2988 public_key: "testkey.avbpubkey",
2989 private_key: "testkey.pem",
2990 }
2991
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002992 android_app_certificate {
2993 name: "myapex.certificate",
2994 certificate: "testkey",
2995 }
2996
2997 android_app_certificate {
2998 name: "myapex.certificate.override",
2999 certificate: "testkey.override",
3000 }
3001
Jiyong Park9335a262018-12-24 11:31:58 +09003002 `)
3003
3004 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003005 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003006
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003007 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3008 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003009 "vendor/foo/devkeys/testkey.avbpubkey")
3010 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003011 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3012 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003013 "vendor/foo/devkeys/testkey.pem")
3014 }
3015
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003016 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003017 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003018 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003019 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003020 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003021 }
3022}
Jiyong Park58e364a2019-01-19 19:24:06 +09003023
Jooyung Hanf121a652019-12-17 14:30:11 +09003024func TestCertificate(t *testing.T) {
3025 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003026 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003027 apex {
3028 name: "myapex",
3029 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003030 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003031 }
3032 apex_key {
3033 name: "myapex.key",
3034 public_key: "testkey.avbpubkey",
3035 private_key: "testkey.pem",
3036 }`)
3037 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3038 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3039 if actual := rule.Args["certificates"]; actual != expected {
3040 t.Errorf("certificates should be %q, not %q", expected, actual)
3041 }
3042 })
3043 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003044 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003045 apex {
3046 name: "myapex_keytest",
3047 key: "myapex.key",
3048 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003049 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003050 }
3051 apex_key {
3052 name: "myapex.key",
3053 public_key: "testkey.avbpubkey",
3054 private_key: "testkey.pem",
3055 }
3056 android_app_certificate {
3057 name: "myapex.certificate.override",
3058 certificate: "testkey.override",
3059 }`)
3060 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3061 expected := "testkey.override.x509.pem testkey.override.pk8"
3062 if actual := rule.Args["certificates"]; actual != expected {
3063 t.Errorf("certificates should be %q, not %q", expected, actual)
3064 }
3065 })
3066 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003067 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003068 apex {
3069 name: "myapex",
3070 key: "myapex.key",
3071 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003072 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003073 }
3074 apex_key {
3075 name: "myapex.key",
3076 public_key: "testkey.avbpubkey",
3077 private_key: "testkey.pem",
3078 }
3079 android_app_certificate {
3080 name: "myapex.certificate",
3081 certificate: "testkey",
3082 }`)
3083 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3084 expected := "testkey.x509.pem testkey.pk8"
3085 if actual := rule.Args["certificates"]; actual != expected {
3086 t.Errorf("certificates should be %q, not %q", expected, actual)
3087 }
3088 })
3089 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003090 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003091 apex {
3092 name: "myapex_keytest",
3093 key: "myapex.key",
3094 file_contexts: ":myapex-file_contexts",
3095 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003096 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003097 }
3098 apex_key {
3099 name: "myapex.key",
3100 public_key: "testkey.avbpubkey",
3101 private_key: "testkey.pem",
3102 }
3103 android_app_certificate {
3104 name: "myapex.certificate.override",
3105 certificate: "testkey.override",
3106 }`)
3107 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3108 expected := "testkey.override.x509.pem testkey.override.pk8"
3109 if actual := rule.Args["certificates"]; actual != expected {
3110 t.Errorf("certificates should be %q, not %q", expected, actual)
3111 }
3112 })
3113 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003114 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003115 apex {
3116 name: "myapex",
3117 key: "myapex.key",
3118 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003119 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003120 }
3121 apex_key {
3122 name: "myapex.key",
3123 public_key: "testkey.avbpubkey",
3124 private_key: "testkey.pem",
3125 }`)
3126 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3127 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3128 if actual := rule.Args["certificates"]; actual != expected {
3129 t.Errorf("certificates should be %q, not %q", expected, actual)
3130 }
3131 })
3132 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003133 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003134 apex {
3135 name: "myapex_keytest",
3136 key: "myapex.key",
3137 file_contexts: ":myapex-file_contexts",
3138 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003139 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003140 }
3141 apex_key {
3142 name: "myapex.key",
3143 public_key: "testkey.avbpubkey",
3144 private_key: "testkey.pem",
3145 }
3146 android_app_certificate {
3147 name: "myapex.certificate.override",
3148 certificate: "testkey.override",
3149 }`)
3150 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3151 expected := "testkey.override.x509.pem testkey.override.pk8"
3152 if actual := rule.Args["certificates"]; actual != expected {
3153 t.Errorf("certificates should be %q, not %q", expected, actual)
3154 }
3155 })
3156}
3157
Jiyong Park58e364a2019-01-19 19:24:06 +09003158func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003159 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003160 apex {
3161 name: "myapex",
3162 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003163 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003164 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003165 }
3166
3167 apex {
3168 name: "otherapex",
3169 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003170 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003171 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003172 }
3173
3174 apex_key {
3175 name: "myapex.key",
3176 public_key: "testkey.avbpubkey",
3177 private_key: "testkey.pem",
3178 }
3179
3180 cc_library {
3181 name: "mylib",
3182 srcs: ["mylib.cpp"],
3183 system_shared_libs: [],
3184 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003185 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003186 "myapex",
3187 "otherapex",
3188 ],
Jooyung Han24282772020-03-21 23:20:55 +09003189 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003190 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003191 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003192 cc_library {
3193 name: "mylib2",
3194 srcs: ["mylib.cpp"],
3195 system_shared_libs: [],
3196 stl: "none",
3197 apex_available: [
3198 "myapex",
3199 "otherapex",
3200 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003201 static_libs: ["mylib3"],
3202 recovery_available: true,
3203 min_sdk_version: "29",
3204 }
3205 cc_library {
3206 name: "mylib3",
3207 srcs: ["mylib.cpp"],
3208 system_shared_libs: [],
3209 stl: "none",
3210 apex_available: [
3211 "myapex",
3212 "otherapex",
3213 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003214 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003215 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003216 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003217 `)
3218
Jooyung Hanc87a0592020-03-02 17:44:33 +09003219 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003220 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003221 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003222 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003223
Jooyung Hanccce2f22020-03-07 03:45:53 +09003224 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003225 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003226 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003227 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003228
Jooyung Hanccce2f22020-03-07 03:45:53 +09003229 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003230 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003231 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003232 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003233
Colin Crossaede88c2020-08-11 12:17:01 -07003234 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3235 // each variant defines additional macros to distinguish which apex variant it is built for
3236
3237 // non-APEX variant does not have __ANDROID_APEX__ defined
3238 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3239 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3240
Dan Albertb19953d2020-11-17 15:29:36 -08003241 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003242 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3243 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003244 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003245
Jooyung Hanc87a0592020-03-02 17:44:33 +09003246 // non-APEX variant does not have __ANDROID_APEX__ defined
3247 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3248 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3249
Dan Albertb19953d2020-11-17 15:29:36 -08003250 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003251 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003252 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003253 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003254}
Jiyong Park7e636d02019-01-28 16:16:54 +09003255
3256func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003257 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003258 apex {
3259 name: "myapex",
3260 key: "myapex.key",
3261 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003262 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003263 }
3264
3265 apex_key {
3266 name: "myapex.key",
3267 public_key: "testkey.avbpubkey",
3268 private_key: "testkey.pem",
3269 }
3270
3271 cc_library_headers {
3272 name: "mylib_headers",
3273 export_include_dirs: ["my_include"],
3274 system_shared_libs: [],
3275 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003276 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003277 }
3278
3279 cc_library {
3280 name: "mylib",
3281 srcs: ["mylib.cpp"],
3282 system_shared_libs: [],
3283 stl: "none",
3284 header_libs: ["mylib_headers"],
3285 export_header_lib_headers: ["mylib_headers"],
3286 stubs: {
3287 versions: ["1", "2", "3"],
3288 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003289 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003290 }
3291
3292 cc_library {
3293 name: "otherlib",
3294 srcs: ["mylib.cpp"],
3295 system_shared_libs: [],
3296 stl: "none",
3297 shared_libs: ["mylib"],
3298 }
3299 `)
3300
Colin Cross7113d202019-11-20 16:39:12 -08003301 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003302
3303 // Ensure that the include path of the header lib is exported to 'otherlib'
3304 ensureContains(t, cFlags, "-Imy_include")
3305}
Alex Light9670d332019-01-29 18:07:33 -08003306
Jiyong Park7cd10e32020-01-14 09:22:18 +09003307type fileInApex struct {
3308 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003309 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003310 isLink bool
3311}
3312
Jooyung Hana57af4a2020-01-23 05:36:59 +00003313func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003314 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003315 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003316 copyCmds := apexRule.Args["copy_commands"]
3317 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003318 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003319 for _, cmd := range strings.Split(copyCmds, "&&") {
3320 cmd = strings.TrimSpace(cmd)
3321 if cmd == "" {
3322 continue
3323 }
3324 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003325 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003326 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003327 switch terms[0] {
3328 case "mkdir":
3329 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003330 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003331 t.Fatal("copyCmds contains invalid cp command", cmd)
3332 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003333 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003334 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003335 isLink = false
3336 case "ln":
3337 if len(terms) != 3 && len(terms) != 4 {
3338 // ln LINK TARGET or ln -s LINK TARGET
3339 t.Fatal("copyCmds contains invalid ln command", cmd)
3340 }
3341 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003342 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003343 isLink = true
3344 default:
3345 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3346 }
3347 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003348 index := strings.Index(dst, imageApexDir)
3349 if index == -1 {
3350 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3351 }
3352 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003353 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003354 }
3355 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003356 return ret
3357}
3358
Jooyung Hana57af4a2020-01-23 05:36:59 +00003359func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3360 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003361 var failed bool
3362 var surplus []string
3363 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003364 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003365 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003366 for _, expected := range files {
3367 if matched, _ := path.Match(expected, file.path); matched {
3368 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003369 mactchFound = true
3370 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003371 }
3372 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003373 if !mactchFound {
3374 surplus = append(surplus, file.path)
3375 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003376 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003377
Jooyung Han31c470b2019-10-18 16:26:59 +09003378 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003379 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003380 t.Log("surplus files", surplus)
3381 failed = true
3382 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003383
3384 if len(files) > len(filesMatched) {
3385 var missing []string
3386 for _, expected := range files {
3387 if !filesMatched[expected] {
3388 missing = append(missing, expected)
3389 }
3390 }
3391 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003392 t.Log("missing files", missing)
3393 failed = true
3394 }
3395 if failed {
3396 t.Fail()
3397 }
3398}
3399
Jooyung Han344d5432019-08-23 11:17:39 +09003400func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003401 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003402 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003403 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003404 "etc/llndk.libraries.29.txt",
3405 "etc/vndkcore.libraries.29.txt",
3406 "etc/vndksp.libraries.29.txt",
3407 "etc/vndkprivate.libraries.29.txt",
3408 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003409 }
3410 testCases := []struct {
3411 vndkVersion string
3412 expectedFiles []string
3413 }{
3414 {
3415 vndkVersion: "current",
3416 expectedFiles: append(commonFiles,
3417 "lib/libvndk.so",
3418 "lib/libvndksp.so",
3419 "lib64/libvndk.so",
3420 "lib64/libvndksp.so"),
3421 },
3422 {
3423 vndkVersion: "",
3424 expectedFiles: append(commonFiles,
3425 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3426 "lib/libvndksp.so",
3427 "lib64/libvndksp.so"),
3428 },
3429 }
3430 for _, tc := range testCases {
3431 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3432 ctx := testApex(t, `
3433 apex_vndk {
3434 name: "com.android.vndk.current",
3435 key: "com.android.vndk.current.key",
3436 updatable: false,
3437 }
3438
3439 apex_key {
3440 name: "com.android.vndk.current.key",
3441 public_key: "testkey.avbpubkey",
3442 private_key: "testkey.pem",
3443 }
3444
3445 cc_library {
3446 name: "libvndk",
3447 srcs: ["mylib.cpp"],
3448 vendor_available: true,
3449 product_available: true,
3450 vndk: {
3451 enabled: true,
3452 },
3453 system_shared_libs: [],
3454 stl: "none",
3455 apex_available: [ "com.android.vndk.current" ],
3456 }
3457
3458 cc_library {
3459 name: "libvndksp",
3460 srcs: ["mylib.cpp"],
3461 vendor_available: true,
3462 product_available: true,
3463 vndk: {
3464 enabled: true,
3465 support_system_process: true,
3466 },
3467 system_shared_libs: [],
3468 stl: "none",
3469 apex_available: [ "com.android.vndk.current" ],
3470 }
3471
3472 // VNDK-Ext should not cause any problems
3473
3474 cc_library {
3475 name: "libvndk.ext",
3476 srcs: ["mylib2.cpp"],
3477 vendor: true,
3478 vndk: {
3479 enabled: true,
3480 extends: "libvndk",
3481 },
3482 system_shared_libs: [],
3483 stl: "none",
3484 }
3485
3486 cc_library {
3487 name: "libvndksp.ext",
3488 srcs: ["mylib2.cpp"],
3489 vendor: true,
3490 vndk: {
3491 enabled: true,
3492 support_system_process: true,
3493 extends: "libvndksp",
3494 },
3495 system_shared_libs: [],
3496 stl: "none",
3497 }
3498 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3499 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3500 }))
3501 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3502 })
3503 }
Jooyung Han344d5432019-08-23 11:17:39 +09003504}
3505
3506func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003507 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003508 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003509 name: "com.android.vndk.current",
3510 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003511 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003512 }
3513
3514 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003515 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003516 public_key: "testkey.avbpubkey",
3517 private_key: "testkey.pem",
3518 }
3519
3520 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003521 name: "libvndk",
3522 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003523 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003524 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003525 vndk: {
3526 enabled: true,
3527 },
3528 system_shared_libs: [],
3529 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003530 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003531 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003532
3533 cc_prebuilt_library_shared {
3534 name: "libvndk.arm",
3535 srcs: ["libvndk.arm.so"],
3536 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003537 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003538 vndk: {
3539 enabled: true,
3540 },
3541 enabled: false,
3542 arch: {
3543 arm: {
3544 enabled: true,
3545 },
3546 },
3547 system_shared_libs: [],
3548 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003549 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003550 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003551 `+vndkLibrariesTxtFiles("current"),
3552 withFiles(map[string][]byte{
3553 "libvndk.so": nil,
3554 "libvndk.arm.so": nil,
3555 }))
Colin Cross2807f002021-03-02 10:15:29 -08003556 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003557 "lib/libvndk.so",
3558 "lib/libvndk.arm.so",
3559 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003560 "lib/libc++.so",
3561 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003562 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003563 })
Jooyung Han344d5432019-08-23 11:17:39 +09003564}
3565
Jooyung Han39edb6c2019-11-06 16:53:07 +09003566func vndkLibrariesTxtFiles(vers ...string) (result string) {
3567 for _, v := range vers {
3568 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003569 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003570 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003571 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003572 name: "` + txt + `.libraries.txt",
3573 }
3574 `
3575 }
3576 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003577 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003578 result += `
3579 prebuilt_etc {
3580 name: "` + txt + `.libraries.` + v + `.txt",
3581 src: "dummy.txt",
3582 }
3583 `
3584 }
3585 }
3586 }
3587 return
3588}
3589
Jooyung Han344d5432019-08-23 11:17:39 +09003590func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003591 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003592 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003593 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003594 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003595 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003596 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003597 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003598 }
3599
3600 apex_key {
3601 name: "myapex.key",
3602 public_key: "testkey.avbpubkey",
3603 private_key: "testkey.pem",
3604 }
3605
Jooyung Han31c470b2019-10-18 16:26:59 +09003606 vndk_prebuilt_shared {
3607 name: "libvndk27",
3608 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003609 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003610 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003611 vndk: {
3612 enabled: true,
3613 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003614 target_arch: "arm64",
3615 arch: {
3616 arm: {
3617 srcs: ["libvndk27_arm.so"],
3618 },
3619 arm64: {
3620 srcs: ["libvndk27_arm64.so"],
3621 },
3622 },
Colin Cross2807f002021-03-02 10:15:29 -08003623 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003624 }
3625
3626 vndk_prebuilt_shared {
3627 name: "libvndk27",
3628 version: "27",
3629 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003630 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003631 vndk: {
3632 enabled: true,
3633 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003634 target_arch: "x86_64",
3635 arch: {
3636 x86: {
3637 srcs: ["libvndk27_x86.so"],
3638 },
3639 x86_64: {
3640 srcs: ["libvndk27_x86_64.so"],
3641 },
3642 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003643 }
3644 `+vndkLibrariesTxtFiles("27"),
3645 withFiles(map[string][]byte{
3646 "libvndk27_arm.so": nil,
3647 "libvndk27_arm64.so": nil,
3648 "libvndk27_x86.so": nil,
3649 "libvndk27_x86_64.so": nil,
3650 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003651
Colin Cross2807f002021-03-02 10:15:29 -08003652 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003653 "lib/libvndk27_arm.so",
3654 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003655 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003656 })
Jooyung Han344d5432019-08-23 11:17:39 +09003657}
3658
Jooyung Han90eee022019-10-01 20:02:42 +09003659func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003660 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003661 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003662 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003663 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003664 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003665 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003666 }
3667 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003668 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003669 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003670 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003671 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003672 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003673 }
3674 apex_key {
3675 name: "myapex.key",
3676 public_key: "testkey.avbpubkey",
3677 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003678 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003679
3680 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003681 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003682 actual := proptools.String(bundle.properties.Apex_name)
3683 if !reflect.DeepEqual(actual, expected) {
3684 t.Errorf("Got '%v', expected '%v'", actual, expected)
3685 }
3686 }
3687
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003688 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003689 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003690}
3691
Jooyung Han344d5432019-08-23 11:17:39 +09003692func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003693 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003694 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003695 name: "com.android.vndk.current",
3696 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003697 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003698 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003699 }
3700
3701 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003702 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003703 public_key: "testkey.avbpubkey",
3704 private_key: "testkey.pem",
3705 }
3706
3707 cc_library {
3708 name: "libvndk",
3709 srcs: ["mylib.cpp"],
3710 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003711 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003712 native_bridge_supported: true,
3713 host_supported: true,
3714 vndk: {
3715 enabled: true,
3716 },
3717 system_shared_libs: [],
3718 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003719 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003720 }
Colin Cross2807f002021-03-02 10:15:29 -08003721 `+vndkLibrariesTxtFiles("current"),
3722 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003723
Colin Cross2807f002021-03-02 10:15:29 -08003724 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003725 "lib/libvndk.so",
3726 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003727 "lib/libc++.so",
3728 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003729 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003730 })
Jooyung Han344d5432019-08-23 11:17:39 +09003731}
3732
3733func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003734 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003735 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003736 name: "com.android.vndk.current",
3737 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003738 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003739 native_bridge_supported: true,
3740 }
3741
3742 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003743 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003744 public_key: "testkey.avbpubkey",
3745 private_key: "testkey.pem",
3746 }
3747
3748 cc_library {
3749 name: "libvndk",
3750 srcs: ["mylib.cpp"],
3751 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003752 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003753 native_bridge_supported: true,
3754 host_supported: true,
3755 vndk: {
3756 enabled: true,
3757 },
3758 system_shared_libs: [],
3759 stl: "none",
3760 }
3761 `)
3762}
3763
Jooyung Han31c470b2019-10-18 16:26:59 +09003764func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003765 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003766 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003767 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003768 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003769 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003770 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003771 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003772 }
3773
3774 apex_key {
3775 name: "myapex.key",
3776 public_key: "testkey.avbpubkey",
3777 private_key: "testkey.pem",
3778 }
3779
3780 vndk_prebuilt_shared {
3781 name: "libvndk27",
3782 version: "27",
3783 target_arch: "arm",
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: ["libvndk27.so"],
3792 }
3793 },
3794 }
3795
3796 vndk_prebuilt_shared {
3797 name: "libvndk27",
3798 version: "27",
3799 target_arch: "arm",
3800 binder32bit: true,
3801 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003802 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003803 vndk: {
3804 enabled: true,
3805 },
3806 arch: {
3807 arm: {
3808 srcs: ["libvndk27binder32.so"],
3809 }
3810 },
Colin Cross2807f002021-03-02 10:15:29 -08003811 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003812 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003813 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003814 withFiles(map[string][]byte{
3815 "libvndk27.so": nil,
3816 "libvndk27binder32.so": nil,
3817 }),
3818 withBinder32bit,
3819 withTargets(map[android.OsType][]android.Target{
3820 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003821 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3822 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003823 },
3824 }),
3825 )
3826
Colin Cross2807f002021-03-02 10:15:29 -08003827 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003828 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003829 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003830 })
3831}
3832
Jooyung Han45a96772020-06-15 14:59:42 +09003833func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003834 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003835 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003836 name: "com.android.vndk.current",
3837 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003838 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003839 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003840 }
3841
3842 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003843 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003844 public_key: "testkey.avbpubkey",
3845 private_key: "testkey.pem",
3846 }
3847
3848 cc_library {
3849 name: "libz",
3850 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003851 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003852 vndk: {
3853 enabled: true,
3854 },
3855 stubs: {
3856 symbol_file: "libz.map.txt",
3857 versions: ["30"],
3858 }
3859 }
3860 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3861 "libz.map.txt": nil,
3862 }))
3863
Colin Cross2807f002021-03-02 10:15:29 -08003864 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003865 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3866 ensureListEmpty(t, provideNativeLibs)
3867}
3868
Jooyung Hane1633032019-08-01 17:41:43 +09003869func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003870 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003871 apex {
3872 name: "myapex_nodep",
3873 key: "myapex.key",
3874 native_shared_libs: ["lib_nodep"],
3875 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003876 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003877 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003878 }
3879
3880 apex {
3881 name: "myapex_dep",
3882 key: "myapex.key",
3883 native_shared_libs: ["lib_dep"],
3884 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003885 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003886 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003887 }
3888
3889 apex {
3890 name: "myapex_provider",
3891 key: "myapex.key",
3892 native_shared_libs: ["libfoo"],
3893 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003894 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003895 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003896 }
3897
3898 apex {
3899 name: "myapex_selfcontained",
3900 key: "myapex.key",
3901 native_shared_libs: ["lib_dep", "libfoo"],
3902 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003903 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003904 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003905 }
3906
3907 apex_key {
3908 name: "myapex.key",
3909 public_key: "testkey.avbpubkey",
3910 private_key: "testkey.pem",
3911 }
3912
3913 cc_library {
3914 name: "lib_nodep",
3915 srcs: ["mylib.cpp"],
3916 system_shared_libs: [],
3917 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003918 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003919 }
3920
3921 cc_library {
3922 name: "lib_dep",
3923 srcs: ["mylib.cpp"],
3924 shared_libs: ["libfoo"],
3925 system_shared_libs: [],
3926 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003927 apex_available: [
3928 "myapex_dep",
3929 "myapex_provider",
3930 "myapex_selfcontained",
3931 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003932 }
3933
3934 cc_library {
3935 name: "libfoo",
3936 srcs: ["mytest.cpp"],
3937 stubs: {
3938 versions: ["1"],
3939 },
3940 system_shared_libs: [],
3941 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003942 apex_available: [
3943 "myapex_provider",
3944 "myapex_selfcontained",
3945 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003946 }
3947 `)
3948
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003949 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003950 var provideNativeLibs, requireNativeLibs []string
3951
Sundong Ahnabb64432019-10-22 13:58:29 +09003952 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003953 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3954 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003955 ensureListEmpty(t, provideNativeLibs)
3956 ensureListEmpty(t, requireNativeLibs)
3957
Sundong Ahnabb64432019-10-22 13:58:29 +09003958 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003959 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3960 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003961 ensureListEmpty(t, provideNativeLibs)
3962 ensureListContains(t, requireNativeLibs, "libfoo.so")
3963
Sundong Ahnabb64432019-10-22 13:58:29 +09003964 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003965 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3966 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003967 ensureListContains(t, provideNativeLibs, "libfoo.so")
3968 ensureListEmpty(t, requireNativeLibs)
3969
Sundong Ahnabb64432019-10-22 13:58:29 +09003970 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003971 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3972 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003973 ensureListContains(t, provideNativeLibs, "libfoo.so")
3974 ensureListEmpty(t, requireNativeLibs)
3975}
3976
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003977func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003978 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003979 apex {
3980 name: "myapex",
3981 key: "myapex.key",
3982 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003983 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003984 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003985 }
3986
3987 apex_key {
3988 name: "myapex.key",
3989 public_key: "testkey.avbpubkey",
3990 private_key: "testkey.pem",
3991 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003992
3993 cc_library {
3994 name: "mylib",
3995 srcs: ["mylib.cpp"],
3996 system_shared_libs: [],
3997 stl: "none",
3998 apex_available: [
3999 "//apex_available:platform",
4000 "myapex",
4001 ],
4002 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004003 `)
4004
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004005 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004006 apexManifestRule := module.Rule("apexManifestRule")
4007 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4008 apexRule := module.Rule("apexRule")
4009 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004010
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004011 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004012 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004013 name := apexBundle.BaseModuleName()
4014 prefix := "TARGET_"
4015 var builder strings.Builder
4016 data.Custom(&builder, name, prefix, "", data)
4017 androidMk := builder.String()
4018 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4019 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004020}
4021
Alex Light0851b882019-02-07 13:20:53 -08004022func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004023 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004024 apex {
4025 name: "myapex",
4026 key: "myapex.key",
4027 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004028 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004029 }
4030
4031 apex_key {
4032 name: "myapex.key",
4033 public_key: "testkey.avbpubkey",
4034 private_key: "testkey.pem",
4035 }
4036
4037 cc_library {
4038 name: "mylib_common",
4039 srcs: ["mylib.cpp"],
4040 system_shared_libs: [],
4041 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004042 apex_available: [
4043 "//apex_available:platform",
4044 "myapex",
4045 ],
Alex Light0851b882019-02-07 13:20:53 -08004046 }
4047 `)
4048
Sundong Ahnabb64432019-10-22 13:58:29 +09004049 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004050 apexRule := module.Rule("apexRule")
4051 copyCmds := apexRule.Args["copy_commands"]
4052
4053 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4054 t.Log("Apex was a test apex!")
4055 t.Fail()
4056 }
4057 // Ensure that main rule creates an output
4058 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4059
4060 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004061 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004062
4063 // Ensure that both direct and indirect deps are copied into apex
4064 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4065
Colin Cross7113d202019-11-20 16:39:12 -08004066 // Ensure that the platform variant ends with _shared
4067 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004068
Colin Cross56a83212020-09-15 18:30:11 -07004069 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004070 t.Log("Found mylib_common not in any apex!")
4071 t.Fail()
4072 }
4073}
4074
4075func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004076 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004077 apex_test {
4078 name: "myapex",
4079 key: "myapex.key",
4080 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004081 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004082 }
4083
4084 apex_key {
4085 name: "myapex.key",
4086 public_key: "testkey.avbpubkey",
4087 private_key: "testkey.pem",
4088 }
4089
4090 cc_library {
4091 name: "mylib_common_test",
4092 srcs: ["mylib.cpp"],
4093 system_shared_libs: [],
4094 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004095 // TODO: remove //apex_available:platform
4096 apex_available: [
4097 "//apex_available:platform",
4098 "myapex",
4099 ],
Alex Light0851b882019-02-07 13:20:53 -08004100 }
4101 `)
4102
Sundong Ahnabb64432019-10-22 13:58:29 +09004103 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004104 apexRule := module.Rule("apexRule")
4105 copyCmds := apexRule.Args["copy_commands"]
4106
4107 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4108 t.Log("Apex was not a test apex!")
4109 t.Fail()
4110 }
4111 // Ensure that main rule creates an output
4112 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4113
4114 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004115 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004116
4117 // Ensure that both direct and indirect deps are copied into apex
4118 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4119
Colin Cross7113d202019-11-20 16:39:12 -08004120 // Ensure that the platform variant ends with _shared
4121 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004122}
4123
Alex Light9670d332019-01-29 18:07:33 -08004124func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004125 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004126 apex {
4127 name: "myapex",
4128 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004129 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004130 multilib: {
4131 first: {
4132 native_shared_libs: ["mylib_common"],
4133 }
4134 },
4135 target: {
4136 android: {
4137 multilib: {
4138 first: {
4139 native_shared_libs: ["mylib"],
4140 }
4141 }
4142 },
4143 host: {
4144 multilib: {
4145 first: {
4146 native_shared_libs: ["mylib2"],
4147 }
4148 }
4149 }
4150 }
4151 }
4152
4153 apex_key {
4154 name: "myapex.key",
4155 public_key: "testkey.avbpubkey",
4156 private_key: "testkey.pem",
4157 }
4158
4159 cc_library {
4160 name: "mylib",
4161 srcs: ["mylib.cpp"],
4162 system_shared_libs: [],
4163 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004164 // TODO: remove //apex_available:platform
4165 apex_available: [
4166 "//apex_available:platform",
4167 "myapex",
4168 ],
Alex Light9670d332019-01-29 18:07:33 -08004169 }
4170
4171 cc_library {
4172 name: "mylib_common",
4173 srcs: ["mylib.cpp"],
4174 system_shared_libs: [],
4175 stl: "none",
4176 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004177 // TODO: remove //apex_available:platform
4178 apex_available: [
4179 "//apex_available:platform",
4180 "myapex",
4181 ],
Alex Light9670d332019-01-29 18:07:33 -08004182 }
4183
4184 cc_library {
4185 name: "mylib2",
4186 srcs: ["mylib.cpp"],
4187 system_shared_libs: [],
4188 stl: "none",
4189 compile_multilib: "first",
4190 }
4191 `)
4192
Sundong Ahnabb64432019-10-22 13:58:29 +09004193 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004194 copyCmds := apexRule.Args["copy_commands"]
4195
4196 // Ensure that main rule creates an output
4197 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4198
4199 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004200 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4201 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4202 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004203
4204 // Ensure that both direct and indirect deps are copied into apex
4205 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4206 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4207 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4208
Colin Cross7113d202019-11-20 16:39:12 -08004209 // Ensure that the platform variant ends with _shared
4210 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4211 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4212 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004213}
Jiyong Park04480cf2019-02-06 00:16:29 +09004214
Jiyong Park59140302020-12-14 18:44:04 +09004215func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004216 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004217 apex {
4218 name: "myapex",
4219 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004220 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004221 arch: {
4222 arm64: {
4223 native_shared_libs: ["mylib.arm64"],
4224 },
4225 x86_64: {
4226 native_shared_libs: ["mylib.x64"],
4227 },
4228 }
4229 }
4230
4231 apex_key {
4232 name: "myapex.key",
4233 public_key: "testkey.avbpubkey",
4234 private_key: "testkey.pem",
4235 }
4236
4237 cc_library {
4238 name: "mylib.arm64",
4239 srcs: ["mylib.cpp"],
4240 system_shared_libs: [],
4241 stl: "none",
4242 // TODO: remove //apex_available:platform
4243 apex_available: [
4244 "//apex_available:platform",
4245 "myapex",
4246 ],
4247 }
4248
4249 cc_library {
4250 name: "mylib.x64",
4251 srcs: ["mylib.cpp"],
4252 system_shared_libs: [],
4253 stl: "none",
4254 // TODO: remove //apex_available:platform
4255 apex_available: [
4256 "//apex_available:platform",
4257 "myapex",
4258 ],
4259 }
4260 `)
4261
4262 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4263 copyCmds := apexRule.Args["copy_commands"]
4264
4265 // Ensure that apex variant is created for the direct dep
4266 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4267 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4268
4269 // Ensure that both direct and indirect deps are copied into apex
4270 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4271 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4272}
4273
Jiyong Park04480cf2019-02-06 00:16:29 +09004274func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004275 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004276 apex {
4277 name: "myapex",
4278 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004279 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004280 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004281 }
4282
4283 apex_key {
4284 name: "myapex.key",
4285 public_key: "testkey.avbpubkey",
4286 private_key: "testkey.pem",
4287 }
4288
4289 sh_binary {
4290 name: "myscript",
4291 src: "mylib.cpp",
4292 filename: "myscript.sh",
4293 sub_dir: "script",
4294 }
4295 `)
4296
Sundong Ahnabb64432019-10-22 13:58:29 +09004297 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004298 copyCmds := apexRule.Args["copy_commands"]
4299
4300 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4301}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004302
Jooyung Han91df2082019-11-20 01:49:42 +09004303func TestApexInVariousPartition(t *testing.T) {
4304 testcases := []struct {
4305 propName, parition, flattenedPartition string
4306 }{
4307 {"", "system", "system_ext"},
4308 {"product_specific: true", "product", "product"},
4309 {"soc_specific: true", "vendor", "vendor"},
4310 {"proprietary: true", "vendor", "vendor"},
4311 {"vendor: true", "vendor", "vendor"},
4312 {"system_ext_specific: true", "system_ext", "system_ext"},
4313 }
4314 for _, tc := range testcases {
4315 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004316 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004317 apex {
4318 name: "myapex",
4319 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004320 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004321 `+tc.propName+`
4322 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004323
Jooyung Han91df2082019-11-20 01:49:42 +09004324 apex_key {
4325 name: "myapex.key",
4326 public_key: "testkey.avbpubkey",
4327 private_key: "testkey.pem",
4328 }
4329 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004330
Jooyung Han91df2082019-11-20 01:49:42 +09004331 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004332 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4333 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004334 if actual != expected {
4335 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4336 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004337
Jooyung Han91df2082019-11-20 01:49:42 +09004338 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004339 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4340 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004341 if actual != expected {
4342 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4343 }
4344 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004345 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004346}
Jiyong Park67882562019-03-21 01:11:21 +09004347
Jooyung Han580eb4f2020-06-24 19:33:06 +09004348func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004349 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004350 apex {
4351 name: "myapex",
4352 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004353 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004354 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004355
Jooyung Han580eb4f2020-06-24 19:33:06 +09004356 apex_key {
4357 name: "myapex.key",
4358 public_key: "testkey.avbpubkey",
4359 private_key: "testkey.pem",
4360 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004361 `)
4362 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004363 rule := module.Output("file_contexts")
4364 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4365}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004366
Jooyung Han580eb4f2020-06-24 19:33:06 +09004367func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004368 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004369 apex {
4370 name: "myapex",
4371 key: "myapex.key",
4372 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004373 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004374 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004375
Jooyung Han580eb4f2020-06-24 19:33:06 +09004376 apex_key {
4377 name: "myapex.key",
4378 public_key: "testkey.avbpubkey",
4379 private_key: "testkey.pem",
4380 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004381 `, withFiles(map[string][]byte{
4382 "my_own_file_contexts": nil,
4383 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004384}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004385
Jooyung Han580eb4f2020-06-24 19:33:06 +09004386func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004387 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004388 apex {
4389 name: "myapex",
4390 key: "myapex.key",
4391 product_specific: true,
4392 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004393 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004394 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004395
Jooyung Han580eb4f2020-06-24 19:33:06 +09004396 apex_key {
4397 name: "myapex.key",
4398 public_key: "testkey.avbpubkey",
4399 private_key: "testkey.pem",
4400 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004401 `)
4402
Colin Cross1c460562021-02-16 17:55:47 -08004403 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004404 apex {
4405 name: "myapex",
4406 key: "myapex.key",
4407 product_specific: true,
4408 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004409 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004410 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004411
Jooyung Han580eb4f2020-06-24 19:33:06 +09004412 apex_key {
4413 name: "myapex.key",
4414 public_key: "testkey.avbpubkey",
4415 private_key: "testkey.pem",
4416 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004417 `, withFiles(map[string][]byte{
4418 "product_specific_file_contexts": nil,
4419 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004420 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4421 rule := module.Output("file_contexts")
4422 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4423}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004424
Jooyung Han580eb4f2020-06-24 19:33:06 +09004425func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004426 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004427 apex {
4428 name: "myapex",
4429 key: "myapex.key",
4430 product_specific: true,
4431 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004432 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004433 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004434
Jooyung Han580eb4f2020-06-24 19:33:06 +09004435 apex_key {
4436 name: "myapex.key",
4437 public_key: "testkey.avbpubkey",
4438 private_key: "testkey.pem",
4439 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004440
Jooyung Han580eb4f2020-06-24 19:33:06 +09004441 filegroup {
4442 name: "my-file-contexts",
4443 srcs: ["product_specific_file_contexts"],
4444 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004445 `, withFiles(map[string][]byte{
4446 "product_specific_file_contexts": nil,
4447 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004448 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4449 rule := module.Output("file_contexts")
4450 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004451}
4452
Jiyong Park67882562019-03-21 01:11:21 +09004453func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004454 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004455 apex_key {
4456 name: "myapex.key",
4457 public_key: ":my.avbpubkey",
4458 private_key: ":my.pem",
4459 product_specific: true,
4460 }
4461
4462 filegroup {
4463 name: "my.avbpubkey",
4464 srcs: ["testkey2.avbpubkey"],
4465 }
4466
4467 filegroup {
4468 name: "my.pem",
4469 srcs: ["testkey2.pem"],
4470 }
4471 `)
4472
4473 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4474 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004475 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004476 if actual_pubkey != expected_pubkey {
4477 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4478 }
4479 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004480 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004481 if actual_privkey != expected_privkey {
4482 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4483 }
4484}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004485
4486func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004487 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004488 prebuilt_apex {
4489 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004490 arch: {
4491 arm64: {
4492 src: "myapex-arm64.apex",
4493 },
4494 arm: {
4495 src: "myapex-arm.apex",
4496 },
4497 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004498 }
4499 `)
4500
Paul Duffin6717d882021-06-15 19:09:41 +01004501 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004502
Jiyong Parkc95714e2019-03-29 14:23:10 +09004503 expectedInput := "myapex-arm64.apex"
4504 if prebuilt.inputApex.String() != expectedInput {
4505 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4506 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004507}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004508
Paul Duffinc0609c62021-03-01 17:27:16 +00004509func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004510 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004511 prebuilt_apex {
4512 name: "myapex",
4513 }
4514 `)
4515}
4516
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004517func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004518 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004519 prebuilt_apex {
4520 name: "myapex",
4521 src: "myapex-arm.apex",
4522 filename: "notmyapex.apex",
4523 }
4524 `)
4525
Paul Duffin6717d882021-06-15 19:09:41 +01004526 p := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004527
4528 expected := "notmyapex.apex"
4529 if p.installFilename != expected {
4530 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4531 }
4532}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004533
Samiul Islam7c02e262021-09-08 17:48:28 +01004534func TestApexSetFilenameOverride(t *testing.T) {
4535 testApex(t, `
4536 apex_set {
4537 name: "com.company.android.myapex",
4538 apex_name: "com.android.myapex",
4539 set: "company-myapex.apks",
4540 filename: "com.company.android.myapex.apex"
4541 }
4542 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4543
4544 testApex(t, `
4545 apex_set {
4546 name: "com.company.android.myapex",
4547 apex_name: "com.android.myapex",
4548 set: "company-myapex.apks",
4549 filename: "com.company.android.myapex.capex"
4550 }
4551 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4552
4553 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4554 apex_set {
4555 name: "com.company.android.myapex",
4556 apex_name: "com.android.myapex",
4557 set: "company-myapex.apks",
4558 filename: "some-random-suffix"
4559 }
4560 `)
4561}
4562
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004563func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004564 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004565 prebuilt_apex {
4566 name: "myapex.prebuilt",
4567 src: "myapex-arm.apex",
4568 overrides: [
4569 "myapex",
4570 ],
4571 }
4572 `)
4573
Paul Duffin6717d882021-06-15 19:09:41 +01004574 p := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt").Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004575
4576 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004577 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004578 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004579 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004580 }
4581}
4582
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004583func TestPrebuiltApexName(t *testing.T) {
4584 testApex(t, `
4585 prebuilt_apex {
4586 name: "com.company.android.myapex",
4587 apex_name: "com.android.myapex",
4588 src: "company-myapex-arm.apex",
4589 }
4590 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4591
4592 testApex(t, `
4593 apex_set {
4594 name: "com.company.android.myapex",
4595 apex_name: "com.android.myapex",
4596 set: "company-myapex.apks",
4597 }
4598 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4599}
4600
4601func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4602 _ = android.GroupFixturePreparers(
4603 java.PrepareForTestWithJavaDefaultModules,
4604 PrepareForTestWithApexBuildComponents,
4605 android.FixtureWithRootAndroidBp(`
4606 platform_bootclasspath {
4607 name: "platform-bootclasspath",
4608 fragments: [
4609 {
4610 apex: "com.android.art",
4611 module: "art-bootclasspath-fragment",
4612 },
4613 ],
4614 }
4615
4616 prebuilt_apex {
4617 name: "com.company.android.art",
4618 apex_name: "com.android.art",
4619 src: "com.company.android.art-arm.apex",
4620 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4621 }
4622
4623 prebuilt_bootclasspath_fragment {
4624 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004625 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004626 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004627 hidden_api: {
4628 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4629 metadata: "my-bootclasspath-fragment/metadata.csv",
4630 index: "my-bootclasspath-fragment/index.csv",
4631 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4632 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4633 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004634 }
4635
4636 java_import {
4637 name: "core-oj",
4638 jars: ["prebuilt.jar"],
4639 }
4640 `),
4641 ).RunTest(t)
4642}
4643
Paul Duffin092153d2021-01-26 11:42:39 +00004644// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4645// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004646func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004647 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004648
Paul Duffin89886cb2021-02-05 16:44:03 +00004649 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004650 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004651 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004652 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004653 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004654 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004655 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4656 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4657 android.NormalizePathForTesting(dexJarBuildPath))
4658 }
4659
4660 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004661 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004662 // Make sure the import has been given the correct path to the dex jar.
4663 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4664 dexJarBuildPath := p.DexJarInstallPath()
4665 stem := android.RemoveOptionalPrebuiltPrefix(name)
4666 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4667 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4668 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004669 }
4670
Paul Duffin39853512021-02-26 11:09:39 +00004671 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004672 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004673 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004674 android.AssertArrayString(t, "Check if there is no source variant",
4675 []string{"android_common"},
4676 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004677 }
4678
4679 t.Run("prebuilt only", func(t *testing.T) {
4680 bp := `
4681 prebuilt_apex {
4682 name: "myapex",
4683 arch: {
4684 arm64: {
4685 src: "myapex-arm64.apex",
4686 },
4687 arm: {
4688 src: "myapex-arm.apex",
4689 },
4690 },
Paul Duffin39853512021-02-26 11:09:39 +00004691 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004692 }
4693
4694 java_import {
4695 name: "libfoo",
4696 jars: ["libfoo.jar"],
4697 }
Paul Duffin39853512021-02-26 11:09:39 +00004698
4699 java_sdk_library_import {
4700 name: "libbar",
4701 public: {
4702 jars: ["libbar.jar"],
4703 },
4704 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004705 `
4706
4707 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4708 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4709
Martin Stjernholm44825602021-09-17 01:44:12 +01004710 deapexerName := deapexerModuleName("myapex")
4711 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4712
Paul Duffinf6932af2021-02-26 18:21:56 +00004713 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004714 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004715 rule := deapexer.Rule("deapexer")
4716 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4717 t.Errorf("expected: %q, found: %q", expected, actual)
4718 }
4719
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004720 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004721 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004722 rule = prebuiltApex.Rule("android/soong/android.Cp")
4723 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4724 t.Errorf("expected: %q, found: %q", expected, actual)
4725 }
4726
Paul Duffin89886cb2021-02-05 16:44:03 +00004727 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004728 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004729
4730 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004731 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004732 })
4733
4734 t.Run("prebuilt with source preferred", func(t *testing.T) {
4735
4736 bp := `
4737 prebuilt_apex {
4738 name: "myapex",
4739 arch: {
4740 arm64: {
4741 src: "myapex-arm64.apex",
4742 },
4743 arm: {
4744 src: "myapex-arm.apex",
4745 },
4746 },
Paul Duffin39853512021-02-26 11:09:39 +00004747 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004748 }
4749
4750 java_import {
4751 name: "libfoo",
4752 jars: ["libfoo.jar"],
4753 }
4754
4755 java_library {
4756 name: "libfoo",
4757 }
Paul Duffin39853512021-02-26 11:09:39 +00004758
4759 java_sdk_library_import {
4760 name: "libbar",
4761 public: {
4762 jars: ["libbar.jar"],
4763 },
4764 }
4765
4766 java_sdk_library {
4767 name: "libbar",
4768 srcs: ["foo/bar/MyClass.java"],
4769 unsafe_ignore_missing_latest_api: true,
4770 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004771 `
4772
4773 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4774 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4775
Paul Duffin89886cb2021-02-05 16:44:03 +00004776 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004777 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004778 ensureNoSourceVariant(t, ctx, "libfoo")
4779
4780 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004781 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004782 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004783 })
4784
4785 t.Run("prebuilt preferred with source", func(t *testing.T) {
4786 bp := `
4787 prebuilt_apex {
4788 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004789 arch: {
4790 arm64: {
4791 src: "myapex-arm64.apex",
4792 },
4793 arm: {
4794 src: "myapex-arm.apex",
4795 },
4796 },
Paul Duffin39853512021-02-26 11:09:39 +00004797 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004798 }
4799
4800 java_import {
4801 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004802 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004803 jars: ["libfoo.jar"],
4804 }
4805
4806 java_library {
4807 name: "libfoo",
4808 }
Paul Duffin39853512021-02-26 11:09:39 +00004809
4810 java_sdk_library_import {
4811 name: "libbar",
4812 prefer: true,
4813 public: {
4814 jars: ["libbar.jar"],
4815 },
4816 }
4817
4818 java_sdk_library {
4819 name: "libbar",
4820 srcs: ["foo/bar/MyClass.java"],
4821 unsafe_ignore_missing_latest_api: true,
4822 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004823 `
4824
4825 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4826 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4827
Paul Duffin89886cb2021-02-05 16:44:03 +00004828 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004829 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004830 ensureNoSourceVariant(t, ctx, "libfoo")
4831
4832 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004833 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004834 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004835 })
4836}
4837
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004838func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004839 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004840 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004841 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4842 // is disabled.
4843 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4844 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004845
Paul Duffin37856732021-02-26 14:24:15 +00004846 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4847 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004848 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004849 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004850 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004851 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004852 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004853 foundLibfooJar = true
4854 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004855 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004856 }
4857 }
4858 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004859 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 +00004860 }
4861 }
4862
Paul Duffin40a3f652021-07-19 13:11:24 +01004863 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004864 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004865 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004866 var rule android.TestingBuildParams
4867
4868 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4869 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004870 }
4871
Paul Duffin40a3f652021-07-19 13:11:24 +01004872 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4873 t.Helper()
4874 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4875 var rule android.TestingBuildParams
4876
4877 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4878 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4879 }
4880
Paul Duffin89f570a2021-06-16 01:42:33 +01004881 fragment := java.ApexVariantReference{
4882 Apex: proptools.StringPtr("myapex"),
4883 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4884 }
4885
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004886 t.Run("prebuilt only", func(t *testing.T) {
4887 bp := `
4888 prebuilt_apex {
4889 name: "myapex",
4890 arch: {
4891 arm64: {
4892 src: "myapex-arm64.apex",
4893 },
4894 arm: {
4895 src: "myapex-arm.apex",
4896 },
4897 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004898 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4899 }
4900
4901 prebuilt_bootclasspath_fragment {
4902 name: "my-bootclasspath-fragment",
4903 contents: ["libfoo", "libbar"],
4904 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004905 hidden_api: {
4906 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4907 metadata: "my-bootclasspath-fragment/metadata.csv",
4908 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004909 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4910 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4911 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004912 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004913 }
4914
4915 java_import {
4916 name: "libfoo",
4917 jars: ["libfoo.jar"],
4918 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004919 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004920 }
Paul Duffin37856732021-02-26 14:24:15 +00004921
4922 java_sdk_library_import {
4923 name: "libbar",
4924 public: {
4925 jars: ["libbar.jar"],
4926 },
4927 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004928 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01004929 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00004930 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004931 `
4932
Paul Duffin89f570a2021-06-16 01:42:33 +01004933 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01004934 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4935 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004936
Paul Duffin537ea3d2021-05-14 10:38:00 +01004937 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01004938 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01004939 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01004940 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01004941 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
4942 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004943 })
4944
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004945 t.Run("apex_set only", func(t *testing.T) {
4946 bp := `
4947 apex_set {
4948 name: "myapex",
4949 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01004950 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4951 }
4952
4953 prebuilt_bootclasspath_fragment {
4954 name: "my-bootclasspath-fragment",
4955 contents: ["libfoo", "libbar"],
4956 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004957 hidden_api: {
4958 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4959 metadata: "my-bootclasspath-fragment/metadata.csv",
4960 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004961 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4962 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4963 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004964 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004965 }
4966
4967 java_import {
4968 name: "libfoo",
4969 jars: ["libfoo.jar"],
4970 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004971 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004972 }
4973
4974 java_sdk_library_import {
4975 name: "libbar",
4976 public: {
4977 jars: ["libbar.jar"],
4978 },
4979 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004980 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01004981 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004982 }
4983 `
4984
Paul Duffin89f570a2021-06-16 01:42:33 +01004985 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004986 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4987 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
4988
Paul Duffin537ea3d2021-05-14 10:38:00 +01004989 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01004990 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01004991 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01004992 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01004993 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
4994 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004995 })
4996
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004997 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4998 bp := `
4999 prebuilt_apex {
5000 name: "myapex",
5001 arch: {
5002 arm64: {
5003 src: "myapex-arm64.apex",
5004 },
5005 arm: {
5006 src: "myapex-arm.apex",
5007 },
5008 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005009 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5010 }
5011
5012 prebuilt_bootclasspath_fragment {
5013 name: "my-bootclasspath-fragment",
5014 contents: ["libfoo", "libbar"],
5015 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005016 hidden_api: {
5017 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5018 metadata: "my-bootclasspath-fragment/metadata.csv",
5019 index: "my-bootclasspath-fragment/index.csv",
5020 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5021 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5022 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005023 }
5024
5025 java_import {
5026 name: "libfoo",
5027 jars: ["libfoo.jar"],
5028 apex_available: ["myapex"],
5029 }
5030
5031 java_library {
5032 name: "libfoo",
5033 srcs: ["foo/bar/MyClass.java"],
5034 apex_available: ["myapex"],
5035 }
Paul Duffin37856732021-02-26 14:24:15 +00005036
5037 java_sdk_library_import {
5038 name: "libbar",
5039 public: {
5040 jars: ["libbar.jar"],
5041 },
5042 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005043 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005044 }
5045
5046 java_sdk_library {
5047 name: "libbar",
5048 srcs: ["foo/bar/MyClass.java"],
5049 unsafe_ignore_missing_latest_api: true,
5050 apex_available: ["myapex"],
5051 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005052 `
5053
5054 // In this test the source (java_library) libfoo is active since the
5055 // prebuilt (java_import) defaults to prefer:false. However the
5056 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5057 // find the dex boot jar in it. We either need to disable the source libfoo
5058 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005059 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005060 // dexbootjar check is skipped if AllowMissingDependencies is true
5061 preparerAllowMissingDeps := android.GroupFixturePreparers(
5062 preparer,
5063 android.PrepareForTestWithAllowMissingDependencies,
5064 )
5065 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005066 })
5067
5068 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5069 bp := `
5070 prebuilt_apex {
5071 name: "myapex",
5072 arch: {
5073 arm64: {
5074 src: "myapex-arm64.apex",
5075 },
5076 arm: {
5077 src: "myapex-arm.apex",
5078 },
5079 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005080 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5081 }
5082
5083 prebuilt_bootclasspath_fragment {
5084 name: "my-bootclasspath-fragment",
5085 contents: ["libfoo", "libbar"],
5086 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005087 hidden_api: {
5088 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5089 metadata: "my-bootclasspath-fragment/metadata.csv",
5090 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005091 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5092 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5093 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005094 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005095 }
5096
5097 java_import {
5098 name: "libfoo",
5099 prefer: true,
5100 jars: ["libfoo.jar"],
5101 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005102 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005103 }
5104
5105 java_library {
5106 name: "libfoo",
5107 srcs: ["foo/bar/MyClass.java"],
5108 apex_available: ["myapex"],
5109 }
Paul Duffin37856732021-02-26 14:24:15 +00005110
5111 java_sdk_library_import {
5112 name: "libbar",
5113 prefer: true,
5114 public: {
5115 jars: ["libbar.jar"],
5116 },
5117 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005118 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005119 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005120 }
5121
5122 java_sdk_library {
5123 name: "libbar",
5124 srcs: ["foo/bar/MyClass.java"],
5125 unsafe_ignore_missing_latest_api: true,
5126 apex_available: ["myapex"],
5127 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005128 `
5129
Paul Duffin89f570a2021-06-16 01:42:33 +01005130 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005131 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5132 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005133
Paul Duffin537ea3d2021-05-14 10:38:00 +01005134 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005135 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005136 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005137 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005138 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5139 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005140 })
5141
5142 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5143 bp := `
5144 apex {
5145 name: "myapex",
5146 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005147 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005148 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005149 }
5150
5151 apex_key {
5152 name: "myapex.key",
5153 public_key: "testkey.avbpubkey",
5154 private_key: "testkey.pem",
5155 }
5156
5157 prebuilt_apex {
5158 name: "myapex",
5159 arch: {
5160 arm64: {
5161 src: "myapex-arm64.apex",
5162 },
5163 arm: {
5164 src: "myapex-arm.apex",
5165 },
5166 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005167 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5168 }
5169
5170 prebuilt_bootclasspath_fragment {
5171 name: "my-bootclasspath-fragment",
5172 contents: ["libfoo", "libbar"],
5173 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005174 hidden_api: {
5175 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5176 metadata: "my-bootclasspath-fragment/metadata.csv",
5177 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005178 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5179 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5180 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005181 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005182 }
5183
5184 java_import {
5185 name: "libfoo",
5186 jars: ["libfoo.jar"],
5187 apex_available: ["myapex"],
5188 }
5189
5190 java_library {
5191 name: "libfoo",
5192 srcs: ["foo/bar/MyClass.java"],
5193 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005194 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005195 }
Paul Duffin37856732021-02-26 14:24:15 +00005196
5197 java_sdk_library_import {
5198 name: "libbar",
5199 public: {
5200 jars: ["libbar.jar"],
5201 },
5202 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005203 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005204 }
5205
5206 java_sdk_library {
5207 name: "libbar",
5208 srcs: ["foo/bar/MyClass.java"],
5209 unsafe_ignore_missing_latest_api: true,
5210 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005211 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005212 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005213 `
5214
Paul Duffin89f570a2021-06-16 01:42:33 +01005215 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005216 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5217 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005218
Paul Duffin537ea3d2021-05-14 10:38:00 +01005219 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005220 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005221 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005222 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005223 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5224 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005225 })
5226
5227 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5228 bp := `
5229 apex {
5230 name: "myapex",
5231 enabled: false,
5232 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005233 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005234 }
5235
5236 apex_key {
5237 name: "myapex.key",
5238 public_key: "testkey.avbpubkey",
5239 private_key: "testkey.pem",
5240 }
5241
5242 prebuilt_apex {
5243 name: "myapex",
5244 arch: {
5245 arm64: {
5246 src: "myapex-arm64.apex",
5247 },
5248 arm: {
5249 src: "myapex-arm.apex",
5250 },
5251 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005252 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5253 }
5254
5255 prebuilt_bootclasspath_fragment {
5256 name: "my-bootclasspath-fragment",
5257 contents: ["libfoo", "libbar"],
5258 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005259 hidden_api: {
5260 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5261 metadata: "my-bootclasspath-fragment/metadata.csv",
5262 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005263 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5264 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5265 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005266 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005267 }
5268
5269 java_import {
5270 name: "libfoo",
5271 prefer: true,
5272 jars: ["libfoo.jar"],
5273 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005274 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005275 }
5276
5277 java_library {
5278 name: "libfoo",
5279 srcs: ["foo/bar/MyClass.java"],
5280 apex_available: ["myapex"],
5281 }
Paul Duffin37856732021-02-26 14:24:15 +00005282
5283 java_sdk_library_import {
5284 name: "libbar",
5285 prefer: true,
5286 public: {
5287 jars: ["libbar.jar"],
5288 },
5289 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005290 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005291 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005292 }
5293
5294 java_sdk_library {
5295 name: "libbar",
5296 srcs: ["foo/bar/MyClass.java"],
5297 unsafe_ignore_missing_latest_api: true,
5298 apex_available: ["myapex"],
5299 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005300 `
5301
Paul Duffin89f570a2021-06-16 01:42:33 +01005302 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005303 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5304 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005305
Paul Duffin537ea3d2021-05-14 10:38:00 +01005306 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005307 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005308 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005309 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005310 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5311 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005312 })
5313}
5314
Roland Levillain630846d2019-06-26 12:48:34 +01005315func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005316 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005317 apex_test {
5318 name: "myapex",
5319 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005320 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005321 tests: [
5322 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005323 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005324 ],
5325 }
5326
5327 apex_key {
5328 name: "myapex.key",
5329 public_key: "testkey.avbpubkey",
5330 private_key: "testkey.pem",
5331 }
5332
Liz Kammer1c14a212020-05-12 15:26:55 -07005333 filegroup {
5334 name: "fg",
5335 srcs: [
5336 "baz",
5337 "bar/baz"
5338 ],
5339 }
5340
Roland Levillain630846d2019-06-26 12:48:34 +01005341 cc_test {
5342 name: "mytest",
5343 gtest: false,
5344 srcs: ["mytest.cpp"],
5345 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005346 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005347 system_shared_libs: [],
5348 static_executable: true,
5349 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005350 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005351 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005352
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005353 cc_library {
5354 name: "mylib",
5355 srcs: ["mylib.cpp"],
5356 system_shared_libs: [],
5357 stl: "none",
5358 }
5359
Liz Kammer5bd365f2020-05-27 15:15:11 -07005360 filegroup {
5361 name: "fg2",
5362 srcs: [
5363 "testdata/baz"
5364 ],
5365 }
5366
Roland Levillain9b5fde92019-06-28 15:41:19 +01005367 cc_test {
5368 name: "mytests",
5369 gtest: false,
5370 srcs: [
5371 "mytest1.cpp",
5372 "mytest2.cpp",
5373 "mytest3.cpp",
5374 ],
5375 test_per_src: true,
5376 relative_install_path: "test",
5377 system_shared_libs: [],
5378 static_executable: true,
5379 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005380 data: [
5381 ":fg",
5382 ":fg2",
5383 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005384 }
Roland Levillain630846d2019-06-26 12:48:34 +01005385 `)
5386
Sundong Ahnabb64432019-10-22 13:58:29 +09005387 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005388 copyCmds := apexRule.Args["copy_commands"]
5389
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005390 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005391 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005392 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005393
Liz Kammer1c14a212020-05-12 15:26:55 -07005394 //Ensure that test data are copied into apex.
5395 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5396 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5397
Roland Levillain9b5fde92019-06-28 15:41:19 +01005398 // Ensure that test deps built with `test_per_src` are copied into apex.
5399 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5400 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5401 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005402
5403 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005404 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005405 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005406 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005407 prefix := "TARGET_"
5408 var builder strings.Builder
5409 data.Custom(&builder, name, prefix, "", data)
5410 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005411 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5412 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5413 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5414 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005415 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005416 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005417 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005418
5419 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005420 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005421 data.Custom(&builder, name, prefix, "", data)
5422 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005423 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5424 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005425}
5426
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005427func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005428 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005429 apex {
5430 name: "myapex",
5431 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005432 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005433 }
5434 apex_key {
5435 name: "myapex.key",
5436 public_key: "testkey.avbpubkey",
5437 private_key: "testkey.pem",
5438 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005439 `,
5440 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5441 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5442 }),
5443 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005444 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005445 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005446 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005447 var builder strings.Builder
5448 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5449 androidMk := builder.String()
5450 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5451}
5452
Jooyung Hand48f3c32019-08-23 11:18:57 +09005453func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5454 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5455 apex {
5456 name: "myapex",
5457 key: "myapex.key",
5458 native_shared_libs: ["libfoo"],
5459 }
5460
5461 apex_key {
5462 name: "myapex.key",
5463 public_key: "testkey.avbpubkey",
5464 private_key: "testkey.pem",
5465 }
5466
5467 cc_library {
5468 name: "libfoo",
5469 stl: "none",
5470 system_shared_libs: [],
5471 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005472 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005473 }
5474 `)
5475 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5476 apex {
5477 name: "myapex",
5478 key: "myapex.key",
5479 java_libs: ["myjar"],
5480 }
5481
5482 apex_key {
5483 name: "myapex.key",
5484 public_key: "testkey.avbpubkey",
5485 private_key: "testkey.pem",
5486 }
5487
5488 java_library {
5489 name: "myjar",
5490 srcs: ["foo/bar/MyClass.java"],
5491 sdk_version: "none",
5492 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005493 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005494 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005495 }
5496 `)
5497}
5498
Bill Peckhama41a6962021-01-11 10:58:54 -08005499func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005500 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005501 apex {
5502 name: "myapex",
5503 key: "myapex.key",
5504 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005505 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005506 }
5507
5508 apex_key {
5509 name: "myapex.key",
5510 public_key: "testkey.avbpubkey",
5511 private_key: "testkey.pem",
5512 }
5513
5514 java_import {
5515 name: "myjavaimport",
5516 apex_available: ["myapex"],
5517 jars: ["my.jar"],
5518 compile_dex: true,
5519 }
5520 `)
5521
5522 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5523 apexRule := module.Rule("apexRule")
5524 copyCmds := apexRule.Args["copy_commands"]
5525 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5526}
5527
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005528func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005529 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005530 apex {
5531 name: "myapex",
5532 key: "myapex.key",
5533 apps: [
5534 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005535 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005536 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005537 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005538 }
5539
5540 apex_key {
5541 name: "myapex.key",
5542 public_key: "testkey.avbpubkey",
5543 private_key: "testkey.pem",
5544 }
5545
5546 android_app {
5547 name: "AppFoo",
5548 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005549 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005550 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005551 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005552 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005553 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005554 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005555
5556 android_app {
5557 name: "AppFooPriv",
5558 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005559 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005560 system_modules: "none",
5561 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005562 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005563 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005564 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005565
5566 cc_library_shared {
5567 name: "libjni",
5568 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005569 shared_libs: ["libfoo"],
5570 stl: "none",
5571 system_shared_libs: [],
5572 apex_available: [ "myapex" ],
5573 sdk_version: "current",
5574 }
5575
5576 cc_library_shared {
5577 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005578 stl: "none",
5579 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005580 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005581 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005582 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005583 `)
5584
Sundong Ahnabb64432019-10-22 13:58:29 +09005585 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005586 apexRule := module.Rule("apexRule")
5587 copyCmds := apexRule.Args["copy_commands"]
5588
5589 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005590 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005591
Colin Crossaede88c2020-08-11 12:17:01 -07005592 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005593 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005594 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005595 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005596 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005597 // JNI libraries including transitive deps are
5598 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005599 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005600 // ... embedded inside APK (jnilibs.zip)
5601 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5602 // ... and not directly inside the APEX
5603 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5604 }
Dario Frenicde2a032019-10-27 00:29:22 +01005605}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005606
Dario Frenicde2a032019-10-27 00:29:22 +01005607func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005608 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005609 apex {
5610 name: "myapex",
5611 key: "myapex.key",
5612 apps: [
5613 "AppFooPrebuilt",
5614 "AppFooPrivPrebuilt",
5615 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005616 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005617 }
5618
5619 apex_key {
5620 name: "myapex.key",
5621 public_key: "testkey.avbpubkey",
5622 private_key: "testkey.pem",
5623 }
5624
5625 android_app_import {
5626 name: "AppFooPrebuilt",
5627 apk: "PrebuiltAppFoo.apk",
5628 presigned: true,
5629 dex_preopt: {
5630 enabled: false,
5631 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005632 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005633 }
5634
5635 android_app_import {
5636 name: "AppFooPrivPrebuilt",
5637 apk: "PrebuiltAppFooPriv.apk",
5638 privileged: true,
5639 presigned: true,
5640 dex_preopt: {
5641 enabled: false,
5642 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005643 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005644 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005645 }
5646 `)
5647
Sundong Ahnabb64432019-10-22 13:58:29 +09005648 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005649 apexRule := module.Rule("apexRule")
5650 copyCmds := apexRule.Args["copy_commands"]
5651
5652 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005653 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5654}
5655
5656func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005657 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005658 apex {
5659 name: "myapex",
5660 key: "myapex.key",
5661 apps: [
5662 "AppFoo",
5663 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005664 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005665 }
5666
5667 apex_key {
5668 name: "myapex.key",
5669 public_key: "testkey.avbpubkey",
5670 private_key: "testkey.pem",
5671 }
5672
5673 android_app {
5674 name: "AppFoo",
5675 srcs: ["foo/bar/MyClass.java"],
5676 sdk_version: "none",
5677 system_modules: "none",
5678 apex_available: [ "myapex" ],
5679 }
5680
5681 android_app_import {
5682 name: "AppFoo",
5683 apk: "AppFooPrebuilt.apk",
5684 filename: "AppFooPrebuilt.apk",
5685 presigned: true,
5686 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005687 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005688 }
5689 `, withFiles(map[string][]byte{
5690 "AppFooPrebuilt.apk": nil,
5691 }))
5692
5693 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005694 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005695 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005696}
5697
Dario Freni6f3937c2019-12-20 22:58:03 +00005698func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005699 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005700 apex {
5701 name: "myapex",
5702 key: "myapex.key",
5703 apps: [
5704 "TesterHelpAppFoo",
5705 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005706 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005707 }
5708
5709 apex_key {
5710 name: "myapex.key",
5711 public_key: "testkey.avbpubkey",
5712 private_key: "testkey.pem",
5713 }
5714
5715 android_test_helper_app {
5716 name: "TesterHelpAppFoo",
5717 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005718 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005719 }
5720
5721 `)
5722
5723 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5724 apexRule := module.Rule("apexRule")
5725 copyCmds := apexRule.Args["copy_commands"]
5726
5727 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5728}
5729
Jooyung Han18020ea2019-11-13 10:50:48 +09005730func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5731 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005732 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005733 apex {
5734 name: "myapex",
5735 key: "myapex.key",
5736 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005737 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005738 }
5739
5740 apex_key {
5741 name: "myapex.key",
5742 public_key: "testkey.avbpubkey",
5743 private_key: "testkey.pem",
5744 }
5745
5746 apex {
5747 name: "otherapex",
5748 key: "myapex.key",
5749 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005750 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005751 }
5752
5753 cc_defaults {
5754 name: "libfoo-defaults",
5755 apex_available: ["otherapex"],
5756 }
5757
5758 cc_library {
5759 name: "libfoo",
5760 defaults: ["libfoo-defaults"],
5761 stl: "none",
5762 system_shared_libs: [],
5763 }`)
5764}
5765
Paul Duffine52e66f2020-03-30 17:54:29 +01005766func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005767 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005768 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005769 apex {
5770 name: "myapex",
5771 key: "myapex.key",
5772 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005773 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005774 }
5775
5776 apex_key {
5777 name: "myapex.key",
5778 public_key: "testkey.avbpubkey",
5779 private_key: "testkey.pem",
5780 }
5781
5782 apex {
5783 name: "otherapex",
5784 key: "otherapex.key",
5785 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005786 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005787 }
5788
5789 apex_key {
5790 name: "otherapex.key",
5791 public_key: "testkey.avbpubkey",
5792 private_key: "testkey.pem",
5793 }
5794
5795 cc_library {
5796 name: "libfoo",
5797 stl: "none",
5798 system_shared_libs: [],
5799 apex_available: ["otherapex"],
5800 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005801}
Jiyong Park127b40b2019-09-30 16:04:35 +09005802
Paul Duffine52e66f2020-03-30 17:54:29 +01005803func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005804 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005805 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005806.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005807.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005808.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005809.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005810.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005811.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005812 apex {
5813 name: "myapex",
5814 key: "myapex.key",
5815 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005816 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005817 }
5818
5819 apex_key {
5820 name: "myapex.key",
5821 public_key: "testkey.avbpubkey",
5822 private_key: "testkey.pem",
5823 }
5824
Jiyong Park127b40b2019-09-30 16:04:35 +09005825 cc_library {
5826 name: "libfoo",
5827 stl: "none",
5828 shared_libs: ["libbar"],
5829 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005830 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005831 }
5832
5833 cc_library {
5834 name: "libbar",
5835 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005836 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005837 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005838 apex_available: ["myapex"],
5839 }
5840
5841 cc_library {
5842 name: "libbaz",
5843 stl: "none",
5844 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005845 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005846}
Jiyong Park127b40b2019-09-30 16:04:35 +09005847
Paul Duffine52e66f2020-03-30 17:54:29 +01005848func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005849 testApexError(t, "\"otherapex\" is not a valid module name", `
5850 apex {
5851 name: "myapex",
5852 key: "myapex.key",
5853 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005854 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005855 }
5856
5857 apex_key {
5858 name: "myapex.key",
5859 public_key: "testkey.avbpubkey",
5860 private_key: "testkey.pem",
5861 }
5862
5863 cc_library {
5864 name: "libfoo",
5865 stl: "none",
5866 system_shared_libs: [],
5867 apex_available: ["otherapex"],
5868 }`)
5869
Paul Duffine52e66f2020-03-30 17:54:29 +01005870 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005871 apex {
5872 name: "myapex",
5873 key: "myapex.key",
5874 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005875 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005876 }
5877
5878 apex_key {
5879 name: "myapex.key",
5880 public_key: "testkey.avbpubkey",
5881 private_key: "testkey.pem",
5882 }
5883
5884 cc_library {
5885 name: "libfoo",
5886 stl: "none",
5887 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005888 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005889 apex_available: ["myapex"],
5890 }
5891
5892 cc_library {
5893 name: "libbar",
5894 stl: "none",
5895 system_shared_libs: [],
5896 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005897 }
5898
5899 cc_library {
5900 name: "libbaz",
5901 stl: "none",
5902 system_shared_libs: [],
5903 stubs: {
5904 versions: ["10", "20", "30"],
5905 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005906 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005907}
Jiyong Park127b40b2019-09-30 16:04:35 +09005908
Jiyong Park89e850a2020-04-07 16:37:39 +09005909func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005910 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005911 apex {
5912 name: "myapex",
5913 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005914 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005915 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005916 }
5917
5918 apex_key {
5919 name: "myapex.key",
5920 public_key: "testkey.avbpubkey",
5921 private_key: "testkey.pem",
5922 }
5923
5924 cc_library {
5925 name: "libfoo",
5926 stl: "none",
5927 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005928 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005929 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005930 }
5931
5932 cc_library {
5933 name: "libfoo2",
5934 stl: "none",
5935 system_shared_libs: [],
5936 shared_libs: ["libbaz"],
5937 apex_available: ["//apex_available:platform"],
5938 }
5939
5940 cc_library {
5941 name: "libbar",
5942 stl: "none",
5943 system_shared_libs: [],
5944 apex_available: ["myapex"],
5945 }
5946
5947 cc_library {
5948 name: "libbaz",
5949 stl: "none",
5950 system_shared_libs: [],
5951 apex_available: ["myapex"],
5952 stubs: {
5953 versions: ["1"],
5954 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005955 }`)
5956
Jiyong Park89e850a2020-04-07 16:37:39 +09005957 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5958 // because it depends on libbar which isn't available to platform
5959 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5960 if libfoo.NotAvailableForPlatform() != true {
5961 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5962 }
5963
5964 // libfoo2 however can be available to platform because it depends on libbaz which provides
5965 // stubs
5966 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5967 if libfoo2.NotAvailableForPlatform() == true {
5968 t.Errorf("%q should be available to platform", libfoo2.String())
5969 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005970}
Jiyong Parka90ca002019-10-07 15:47:24 +09005971
Paul Duffine52e66f2020-03-30 17:54:29 +01005972func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005973 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005974 apex {
5975 name: "myapex",
5976 key: "myapex.key",
5977 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005978 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09005979 }
5980
5981 apex_key {
5982 name: "myapex.key",
5983 public_key: "testkey.avbpubkey",
5984 private_key: "testkey.pem",
5985 }
5986
5987 cc_library {
5988 name: "libfoo",
5989 stl: "none",
5990 system_shared_libs: [],
5991 apex_available: ["myapex"],
5992 static: {
5993 apex_available: ["//apex_available:platform"],
5994 },
5995 }`)
5996
Jiyong Park89e850a2020-04-07 16:37:39 +09005997 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5998 if libfooShared.NotAvailableForPlatform() != true {
5999 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6000 }
6001 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6002 if libfooStatic.NotAvailableForPlatform() != false {
6003 t.Errorf("%q should be available to platform", libfooStatic.String())
6004 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006005}
6006
Jiyong Park5d790c32019-11-15 18:40:32 +09006007func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006008 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006009 apex {
6010 name: "myapex",
6011 key: "myapex.key",
6012 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006013 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006014 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006015 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006016 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006017 }
6018
6019 override_apex {
6020 name: "override_myapex",
6021 base: "myapex",
6022 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08006023 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006024 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006025 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006026 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006027 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006028 key: "mynewapex.key",
6029 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006030 }
6031
6032 apex_key {
6033 name: "myapex.key",
6034 public_key: "testkey.avbpubkey",
6035 private_key: "testkey.pem",
6036 }
6037
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006038 apex_key {
6039 name: "mynewapex.key",
6040 public_key: "testkey2.avbpubkey",
6041 private_key: "testkey2.pem",
6042 }
6043
6044 android_app_certificate {
6045 name: "myapex.certificate",
6046 certificate: "testkey",
6047 }
6048
Jiyong Park5d790c32019-11-15 18:40:32 +09006049 android_app {
6050 name: "app",
6051 srcs: ["foo/bar/MyClass.java"],
6052 package_name: "foo",
6053 sdk_version: "none",
6054 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006055 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006056 }
6057
6058 override_android_app {
6059 name: "override_app",
6060 base: "app",
6061 package_name: "bar",
6062 }
markchien7c803b82021-08-26 22:10:06 +08006063
6064 bpf {
6065 name: "bpf",
6066 srcs: ["bpf.c"],
6067 }
6068
6069 bpf {
6070 name: "override_bpf",
6071 srcs: ["override_bpf.c"],
6072 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006073
6074 prebuilt_etc {
6075 name: "myetc",
6076 src: "myprebuilt",
6077 }
6078
6079 prebuilt_etc {
6080 name: "override_myetc",
6081 src: "override_myprebuilt",
6082 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006083 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006084
Jiyong Park317645e2019-12-05 13:20:58 +09006085 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6086 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6087 if originalVariant.GetOverriddenBy() != "" {
6088 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6089 }
6090 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6091 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6092 }
6093
Jiyong Park5d790c32019-11-15 18:40:32 +09006094 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6095 apexRule := module.Rule("apexRule")
6096 copyCmds := apexRule.Args["copy_commands"]
6097
6098 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006099 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006100
markchien7c803b82021-08-26 22:10:06 +08006101 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6102 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6103
Daniel Norman5a3ce132021-08-26 15:44:43 -07006104 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6105 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6106
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006107 apexBundle := module.Module().(*apexBundle)
6108 name := apexBundle.Name()
6109 if name != "override_myapex" {
6110 t.Errorf("name should be \"override_myapex\", but was %q", name)
6111 }
6112
Baligh Uddin004d7172020-02-19 21:29:28 -08006113 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6114 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6115 }
6116
Jiyong Park20bacab2020-03-03 11:45:41 +09006117 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006118 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006119 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6120
6121 signApkRule := module.Rule("signapk")
6122 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006123
Colin Crossaa255532020-07-03 13:18:24 -07006124 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006125 var builder strings.Builder
6126 data.Custom(&builder, name, "TARGET_", "", data)
6127 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006128 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006129 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006130 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
6131 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006132 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006133 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006134 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006135 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006136 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6137 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006138}
6139
Jooyung Han214bf372019-11-12 13:03:50 +09006140func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006141 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006142 apex {
6143 name: "myapex",
6144 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006145 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006146 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006147 }
6148
6149 apex_key {
6150 name: "myapex.key",
6151 public_key: "testkey.avbpubkey",
6152 private_key: "testkey.pem",
6153 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006154
6155 cc_library {
6156 name: "mylib",
6157 srcs: ["mylib.cpp"],
6158 stl: "libc++",
6159 system_shared_libs: [],
6160 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006161 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006162 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006163 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006164
6165 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6166 args := module.Rule("apexRule").Args
6167 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006168 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006169
6170 // The copies of the libraries in the apex should have one more dependency than
6171 // the ones outside the apex, namely the unwinder. Ideally we should check
6172 // the dependency names directly here but for some reason the names are blank in
6173 // this test.
6174 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006175 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006176 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6177 if len(apexImplicits) != len(nonApexImplicits)+1 {
6178 t.Errorf("%q missing unwinder dep", lib)
6179 }
6180 }
Jooyung Han214bf372019-11-12 13:03:50 +09006181}
6182
Paul Duffine05480a2021-03-08 15:07:14 +00006183var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006184 "api/current.txt": nil,
6185 "api/removed.txt": nil,
6186 "api/system-current.txt": nil,
6187 "api/system-removed.txt": nil,
6188 "api/test-current.txt": nil,
6189 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006190
Anton Hanssondff2c782020-12-21 17:10:01 +00006191 "100/public/api/foo.txt": nil,
6192 "100/public/api/foo-removed.txt": nil,
6193 "100/system/api/foo.txt": nil,
6194 "100/system/api/foo-removed.txt": nil,
6195
Paul Duffineedc5d52020-06-12 17:46:39 +01006196 // For java_sdk_library_import
6197 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006198}
6199
Jooyung Han58f26ab2019-12-18 15:34:32 +09006200func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006201 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006202 apex {
6203 name: "myapex",
6204 key: "myapex.key",
6205 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006206 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006207 }
6208
6209 apex_key {
6210 name: "myapex.key",
6211 public_key: "testkey.avbpubkey",
6212 private_key: "testkey.pem",
6213 }
6214
6215 java_sdk_library {
6216 name: "foo",
6217 srcs: ["a.java"],
6218 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006219 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006220 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006221
6222 prebuilt_apis {
6223 name: "sdk",
6224 api_dirs: ["100"],
6225 }
Paul Duffin9b879592020-05-26 13:21:35 +01006226 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006227
6228 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006229 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006230 "javalib/foo.jar",
6231 "etc/permissions/foo.xml",
6232 })
6233 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006234 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006235 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 +09006236}
6237
Paul Duffin9b879592020-05-26 13:21:35 +01006238func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006239 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006240 apex {
6241 name: "myapex",
6242 key: "myapex.key",
6243 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006244 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006245 }
6246
6247 apex_key {
6248 name: "myapex.key",
6249 public_key: "testkey.avbpubkey",
6250 private_key: "testkey.pem",
6251 }
6252
6253 java_sdk_library {
6254 name: "foo",
6255 srcs: ["a.java"],
6256 api_packages: ["foo"],
6257 apex_available: ["myapex"],
6258 sdk_version: "none",
6259 system_modules: "none",
6260 }
6261
6262 java_library {
6263 name: "bar",
6264 srcs: ["a.java"],
6265 libs: ["foo"],
6266 apex_available: ["myapex"],
6267 sdk_version: "none",
6268 system_modules: "none",
6269 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006270
6271 prebuilt_apis {
6272 name: "sdk",
6273 api_dirs: ["100"],
6274 }
Paul Duffin9b879592020-05-26 13:21:35 +01006275 `, withFiles(filesForSdkLibrary))
6276
6277 // java_sdk_library installs both impl jar and permission XML
6278 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6279 "javalib/bar.jar",
6280 "javalib/foo.jar",
6281 "etc/permissions/foo.xml",
6282 })
6283
6284 // The bar library should depend on the implementation jar.
6285 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006286 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006287 t.Errorf("expected %q, found %#q", expected, actual)
6288 }
6289}
6290
6291func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006292 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006293 apex {
6294 name: "myapex",
6295 key: "myapex.key",
6296 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006297 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006298 }
6299
6300 apex_key {
6301 name: "myapex.key",
6302 public_key: "testkey.avbpubkey",
6303 private_key: "testkey.pem",
6304 }
6305
6306 java_sdk_library {
6307 name: "foo",
6308 srcs: ["a.java"],
6309 api_packages: ["foo"],
6310 apex_available: ["myapex"],
6311 sdk_version: "none",
6312 system_modules: "none",
6313 }
6314
6315 java_library {
6316 name: "bar",
6317 srcs: ["a.java"],
6318 libs: ["foo"],
6319 sdk_version: "none",
6320 system_modules: "none",
6321 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006322
6323 prebuilt_apis {
6324 name: "sdk",
6325 api_dirs: ["100"],
6326 }
Paul Duffin9b879592020-05-26 13:21:35 +01006327 `, withFiles(filesForSdkLibrary))
6328
6329 // java_sdk_library installs both impl jar and permission XML
6330 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6331 "javalib/foo.jar",
6332 "etc/permissions/foo.xml",
6333 })
6334
6335 // The bar library should depend on the stubs jar.
6336 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006337 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006338 t.Errorf("expected %q, found %#q", expected, actual)
6339 }
6340}
6341
Paul Duffineedc5d52020-06-12 17:46:39 +01006342func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006343 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006344 prebuilt_apis {
6345 name: "sdk",
6346 api_dirs: ["100"],
6347 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006348 withFiles(map[string][]byte{
6349 "apex/a.java": nil,
6350 "apex/apex_manifest.json": nil,
6351 "apex/Android.bp": []byte(`
6352 package {
6353 default_visibility: ["//visibility:private"],
6354 }
6355
6356 apex {
6357 name: "myapex",
6358 key: "myapex.key",
6359 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006360 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006361 }
6362
6363 apex_key {
6364 name: "myapex.key",
6365 public_key: "testkey.avbpubkey",
6366 private_key: "testkey.pem",
6367 }
6368
6369 java_library {
6370 name: "bar",
6371 srcs: ["a.java"],
6372 libs: ["foo"],
6373 apex_available: ["myapex"],
6374 sdk_version: "none",
6375 system_modules: "none",
6376 }
6377`),
6378 "source/a.java": nil,
6379 "source/api/current.txt": nil,
6380 "source/api/removed.txt": nil,
6381 "source/Android.bp": []byte(`
6382 package {
6383 default_visibility: ["//visibility:private"],
6384 }
6385
6386 java_sdk_library {
6387 name: "foo",
6388 visibility: ["//apex"],
6389 srcs: ["a.java"],
6390 api_packages: ["foo"],
6391 apex_available: ["myapex"],
6392 sdk_version: "none",
6393 system_modules: "none",
6394 public: {
6395 enabled: true,
6396 },
6397 }
6398`),
6399 "prebuilt/a.jar": nil,
6400 "prebuilt/Android.bp": []byte(`
6401 package {
6402 default_visibility: ["//visibility:private"],
6403 }
6404
6405 java_sdk_library_import {
6406 name: "foo",
6407 visibility: ["//apex", "//source"],
6408 apex_available: ["myapex"],
6409 prefer: true,
6410 public: {
6411 jars: ["a.jar"],
6412 },
6413 }
6414`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006415 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006416 )
6417
6418 // java_sdk_library installs both impl jar and permission XML
6419 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6420 "javalib/bar.jar",
6421 "javalib/foo.jar",
6422 "etc/permissions/foo.xml",
6423 })
6424
6425 // The bar library should depend on the implementation jar.
6426 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006427 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006428 t.Errorf("expected %q, found %#q", expected, actual)
6429 }
6430}
6431
6432func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6433 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6434 apex {
6435 name: "myapex",
6436 key: "myapex.key",
6437 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006438 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006439 }
6440
6441 apex_key {
6442 name: "myapex.key",
6443 public_key: "testkey.avbpubkey",
6444 private_key: "testkey.pem",
6445 }
6446
6447 java_sdk_library_import {
6448 name: "foo",
6449 apex_available: ["myapex"],
6450 prefer: true,
6451 public: {
6452 jars: ["a.jar"],
6453 },
6454 }
6455
6456 `, withFiles(filesForSdkLibrary))
6457}
6458
atrost6e126252020-01-27 17:01:16 +00006459func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006460 result := android.GroupFixturePreparers(
6461 prepareForApexTest,
6462 java.PrepareForTestWithPlatformCompatConfig,
6463 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006464 apex {
6465 name: "myapex",
6466 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006467 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006468 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006469 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006470 }
6471
6472 apex_key {
6473 name: "myapex.key",
6474 public_key: "testkey.avbpubkey",
6475 private_key: "testkey.pem",
6476 }
6477
6478 platform_compat_config {
6479 name: "myjar-platform-compat-config",
6480 src: ":myjar",
6481 }
6482
6483 java_library {
6484 name: "myjar",
6485 srcs: ["foo/bar/MyClass.java"],
6486 sdk_version: "none",
6487 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006488 apex_available: [ "myapex" ],
6489 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006490
6491 // Make sure that a preferred prebuilt does not affect the apex contents.
6492 prebuilt_platform_compat_config {
6493 name: "myjar-platform-compat-config",
6494 metadata: "compat-config/metadata.xml",
6495 prefer: true,
6496 }
atrost6e126252020-01-27 17:01:16 +00006497 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006498 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006499 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6500 "etc/compatconfig/myjar-platform-compat-config.xml",
6501 "javalib/myjar.jar",
6502 })
6503}
6504
Jiyong Park479321d2019-12-16 11:47:12 +09006505func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6506 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6507 apex {
6508 name: "myapex",
6509 key: "myapex.key",
6510 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006511 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006512 }
6513
6514 apex_key {
6515 name: "myapex.key",
6516 public_key: "testkey.avbpubkey",
6517 private_key: "testkey.pem",
6518 }
6519
6520 java_library {
6521 name: "myjar",
6522 srcs: ["foo/bar/MyClass.java"],
6523 sdk_version: "none",
6524 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006525 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006526 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006527 }
6528 `)
6529}
6530
Jiyong Park7afd1072019-12-30 16:56:33 +09006531func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006532 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006533 apex {
6534 name: "myapex",
6535 key: "myapex.key",
6536 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006537 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006538 }
6539
6540 apex_key {
6541 name: "myapex.key",
6542 public_key: "testkey.avbpubkey",
6543 private_key: "testkey.pem",
6544 }
6545
6546 cc_library {
6547 name: "mylib",
6548 srcs: ["mylib.cpp"],
6549 system_shared_libs: [],
6550 stl: "none",
6551 required: ["a", "b"],
6552 host_required: ["c", "d"],
6553 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006554 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006555 }
6556 `)
6557
6558 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006559 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006560 name := apexBundle.BaseModuleName()
6561 prefix := "TARGET_"
6562 var builder strings.Builder
6563 data.Custom(&builder, name, prefix, "", data)
6564 androidMk := builder.String()
6565 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6566 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6567 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6568}
6569
Jiyong Park7cd10e32020-01-14 09:22:18 +09006570func TestSymlinksFromApexToSystem(t *testing.T) {
6571 bp := `
6572 apex {
6573 name: "myapex",
6574 key: "myapex.key",
6575 native_shared_libs: ["mylib"],
6576 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006577 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006578 }
6579
Jiyong Park9d677202020-02-19 16:29:35 +09006580 apex {
6581 name: "myapex.updatable",
6582 key: "myapex.key",
6583 native_shared_libs: ["mylib"],
6584 java_libs: ["myjar"],
6585 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006586 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006587 }
6588
Jiyong Park7cd10e32020-01-14 09:22:18 +09006589 apex_key {
6590 name: "myapex.key",
6591 public_key: "testkey.avbpubkey",
6592 private_key: "testkey.pem",
6593 }
6594
6595 cc_library {
6596 name: "mylib",
6597 srcs: ["mylib.cpp"],
6598 shared_libs: ["myotherlib"],
6599 system_shared_libs: [],
6600 stl: "none",
6601 apex_available: [
6602 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006603 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006604 "//apex_available:platform",
6605 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006606 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006607 }
6608
6609 cc_library {
6610 name: "myotherlib",
6611 srcs: ["mylib.cpp"],
6612 system_shared_libs: [],
6613 stl: "none",
6614 apex_available: [
6615 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006616 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006617 "//apex_available:platform",
6618 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006619 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006620 }
6621
6622 java_library {
6623 name: "myjar",
6624 srcs: ["foo/bar/MyClass.java"],
6625 sdk_version: "none",
6626 system_modules: "none",
6627 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006628 apex_available: [
6629 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006630 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006631 "//apex_available:platform",
6632 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006633 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006634 }
6635
6636 java_library {
6637 name: "myotherjar",
6638 srcs: ["foo/bar/MyClass.java"],
6639 sdk_version: "none",
6640 system_modules: "none",
6641 apex_available: [
6642 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006643 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006644 "//apex_available:platform",
6645 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006646 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006647 }
6648 `
6649
6650 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6651 for _, f := range files {
6652 if f.path == file {
6653 if f.isLink {
6654 t.Errorf("%q is not a real file", file)
6655 }
6656 return
6657 }
6658 }
6659 t.Errorf("%q is not found", file)
6660 }
6661
6662 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6663 for _, f := range files {
6664 if f.path == file {
6665 if !f.isLink {
6666 t.Errorf("%q is not a symlink", file)
6667 }
6668 return
6669 }
6670 }
6671 t.Errorf("%q is not found", file)
6672 }
6673
Jiyong Park9d677202020-02-19 16:29:35 +09006674 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6675 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006676 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006677 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006678 ensureRealfileExists(t, files, "javalib/myjar.jar")
6679 ensureRealfileExists(t, files, "lib64/mylib.so")
6680 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6681
Jiyong Park9d677202020-02-19 16:29:35 +09006682 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6683 ensureRealfileExists(t, files, "javalib/myjar.jar")
6684 ensureRealfileExists(t, files, "lib64/mylib.so")
6685 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6686
6687 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006688 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006689 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006690 ensureRealfileExists(t, files, "javalib/myjar.jar")
6691 ensureRealfileExists(t, files, "lib64/mylib.so")
6692 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006693
6694 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6695 ensureRealfileExists(t, files, "javalib/myjar.jar")
6696 ensureRealfileExists(t, files, "lib64/mylib.so")
6697 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006698}
6699
Yo Chiange8128052020-07-23 20:09:18 +08006700func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006701 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006702 apex {
6703 name: "myapex",
6704 key: "myapex.key",
6705 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006706 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006707 }
6708
6709 apex_key {
6710 name: "myapex.key",
6711 public_key: "testkey.avbpubkey",
6712 private_key: "testkey.pem",
6713 }
6714
6715 cc_library_shared {
6716 name: "mylib",
6717 srcs: ["mylib.cpp"],
6718 shared_libs: ["myotherlib"],
6719 system_shared_libs: [],
6720 stl: "none",
6721 apex_available: [
6722 "myapex",
6723 "//apex_available:platform",
6724 ],
6725 }
6726
6727 cc_prebuilt_library_shared {
6728 name: "myotherlib",
6729 srcs: ["prebuilt.so"],
6730 system_shared_libs: [],
6731 stl: "none",
6732 apex_available: [
6733 "myapex",
6734 "//apex_available:platform",
6735 ],
6736 }
6737 `)
6738
6739 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006740 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006741 var builder strings.Builder
6742 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6743 androidMk := builder.String()
6744 // `myotherlib` is added to `myapex` as symlink
6745 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6746 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6747 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6748 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006749 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 +08006750}
6751
Jooyung Han643adc42020-02-27 13:50:06 +09006752func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006753 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006754 apex {
6755 name: "myapex",
6756 key: "myapex.key",
6757 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006758 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006759 }
6760
6761 apex_key {
6762 name: "myapex.key",
6763 public_key: "testkey.avbpubkey",
6764 private_key: "testkey.pem",
6765 }
6766
6767 cc_library {
6768 name: "mylib",
6769 srcs: ["mylib.cpp"],
6770 shared_libs: ["mylib2"],
6771 system_shared_libs: [],
6772 stl: "none",
6773 apex_available: [ "myapex" ],
6774 }
6775
6776 cc_library {
6777 name: "mylib2",
6778 srcs: ["mylib.cpp"],
6779 system_shared_libs: [],
6780 stl: "none",
6781 apex_available: [ "myapex" ],
6782 }
6783 `)
6784
6785 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6786 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6787 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6788 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6789 "lib64/mylib.so",
6790 "lib64/mylib2.so",
6791 })
6792}
6793
Jooyung Han49f67012020-04-17 13:43:10 +09006794func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006795 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006796 apex {
6797 name: "myapex",
6798 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006799 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006800 }
6801 apex_key {
6802 name: "myapex.key",
6803 public_key: "testkey.avbpubkey",
6804 private_key: "testkey.pem",
6805 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006806 `,
6807 android.FixtureModifyConfig(func(config android.Config) {
6808 delete(config.Targets, android.Android)
6809 config.AndroidCommonTarget = android.Target{}
6810 }),
6811 )
Jooyung Han49f67012020-04-17 13:43:10 +09006812
6813 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6814 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6815 }
6816}
6817
Jiyong Parkbd159612020-02-28 15:22:21 +09006818func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006819 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006820 apex {
6821 name: "myapex",
6822 key: "myapex.key",
6823 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006824 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006825 }
6826
6827 apex_key {
6828 name: "myapex.key",
6829 public_key: "testkey.avbpubkey",
6830 private_key: "testkey.pem",
6831 }
6832
6833 android_app {
6834 name: "AppFoo",
6835 srcs: ["foo/bar/MyClass.java"],
6836 sdk_version: "none",
6837 system_modules: "none",
6838 apex_available: [ "myapex" ],
6839 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006840 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006841
Colin Crosscf371cc2020-11-13 11:48:42 -08006842 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006843 content := bundleConfigRule.Args["content"]
6844
6845 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006846 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 +09006847}
6848
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006849func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006850 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006851 apex {
6852 name: "myapex",
6853 key: "myapex.key",
6854 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006855 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006856 }
6857
6858 apex_key {
6859 name: "myapex.key",
6860 public_key: "testkey.avbpubkey",
6861 private_key: "testkey.pem",
6862 }
6863
6864 android_app_set {
6865 name: "AppSet",
6866 set: "AppSet.apks",
6867 }`)
6868 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006869 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006870 content := bundleConfigRule.Args["content"]
6871 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6872 s := mod.Rule("apexRule").Args["copy_commands"]
6873 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6874 if len(copyCmds) != 3 {
6875 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6876 }
6877 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6878 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6879 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6880}
6881
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006882func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01006883 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006884 apex_set {
6885 name: "myapex",
6886 filename: "foo_v2.apex",
6887 sanitized: {
6888 none: { set: "myapex.apks", },
6889 hwaddress: { set: "myapex.hwasan.apks", },
6890 },
Paul Duffin24704672021-04-06 16:09:30 +01006891 }
6892 `
6893 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006894
Paul Duffin24704672021-04-06 16:09:30 +01006895 // Check that the extractor produces the correct output file from the correct input file.
6896 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006897
Paul Duffin24704672021-04-06 16:09:30 +01006898 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
6899 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006900
Paul Duffin24704672021-04-06 16:09:30 +01006901 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
6902
6903 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01006904 m = ctx.ModuleForTests("myapex", "android_common_myapex")
6905 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01006906
6907 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006908}
6909
Paul Duffin89f570a2021-06-16 01:42:33 +01006910func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006911 t.Helper()
6912
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006913 bp := `
6914 java_library {
6915 name: "some-updatable-apex-lib",
6916 srcs: ["a.java"],
6917 sdk_version: "current",
6918 apex_available: [
6919 "some-updatable-apex",
6920 ],
satayevabcd5972021-08-06 17:49:46 +01006921 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006922 }
6923
6924 java_library {
6925 name: "some-non-updatable-apex-lib",
6926 srcs: ["a.java"],
6927 apex_available: [
6928 "some-non-updatable-apex",
6929 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01006930 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01006931 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006932 }
6933
6934 bootclasspath_fragment {
6935 name: "some-non-updatable-fragment",
6936 contents: ["some-non-updatable-apex-lib"],
6937 apex_available: [
6938 "some-non-updatable-apex",
6939 ],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006940 }
6941
6942 java_library {
6943 name: "some-platform-lib",
6944 srcs: ["a.java"],
6945 sdk_version: "current",
6946 installable: true,
6947 }
6948
6949 java_library {
6950 name: "some-art-lib",
6951 srcs: ["a.java"],
6952 sdk_version: "current",
6953 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006954 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006955 ],
6956 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01006957 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006958 }
6959
6960 apex {
6961 name: "some-updatable-apex",
6962 key: "some-updatable-apex.key",
6963 java_libs: ["some-updatable-apex-lib"],
6964 updatable: true,
6965 min_sdk_version: "current",
6966 }
6967
6968 apex {
6969 name: "some-non-updatable-apex",
6970 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01006971 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006972 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006973 }
6974
6975 apex_key {
6976 name: "some-updatable-apex.key",
6977 }
6978
6979 apex_key {
6980 name: "some-non-updatable-apex.key",
6981 }
6982
6983 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006984 name: "com.android.art.debug",
6985 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01006986 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006987 updatable: true,
6988 min_sdk_version: "current",
6989 }
6990
Paul Duffinf23bc472021-04-27 12:42:20 +01006991 bootclasspath_fragment {
6992 name: "art-bootclasspath-fragment",
6993 image_name: "art",
6994 contents: ["some-art-lib"],
6995 apex_available: [
6996 "com.android.art.debug",
6997 ],
6998 }
6999
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007000 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007001 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007002 }
7003
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007004 filegroup {
7005 name: "some-updatable-apex-file_contexts",
7006 srcs: [
7007 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7008 ],
7009 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007010
7011 filegroup {
7012 name: "some-non-updatable-apex-file_contexts",
7013 srcs: [
7014 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7015 ],
7016 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007017 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007018
Paul Duffin89f570a2021-06-16 01:42:33 +01007019 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007020}
7021
Paul Duffin89f570a2021-06-16 01:42:33 +01007022func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007023 t.Helper()
7024
Paul Duffin55607122021-03-30 23:32:51 +01007025 fs := android.MockFS{
7026 "a.java": nil,
7027 "a.jar": nil,
7028 "apex_manifest.json": nil,
7029 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007030 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007031 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7032 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7033 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007034 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007035 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007036
Paul Duffin55607122021-03-30 23:32:51 +01007037 errorHandler := android.FixtureExpectsNoErrors
7038 if errmsg != "" {
7039 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007040 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007041
Paul Duffin55607122021-03-30 23:32:51 +01007042 result := android.GroupFixturePreparers(
7043 cc.PrepareForTestWithCcDefaultModules,
7044 java.PrepareForTestWithHiddenApiBuildComponents,
7045 java.PrepareForTestWithJavaDefaultModules,
7046 java.PrepareForTestWithJavaSdkLibraryFiles,
7047 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007048 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007049 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007050 android.FixtureModifyMockFS(func(fs android.MockFS) {
7051 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7052 insert := ""
7053 for _, fragment := range fragments {
7054 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7055 }
7056 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7057 platform_bootclasspath {
7058 name: "platform-bootclasspath",
7059 fragments: [
7060 %s
7061 ],
7062 }
7063 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007064 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007065 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007066 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007067 ).
7068 ExtendWithErrorHandler(errorHandler).
7069 RunTestWithBp(t, bp)
7070
7071 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007072}
7073
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007074func TestDuplicateDeapexeresFromPrebuiltApexes(t *testing.T) {
7075 preparers := android.GroupFixturePreparers(
7076 java.PrepareForTestWithJavaDefaultModules,
7077 PrepareForTestWithApexBuildComponents,
7078 ).
7079 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7080 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7081
7082 bpBase := `
7083 apex_set {
7084 name: "com.android.myapex",
7085 installable: true,
7086 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7087 set: "myapex.apks",
7088 }
7089
7090 apex_set {
7091 name: "com.mycompany.android.myapex",
7092 apex_name: "com.android.myapex",
7093 installable: true,
7094 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7095 set: "company-myapex.apks",
7096 }
7097
7098 prebuilt_bootclasspath_fragment {
7099 name: "my-bootclasspath-fragment",
7100 apex_available: ["com.android.myapex"],
7101 %s
7102 }
7103 `
7104
7105 t.Run("java_import", func(t *testing.T) {
7106 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7107 java_import {
7108 name: "libfoo",
7109 jars: ["libfoo.jar"],
7110 apex_available: ["com.android.myapex"],
7111 }
7112 `)
7113 })
7114
7115 t.Run("java_sdk_library_import", func(t *testing.T) {
7116 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7117 java_sdk_library_import {
7118 name: "libfoo",
7119 public: {
7120 jars: ["libbar.jar"],
7121 },
7122 apex_available: ["com.android.myapex"],
7123 }
7124 `)
7125 })
7126
7127 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7128 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7129 image_name: "art",
7130 contents: ["libfoo"],
7131 `)+`
7132 java_sdk_library_import {
7133 name: "libfoo",
7134 public: {
7135 jars: ["libbar.jar"],
7136 },
7137 apex_available: ["com.android.myapex"],
7138 }
7139 `)
7140 })
7141}
7142
Jooyung Han548640b2020-04-27 12:10:30 +09007143func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7144 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7145 apex {
7146 name: "myapex",
7147 key: "myapex.key",
7148 updatable: true,
7149 }
7150
7151 apex_key {
7152 name: "myapex.key",
7153 public_key: "testkey.avbpubkey",
7154 private_key: "testkey.pem",
7155 }
7156 `)
7157}
7158
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007159func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7160 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7161 apex {
7162 name: "myapex",
7163 key: "myapex.key",
7164 }
7165
7166 apex_key {
7167 name: "myapex.key",
7168 public_key: "testkey.avbpubkey",
7169 private_key: "testkey.pem",
7170 }
7171 `)
7172}
7173
Daniel Norman69109112021-12-02 12:52:42 -08007174func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7175 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7176 apex {
7177 name: "myapex",
7178 key: "myapex.key",
7179 updatable: true,
7180 soc_specific: true,
7181 }
7182
7183 apex_key {
7184 name: "myapex.key",
7185 public_key: "testkey.avbpubkey",
7186 private_key: "testkey.pem",
7187 }
7188 `)
7189}
7190
satayevb98371c2021-06-15 16:49:50 +01007191func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7192 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7193 apex {
7194 name: "myapex",
7195 key: "myapex.key",
7196 systemserverclasspath_fragments: [
7197 "mysystemserverclasspathfragment",
7198 ],
7199 min_sdk_version: "29",
7200 updatable: true,
7201 }
7202
7203 apex_key {
7204 name: "myapex.key",
7205 public_key: "testkey.avbpubkey",
7206 private_key: "testkey.pem",
7207 }
7208
7209 java_library {
7210 name: "foo",
7211 srcs: ["b.java"],
7212 min_sdk_version: "29",
7213 installable: true,
7214 apex_available: [
7215 "myapex",
7216 ],
7217 }
7218
7219 systemserverclasspath_fragment {
7220 name: "mysystemserverclasspathfragment",
7221 generate_classpaths_proto: false,
7222 contents: [
7223 "foo",
7224 ],
7225 apex_available: [
7226 "myapex",
7227 ],
7228 }
satayevabcd5972021-08-06 17:49:46 +01007229 `,
7230 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7231 )
satayevb98371c2021-06-15 16:49:50 +01007232}
7233
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007234func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007235 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7236 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7237 // modules to be included in the BootJars.
7238 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7239 return android.GroupFixturePreparers(
7240 dexpreopt.FixtureSetBootJars(bootJars...),
7241 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7242 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7243 }),
7244 )
7245 }
7246
7247 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7248 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7249 // specified in the ArtApexJars configuration.
7250 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7251 return android.GroupFixturePreparers(
7252 dexpreopt.FixtureSetArtBootJars(bootJars...),
7253 dexpreopt.FixtureSetBootJars(bootJars...),
7254 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7255 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7256 }),
7257 )
7258 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007259
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007260 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007261 preparer := android.GroupFixturePreparers(
7262 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7263 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7264 )
7265 fragments := []java.ApexVariantReference{
7266 {
7267 Apex: proptools.StringPtr("com.android.art.debug"),
7268 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7269 },
7270 {
7271 Apex: proptools.StringPtr("some-non-updatable-apex"),
7272 Module: proptools.StringPtr("some-non-updatable-fragment"),
7273 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007274 }
satayevabcd5972021-08-06 17:49:46 +01007275 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
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("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007279 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7280 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007281 preparer := android.GroupFixturePreparers(
7282 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7283 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7284 )
Paul Duffin60264a02021-04-12 20:02:36 +01007285 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007286 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007287
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007288 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 +01007289 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 +01007290 // Update the dexpreopt ArtApexJars directly.
7291 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7292 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007293 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007294
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007295 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 +01007296 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 +01007297 // Update the dexpreopt ArtApexJars directly.
7298 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7299 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007300 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007301
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007302 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 +01007303 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 +01007304 preparer := android.GroupFixturePreparers(
7305 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7306 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7307 )
Paul Duffin60264a02021-04-12 20:02:36 +01007308 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007309 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007310
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007311 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 +01007312 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007313 fragment := java.ApexVariantReference{
7314 Apex: proptools.StringPtr("some-non-updatable-apex"),
7315 Module: proptools.StringPtr("some-non-updatable-fragment"),
7316 }
7317 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007318 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007319
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007320 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007321 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007322 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7323 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007324 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007325
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007326 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007327 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007328 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7329 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007330 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007331
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007332 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007333 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007334 // Update the dexpreopt ArtApexJars directly.
7335 preparer := prepareSetArtJars("platform:some-platform-lib")
7336 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007337 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007338
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007339 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007340 preparer := android.GroupFixturePreparers(
7341 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7342 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7343 )
7344 fragments := []java.ApexVariantReference{
7345 {
7346 Apex: proptools.StringPtr("some-non-updatable-apex"),
7347 Module: proptools.StringPtr("some-non-updatable-fragment"),
7348 },
7349 }
7350 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007351 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007352}
7353
7354func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007355 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007356 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007357 fragment := java.ApexVariantReference{
7358 Apex: proptools.StringPtr("myapex"),
7359 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7360 }
7361
Paul Duffin064b70c2020-11-02 17:32:38 +00007362 testDexpreoptWithApexes(t, `
7363 prebuilt_apex {
7364 name: "myapex" ,
7365 arch: {
7366 arm64: {
7367 src: "myapex-arm64.apex",
7368 },
7369 arm: {
7370 src: "myapex-arm.apex",
7371 },
7372 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007373 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7374 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007375
Paul Duffin89f570a2021-06-16 01:42:33 +01007376 prebuilt_bootclasspath_fragment {
7377 name: "my-bootclasspath-fragment",
7378 contents: ["libfoo"],
7379 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007380 hidden_api: {
7381 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7382 metadata: "my-bootclasspath-fragment/metadata.csv",
7383 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007384 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7385 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7386 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007387 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007388 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007389
Paul Duffin89f570a2021-06-16 01:42:33 +01007390 java_import {
7391 name: "libfoo",
7392 jars: ["libfoo.jar"],
7393 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007394 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007395 }
7396 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007397 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007398}
7399
satayevd604b212021-07-21 14:23:52 +01007400func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007401 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007402 bp += `
7403 apex_key {
7404 name: "myapex.key",
7405 public_key: "testkey.avbpubkey",
7406 private_key: "testkey.pem",
7407 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007408 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007409 "lib1/src/A.java": nil,
7410 "lib2/src/B.java": nil,
7411 "system/sepolicy/apex/myapex-file_contexts": nil,
7412 }
7413
Paul Duffin45338f02021-03-30 23:07:52 +01007414 errorHandler := android.FixtureExpectsNoErrors
7415 if errmsg != "" {
7416 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007417 }
Colin Crossae8600b2020-10-29 17:09:13 -07007418
Paul Duffin45338f02021-03-30 23:07:52 +01007419 android.GroupFixturePreparers(
7420 android.PrepareForTestWithAndroidBuildComponents,
7421 java.PrepareForTestWithJavaBuildComponents,
7422 PrepareForTestWithApexBuildComponents,
7423 android.PrepareForTestWithNeverallowRules(rules),
7424 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007425 apexBootJars := make([]string, 0, len(bootJars))
7426 for _, apexBootJar := range bootJars {
7427 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007428 }
satayevd604b212021-07-21 14:23:52 +01007429 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007430 }),
7431 fs.AddToFixture(),
7432 ).
7433 ExtendWithErrorHandler(errorHandler).
7434 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007435}
7436
7437func TestApexPermittedPackagesRules(t *testing.T) {
7438 testcases := []struct {
7439 name string
7440 expectedError string
7441 bp string
7442 bootJars []string
7443 modulesPackages map[string][]string
7444 }{
7445
7446 {
7447 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7448 expectedError: "",
7449 bp: `
7450 java_library {
7451 name: "bcp_lib1",
7452 srcs: ["lib1/src/*.java"],
7453 permitted_packages: ["foo.bar"],
7454 apex_available: ["myapex"],
7455 sdk_version: "none",
7456 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007457 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007458 }
7459 java_library {
7460 name: "nonbcp_lib2",
7461 srcs: ["lib2/src/*.java"],
7462 apex_available: ["myapex"],
7463 permitted_packages: ["a.b"],
7464 sdk_version: "none",
7465 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007466 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007467 }
7468 apex {
7469 name: "myapex",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007470 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007471 key: "myapex.key",
7472 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007473 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007474 }`,
7475 bootJars: []string{"bcp_lib1"},
7476 modulesPackages: map[string][]string{
7477 "myapex": []string{
7478 "foo.bar",
7479 },
7480 },
7481 },
7482 {
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007483 name: "Bootclasspath apex jar not satisfying allowed module packages on Q.",
Andrei Onead967aee2022-01-19 15:36:40 +00007484 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 +01007485 bp: `
7486 java_library {
7487 name: "bcp_lib1",
7488 srcs: ["lib1/src/*.java"],
7489 apex_available: ["myapex"],
7490 permitted_packages: ["foo.bar"],
7491 sdk_version: "none",
7492 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007493 min_sdk_version: "29",
Andrei Onea115e7e72020-06-05 21:14:03 +01007494 }
7495 java_library {
7496 name: "bcp_lib2",
7497 srcs: ["lib2/src/*.java"],
7498 apex_available: ["myapex"],
7499 permitted_packages: ["foo.bar", "bar.baz"],
7500 sdk_version: "none",
7501 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007502 min_sdk_version: "29",
Andrei Onea115e7e72020-06-05 21:14:03 +01007503 }
7504 apex {
7505 name: "myapex",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007506 min_sdk_version: "29",
7507 key: "myapex.key",
7508 java_libs: ["bcp_lib1", "bcp_lib2"],
7509 updatable: false,
7510 }
7511 `,
7512 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7513 modulesPackages: map[string][]string{
7514 "myapex": []string{
7515 "foo.bar",
7516 },
7517 },
7518 },
7519 {
7520 name: "Bootclasspath apex jar not satisfying allowed module packages on R.",
Andrei Onead967aee2022-01-19 15:36:40 +00007521 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 +09007522 bp: `
7523 java_library {
7524 name: "bcp_lib1",
7525 srcs: ["lib1/src/*.java"],
7526 apex_available: ["myapex"],
7527 permitted_packages: ["foo.bar"],
7528 sdk_version: "none",
7529 system_modules: "none",
7530 min_sdk_version: "30",
7531 }
7532 java_library {
7533 name: "bcp_lib2",
7534 srcs: ["lib2/src/*.java"],
7535 apex_available: ["myapex"],
7536 permitted_packages: ["foo.bar", "bar.baz"],
7537 sdk_version: "none",
7538 system_modules: "none",
7539 min_sdk_version: "30",
7540 }
7541 apex {
7542 name: "myapex",
7543 min_sdk_version: "30",
7544 key: "myapex.key",
7545 java_libs: ["bcp_lib1", "bcp_lib2"],
7546 updatable: false,
7547 }
7548 `,
7549 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7550 modulesPackages: map[string][]string{
7551 "myapex": []string{
7552 "foo.bar",
7553 },
7554 },
7555 },
7556 {
7557 name: "Bootclasspath apex jar >= T not satisfying Q/R/S allowed module packages.",
7558 expectedError: "",
7559 bp: `
7560 java_library {
7561 name: "bcp_lib1",
7562 srcs: ["lib1/src/*.java"],
7563 apex_available: ["myapex"],
7564 permitted_packages: ["foo.bar"],
7565 sdk_version: "none",
7566 system_modules: "none",
7567 min_sdk_version: "current",
7568 }
7569 java_library {
7570 name: "bcp_lib2",
7571 srcs: ["lib2/src/*.java"],
7572 apex_available: ["myapex"],
7573 permitted_packages: ["foo.bar", "bar.baz"],
7574 sdk_version: "none",
7575 system_modules: "none",
7576 min_sdk_version: "current",
7577 }
7578 apex {
7579 name: "myapex",
7580 min_sdk_version: "current",
Andrei Onea115e7e72020-06-05 21:14:03 +01007581 key: "myapex.key",
7582 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007583 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007584 }
7585 `,
7586 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7587 modulesPackages: map[string][]string{
7588 "myapex": []string{
7589 "foo.bar",
7590 },
7591 },
7592 },
7593 }
7594 for _, tc := range testcases {
7595 t.Run(tc.name, func(t *testing.T) {
7596 rules := createApexPermittedPackagesRules(tc.modulesPackages)
7597 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
7598 })
7599 }
7600}
7601
Jiyong Park62304bb2020-04-13 16:19:48 +09007602func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007603 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09007604 apex {
7605 name: "myapex",
7606 key: "myapex.key",
7607 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007608 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09007609 }
7610
7611 apex_key {
7612 name: "myapex.key",
7613 public_key: "testkey.avbpubkey",
7614 private_key: "testkey.pem",
7615 }
7616
7617 cc_library {
7618 name: "mylib",
7619 srcs: ["mylib.cpp"],
7620 system_shared_libs: [],
7621 stl: "none",
7622 stubs: {
7623 versions: ["1"],
7624 },
7625 apex_available: ["myapex"],
7626 }
7627
7628 cc_library {
7629 name: "myprivlib",
7630 srcs: ["mylib.cpp"],
7631 system_shared_libs: [],
7632 stl: "none",
7633 apex_available: ["myapex"],
7634 }
7635
7636
7637 cc_test {
7638 name: "mytest",
7639 gtest: false,
7640 srcs: ["mylib.cpp"],
7641 system_shared_libs: [],
7642 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09007643 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09007644 test_for: ["myapex"]
7645 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007646
7647 cc_library {
7648 name: "mytestlib",
7649 srcs: ["mylib.cpp"],
7650 system_shared_libs: [],
7651 shared_libs: ["mylib", "myprivlib"],
7652 stl: "none",
7653 test_for: ["myapex"],
7654 }
7655
7656 cc_benchmark {
7657 name: "mybench",
7658 srcs: ["mylib.cpp"],
7659 system_shared_libs: [],
7660 shared_libs: ["mylib", "myprivlib"],
7661 stl: "none",
7662 test_for: ["myapex"],
7663 }
Jiyong Park62304bb2020-04-13 16:19:48 +09007664 `)
7665
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007666 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007667 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007668 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7669 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7670 }
7671
7672 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09007673 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007674 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7675 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7676 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7677}
Jiyong Park46a512f2020-12-04 18:02:13 +09007678
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007679func TestIndirectTestFor(t *testing.T) {
7680 ctx := testApex(t, `
7681 apex {
7682 name: "myapex",
7683 key: "myapex.key",
7684 native_shared_libs: ["mylib", "myprivlib"],
7685 updatable: false,
7686 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007687
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007688 apex_key {
7689 name: "myapex.key",
7690 public_key: "testkey.avbpubkey",
7691 private_key: "testkey.pem",
7692 }
7693
7694 cc_library {
7695 name: "mylib",
7696 srcs: ["mylib.cpp"],
7697 system_shared_libs: [],
7698 stl: "none",
7699 stubs: {
7700 versions: ["1"],
7701 },
7702 apex_available: ["myapex"],
7703 }
7704
7705 cc_library {
7706 name: "myprivlib",
7707 srcs: ["mylib.cpp"],
7708 system_shared_libs: [],
7709 stl: "none",
7710 shared_libs: ["mylib"],
7711 apex_available: ["myapex"],
7712 }
7713
7714 cc_library {
7715 name: "mytestlib",
7716 srcs: ["mylib.cpp"],
7717 system_shared_libs: [],
7718 shared_libs: ["myprivlib"],
7719 stl: "none",
7720 test_for: ["myapex"],
7721 }
7722 `)
7723
7724 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007725 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007726 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7727 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7728 }
7729
7730 // The platform variant of mytestlib links to the platform variant of the
7731 // internal myprivlib.
7732 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
7733
7734 // The platform variant of myprivlib links to the platform variant of mylib
7735 // and bypasses its stubs.
7736 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 +09007737}
7738
Martin Stjernholmec009002021-03-27 15:18:31 +00007739func TestTestForForLibInOtherApex(t *testing.T) {
7740 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
7741 _ = testApex(t, `
7742 apex {
7743 name: "com.android.art",
7744 key: "myapex.key",
7745 native_shared_libs: ["mylib"],
7746 updatable: false,
7747 }
7748
7749 apex {
7750 name: "com.android.art.debug",
7751 key: "myapex.key",
7752 native_shared_libs: ["mylib", "mytestlib"],
7753 updatable: false,
7754 }
7755
7756 apex_key {
7757 name: "myapex.key",
7758 public_key: "testkey.avbpubkey",
7759 private_key: "testkey.pem",
7760 }
7761
7762 cc_library {
7763 name: "mylib",
7764 srcs: ["mylib.cpp"],
7765 system_shared_libs: [],
7766 stl: "none",
7767 stubs: {
7768 versions: ["1"],
7769 },
7770 apex_available: ["com.android.art", "com.android.art.debug"],
7771 }
7772
7773 cc_library {
7774 name: "mytestlib",
7775 srcs: ["mylib.cpp"],
7776 system_shared_libs: [],
7777 shared_libs: ["mylib"],
7778 stl: "none",
7779 apex_available: ["com.android.art.debug"],
7780 test_for: ["com.android.art"],
7781 }
7782 `,
7783 android.MockFS{
7784 "system/sepolicy/apex/com.android.art-file_contexts": nil,
7785 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
7786 }.AddToFixture())
7787}
7788
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007789// TODO(jungjw): Move this to proptools
7790func intPtr(i int) *int {
7791 return &i
7792}
7793
7794func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007795 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007796 apex_set {
7797 name: "myapex",
7798 set: "myapex.apks",
7799 filename: "foo_v2.apex",
7800 overrides: ["foo"],
7801 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007802 `,
7803 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7804 variables.Platform_sdk_version = intPtr(30)
7805 }),
7806 android.FixtureModifyConfig(func(config android.Config) {
7807 config.Targets[android.Android] = []android.Target{
7808 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
7809 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
7810 }
7811 }),
7812 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007813
Paul Duffin24704672021-04-06 16:09:30 +01007814 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007815
7816 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01007817 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007818 actual := extractedApex.Args["abis"]
7819 expected := "ARMEABI_V7A,ARM64_V8A"
7820 if actual != expected {
7821 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7822 }
7823 actual = extractedApex.Args["sdk-version"]
7824 expected = "30"
7825 if actual != expected {
7826 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7827 }
7828
Paul Duffin6717d882021-06-15 19:09:41 +01007829 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007830 a := m.Module().(*ApexSet)
7831 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07007832 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007833 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
7834 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
7835 }
7836}
7837
Jiyong Park7d95a512020-05-10 15:16:24 +09007838func TestNoStaticLinkingToStubsLib(t *testing.T) {
7839 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
7840 apex {
7841 name: "myapex",
7842 key: "myapex.key",
7843 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007844 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09007845 }
7846
7847 apex_key {
7848 name: "myapex.key",
7849 public_key: "testkey.avbpubkey",
7850 private_key: "testkey.pem",
7851 }
7852
7853 cc_library {
7854 name: "mylib",
7855 srcs: ["mylib.cpp"],
7856 static_libs: ["otherlib"],
7857 system_shared_libs: [],
7858 stl: "none",
7859 apex_available: [ "myapex" ],
7860 }
7861
7862 cc_library {
7863 name: "otherlib",
7864 srcs: ["mylib.cpp"],
7865 system_shared_libs: [],
7866 stl: "none",
7867 stubs: {
7868 versions: ["1", "2", "3"],
7869 },
7870 apex_available: [ "myapex" ],
7871 }
7872 `)
7873}
7874
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007875func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007876 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007877 apex {
7878 name: "myapex",
7879 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007880 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09007881 custom_sign_tool: "sign_myapex",
7882 }
7883
7884 apex_key {
7885 name: "myapex.key",
7886 public_key: "testkey.avbpubkey",
7887 private_key: "testkey.pem",
7888 }
7889 `)
7890
7891 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7892 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7893 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"`)
7894}
7895
7896func TestApexKeysTxtOverrides(t *testing.T) {
7897 ctx := testApex(t, `
7898 apex {
7899 name: "myapex",
7900 key: "myapex.key",
7901 updatable: false,
7902 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007903 }
7904
7905 apex_key {
7906 name: "myapex.key",
7907 public_key: "testkey.avbpubkey",
7908 private_key: "testkey.pem",
7909 }
7910
7911 prebuilt_apex {
7912 name: "myapex",
7913 prefer: true,
7914 arch: {
7915 arm64: {
7916 src: "myapex-arm64.apex",
7917 },
7918 arm: {
7919 src: "myapex-arm.apex",
7920 },
7921 },
7922 }
7923
7924 apex_set {
7925 name: "myapex_set",
7926 set: "myapex.apks",
7927 filename: "myapex_set.apex",
7928 overrides: ["myapex"],
7929 }
7930 `)
7931
7932 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7933 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7934 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 +09007935 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 +09007936}
7937
Jooyung Han938b5932020-06-20 12:47:47 +09007938func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007939 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09007940 apex {
7941 name: "myapex",
7942 key: "myapex.key",
7943 apps: ["app"],
7944 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007945 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007946 }
7947
7948 apex_key {
7949 name: "myapex.key",
7950 public_key: "testkey.avbpubkey",
7951 private_key: "testkey.pem",
7952 }
7953
7954 android_app {
7955 name: "app",
7956 srcs: ["foo/bar/MyClass.java"],
7957 package_name: "foo",
7958 sdk_version: "none",
7959 system_modules: "none",
7960 apex_available: [ "myapex" ],
7961 }
7962 `, withFiles(map[string][]byte{
7963 "sub/Android.bp": []byte(`
7964 override_apex {
7965 name: "override_myapex",
7966 base: "myapex",
7967 apps: ["override_app"],
7968 allowed_files: ":allowed",
7969 }
7970 // Overridable "path" property should be referenced indirectly
7971 filegroup {
7972 name: "allowed",
7973 srcs: ["allowed.txt"],
7974 }
7975 override_android_app {
7976 name: "override_app",
7977 base: "app",
7978 package_name: "bar",
7979 }
7980 `),
7981 }))
7982
7983 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7984 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7985 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7986 }
7987
7988 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7989 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7990 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7991 }
7992}
7993
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007994func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007995 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007996 apex {
7997 name: "myapex",
7998 key: "myapex.key",
7999 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008000 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008001 }
8002
8003 apex_key {
8004 name: "myapex.key",
8005 public_key: "testkey.avbpubkey",
8006 private_key: "testkey.pem",
8007 }
8008
8009 cc_library {
8010 name: "mylib",
8011 srcs: ["mylib.cpp"],
8012 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008013 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008014 },
8015 apex_available: ["myapex"],
8016 }
8017
8018 cc_prebuilt_library_shared {
8019 name: "mylib",
8020 prefer: false,
8021 srcs: ["prebuilt.so"],
8022 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008023 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008024 },
8025 apex_available: ["myapex"],
8026 }
8027 `)
8028}
8029
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008030func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008031 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008032 apex {
8033 name: "myapex",
8034 key: "myapex.key",
8035 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008036 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008037 }
8038 apex_key {
8039 name: "myapex.key",
8040 public_key: "testkey.avbpubkey",
8041 private_key: "testkey.pem",
8042 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008043 `,
8044 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8045 variables.CompressedApex = proptools.BoolPtr(true)
8046 }),
8047 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008048
8049 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8050 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8051
8052 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8053 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8054
8055 // Make sure output of bundle is .capex
8056 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8057 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8058
8059 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008060 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008061 var builder strings.Builder
8062 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8063 androidMk := builder.String()
8064 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8065}
8066
Martin Stjernholm2856c662020-12-02 15:03:42 +00008067func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008068 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008069 apex {
8070 name: "myapex",
8071 key: "myapex.key",
8072 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008073 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008074 }
8075
8076 apex_key {
8077 name: "myapex.key",
8078 public_key: "testkey.avbpubkey",
8079 private_key: "testkey.pem",
8080 }
8081
8082 cc_library {
8083 name: "mylib",
8084 srcs: ["mylib.cpp"],
8085 apex_available: ["myapex"],
8086 shared_libs: ["otherlib"],
8087 system_shared_libs: [],
8088 }
8089
8090 cc_library {
8091 name: "otherlib",
8092 srcs: ["mylib.cpp"],
8093 stubs: {
8094 versions: ["current"],
8095 },
8096 }
8097
8098 cc_prebuilt_library_shared {
8099 name: "otherlib",
8100 prefer: true,
8101 srcs: ["prebuilt.so"],
8102 stubs: {
8103 versions: ["current"],
8104 },
8105 }
8106 `)
8107
8108 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008109 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008110 var builder strings.Builder
8111 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8112 androidMk := builder.String()
8113
8114 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8115 // a thing there.
8116 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8117}
8118
Jiyong Parke3867542020-12-03 17:28:25 +09008119func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008120 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008121 apex {
8122 name: "myapex",
8123 key: "myapex.key",
8124 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008125 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008126 }
8127
8128 apex_key {
8129 name: "myapex.key",
8130 public_key: "testkey.avbpubkey",
8131 private_key: "testkey.pem",
8132 }
8133
8134 cc_library {
8135 name: "mylib",
8136 srcs: ["mylib.cpp"],
8137 system_shared_libs: [],
8138 stl: "none",
8139 apex_available: ["myapex"],
8140 shared_libs: ["mylib2"],
8141 target: {
8142 apex: {
8143 exclude_shared_libs: ["mylib2"],
8144 },
8145 },
8146 }
8147
8148 cc_library {
8149 name: "mylib2",
8150 srcs: ["mylib.cpp"],
8151 system_shared_libs: [],
8152 stl: "none",
8153 }
8154 `)
8155
8156 // Check if mylib is linked to mylib2 for the non-apex target
8157 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8158 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8159
8160 // Make sure that the link doesn't occur for the apex target
8161 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8162 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8163
8164 // It shouldn't appear in the copy cmd as well.
8165 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8166 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8167}
8168
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008169func TestPrebuiltStubLibDep(t *testing.T) {
8170 bpBase := `
8171 apex {
8172 name: "myapex",
8173 key: "myapex.key",
8174 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008175 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008176 }
8177 apex_key {
8178 name: "myapex.key",
8179 public_key: "testkey.avbpubkey",
8180 private_key: "testkey.pem",
8181 }
8182 cc_library {
8183 name: "mylib",
8184 srcs: ["mylib.cpp"],
8185 apex_available: ["myapex"],
8186 shared_libs: ["stublib"],
8187 system_shared_libs: [],
8188 }
8189 apex {
8190 name: "otherapex",
8191 enabled: %s,
8192 key: "myapex.key",
8193 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008194 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008195 }
8196 `
8197
8198 stublibSourceBp := `
8199 cc_library {
8200 name: "stublib",
8201 srcs: ["mylib.cpp"],
8202 apex_available: ["otherapex"],
8203 system_shared_libs: [],
8204 stl: "none",
8205 stubs: {
8206 versions: ["1"],
8207 },
8208 }
8209 `
8210
8211 stublibPrebuiltBp := `
8212 cc_prebuilt_library_shared {
8213 name: "stublib",
8214 srcs: ["prebuilt.so"],
8215 apex_available: ["otherapex"],
8216 stubs: {
8217 versions: ["1"],
8218 },
8219 %s
8220 }
8221 `
8222
8223 tests := []struct {
8224 name string
8225 stublibBp string
8226 usePrebuilt bool
8227 modNames []string // Modules to collect AndroidMkEntries for
8228 otherApexEnabled []string
8229 }{
8230 {
8231 name: "only_source",
8232 stublibBp: stublibSourceBp,
8233 usePrebuilt: false,
8234 modNames: []string{"stublib"},
8235 otherApexEnabled: []string{"true", "false"},
8236 },
8237 {
8238 name: "source_preferred",
8239 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8240 usePrebuilt: false,
8241 modNames: []string{"stublib", "prebuilt_stublib"},
8242 otherApexEnabled: []string{"true", "false"},
8243 },
8244 {
8245 name: "prebuilt_preferred",
8246 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8247 usePrebuilt: true,
8248 modNames: []string{"stublib", "prebuilt_stublib"},
8249 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8250 },
8251 {
8252 name: "only_prebuilt",
8253 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8254 usePrebuilt: true,
8255 modNames: []string{"stublib"},
8256 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8257 },
8258 }
8259
8260 for _, test := range tests {
8261 t.Run(test.name, func(t *testing.T) {
8262 for _, otherApexEnabled := range test.otherApexEnabled {
8263 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008264 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008265
8266 type modAndMkEntries struct {
8267 mod *cc.Module
8268 mkEntries android.AndroidMkEntries
8269 }
8270 entries := []*modAndMkEntries{}
8271
8272 // Gather shared lib modules that are installable
8273 for _, modName := range test.modNames {
8274 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8275 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8276 continue
8277 }
8278 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008279 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008280 continue
8281 }
Colin Crossaa255532020-07-03 13:18:24 -07008282 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008283 if ent.Disabled {
8284 continue
8285 }
8286 entries = append(entries, &modAndMkEntries{
8287 mod: mod,
8288 mkEntries: ent,
8289 })
8290 }
8291 }
8292 }
8293
8294 var entry *modAndMkEntries = nil
8295 for _, ent := range entries {
8296 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8297 if entry != nil {
8298 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8299 } else {
8300 entry = ent
8301 }
8302 }
8303 }
8304
8305 if entry == nil {
8306 t.Errorf("AndroidMk entry for \"stublib\" missing")
8307 } else {
8308 isPrebuilt := entry.mod.Prebuilt() != nil
8309 if isPrebuilt != test.usePrebuilt {
8310 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8311 }
8312 if !entry.mod.IsStubs() {
8313 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8314 }
8315 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8316 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8317 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008318 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008319 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008320 if !android.InList(expected, cflags) {
8321 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8322 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008323 }
8324 })
8325 }
8326 })
8327 }
8328}
8329
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008330func TestHostApexInHostOnlyBuild(t *testing.T) {
8331 testApex(t, `
8332 apex {
8333 name: "myapex",
8334 host_supported: true,
8335 key: "myapex.key",
8336 updatable: false,
8337 payload_type: "zip",
8338 }
8339 apex_key {
8340 name: "myapex.key",
8341 public_key: "testkey.avbpubkey",
8342 private_key: "testkey.pem",
8343 }
8344 `,
8345 android.FixtureModifyConfig(func(config android.Config) {
8346 // We may not have device targets in all builds, e.g. in
8347 // prebuilts/build-tools/build-prebuilts.sh
8348 config.Targets[android.Android] = []android.Target{}
8349 }))
8350}
8351
Colin Crossc33e5212021-05-25 18:16:02 -07008352func TestApexJavaCoverage(t *testing.T) {
8353 bp := `
8354 apex {
8355 name: "myapex",
8356 key: "myapex.key",
8357 java_libs: ["mylib"],
8358 bootclasspath_fragments: ["mybootclasspathfragment"],
8359 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8360 updatable: false,
8361 }
8362
8363 apex_key {
8364 name: "myapex.key",
8365 public_key: "testkey.avbpubkey",
8366 private_key: "testkey.pem",
8367 }
8368
8369 java_library {
8370 name: "mylib",
8371 srcs: ["mylib.java"],
8372 apex_available: ["myapex"],
8373 compile_dex: true,
8374 }
8375
8376 bootclasspath_fragment {
8377 name: "mybootclasspathfragment",
8378 contents: ["mybootclasspathlib"],
8379 apex_available: ["myapex"],
8380 }
8381
8382 java_library {
8383 name: "mybootclasspathlib",
8384 srcs: ["mybootclasspathlib.java"],
8385 apex_available: ["myapex"],
8386 compile_dex: true,
8387 }
8388
8389 systemserverclasspath_fragment {
8390 name: "mysystemserverclasspathfragment",
8391 contents: ["mysystemserverclasspathlib"],
8392 apex_available: ["myapex"],
8393 }
8394
8395 java_library {
8396 name: "mysystemserverclasspathlib",
8397 srcs: ["mysystemserverclasspathlib.java"],
8398 apex_available: ["myapex"],
8399 compile_dex: true,
8400 }
8401 `
8402
8403 result := android.GroupFixturePreparers(
8404 PrepareForTestWithApexBuildComponents,
8405 prepareForTestWithMyapex,
8406 java.PrepareForTestWithJavaDefaultModules,
8407 android.PrepareForTestWithAndroidBuildComponents,
8408 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008409 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8410 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008411 android.FixtureMergeEnv(map[string]string{
8412 "EMMA_INSTRUMENT": "true",
8413 }),
8414 ).RunTest(t)
8415
8416 // Make sure jacoco ran on both mylib and mybootclasspathlib
8417 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8418 t.Errorf("Failed to find jacoco rule for mylib")
8419 }
8420 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8421 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8422 }
8423 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8424 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8425 }
8426}
8427
Jiyong Park192600a2021-08-03 07:52:17 +00008428func TestProhibitStaticExecutable(t *testing.T) {
8429 testApexError(t, `executable mybin is static`, `
8430 apex {
8431 name: "myapex",
8432 key: "myapex.key",
8433 binaries: ["mybin"],
8434 min_sdk_version: "29",
8435 }
8436
8437 apex_key {
8438 name: "myapex.key",
8439 public_key: "testkey.avbpubkey",
8440 private_key: "testkey.pem",
8441 }
8442
8443 cc_binary {
8444 name: "mybin",
8445 srcs: ["mylib.cpp"],
8446 relative_install_path: "foo/bar",
8447 static_executable: true,
8448 system_shared_libs: [],
8449 stl: "none",
8450 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008451 min_sdk_version: "29",
8452 }
8453 `)
8454
8455 testApexError(t, `executable mybin.rust is static`, `
8456 apex {
8457 name: "myapex",
8458 key: "myapex.key",
8459 binaries: ["mybin.rust"],
8460 min_sdk_version: "29",
8461 }
8462
8463 apex_key {
8464 name: "myapex.key",
8465 public_key: "testkey.avbpubkey",
8466 private_key: "testkey.pem",
8467 }
8468
8469 rust_binary {
8470 name: "mybin.rust",
8471 srcs: ["foo.rs"],
8472 static_executable: true,
8473 apex_available: ["myapex"],
8474 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008475 }
8476 `)
8477}
8478
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008479func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8480 ctx := testApex(t, `
8481 apex {
8482 name: "myapex",
8483 key: "myapex.key",
8484 updatable: false,
8485 java_libs: ["foo"],
8486 }
8487
8488 apex_key {
8489 name: "myapex.key",
8490 public_key: "testkey.avbpubkey",
8491 private_key: "testkey.pem",
8492 }
8493
8494 java_library {
8495 name: "foo",
8496 srcs: ["foo.java"],
8497 apex_available: ["myapex"],
8498 installable: true,
8499 }
8500 `,
8501 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8502 )
8503
8504 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8505 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8506 var builder strings.Builder
8507 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8508 androidMk := builder.String()
8509 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")
8510}
8511
8512func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8513 ctx := testApex(t, `
8514 prebuilt_apex {
8515 name: "myapex",
8516 arch: {
8517 arm64: {
8518 src: "myapex-arm64.apex",
8519 },
8520 arm: {
8521 src: "myapex-arm.apex",
8522 },
8523 },
8524 exported_java_libs: ["foo"],
8525 }
8526
8527 java_import {
8528 name: "foo",
8529 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008530 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008531 }
8532 `,
8533 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8534 )
8535
8536 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8537 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8538 mainModuleEntries := entriesList[0]
8539 android.AssertArrayString(t,
8540 "LOCAL_REQUIRED_MODULES",
8541 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8542 []string{
8543 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8544 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8545 })
8546}
8547
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008548func TestAndroidMk_RequiredModules(t *testing.T) {
8549 ctx := testApex(t, `
8550 apex {
8551 name: "myapex",
8552 key: "myapex.key",
8553 updatable: false,
8554 java_libs: ["foo"],
8555 required: ["otherapex"],
8556 }
8557
8558 apex {
8559 name: "otherapex",
8560 key: "myapex.key",
8561 updatable: false,
8562 java_libs: ["foo"],
8563 required: ["otherapex"],
8564 }
8565
8566 apex_key {
8567 name: "myapex.key",
8568 public_key: "testkey.avbpubkey",
8569 private_key: "testkey.pem",
8570 }
8571
8572 java_library {
8573 name: "foo",
8574 srcs: ["foo.java"],
8575 apex_available: ["myapex", "otherapex"],
8576 installable: true,
8577 }
8578 `)
8579
8580 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8581 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8582 var builder strings.Builder
8583 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8584 androidMk := builder.String()
8585 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
8586}
8587
satayev758968a2021-12-06 11:42:40 +00008588func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
8589 preparer := android.GroupFixturePreparers(
8590 PrepareForTestWithApexBuildComponents,
8591 prepareForTestWithMyapex,
8592 java.PrepareForTestWithJavaSdkLibraryFiles,
8593 java.PrepareForTestWithJavaDefaultModules,
8594 android.PrepareForTestWithAndroidBuildComponents,
8595 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8596 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
8597 )
8598
8599 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
8600 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8601 preparer.RunTestWithBp(t, `
8602 apex {
8603 name: "myapex",
8604 key: "myapex.key",
8605 bootclasspath_fragments: ["mybootclasspathfragment"],
8606 min_sdk_version: "30",
8607 updatable: false,
8608 }
8609
8610 apex_key {
8611 name: "myapex.key",
8612 public_key: "testkey.avbpubkey",
8613 private_key: "testkey.pem",
8614 }
8615
8616 bootclasspath_fragment {
8617 name: "mybootclasspathfragment",
8618 contents: ["mybootclasspathlib"],
8619 apex_available: ["myapex"],
8620 }
8621
8622 java_sdk_library {
8623 name: "mybootclasspathlib",
8624 srcs: ["mybootclasspathlib.java"],
8625 apex_available: ["myapex"],
8626 compile_dex: true,
8627 unsafe_ignore_missing_latest_api: true,
8628 min_sdk_version: "31",
8629 static_libs: ["util"],
8630 }
8631
8632 java_library {
8633 name: "util",
8634 srcs: ["a.java"],
8635 apex_available: ["myapex"],
8636 min_sdk_version: "31",
8637 static_libs: ["another_util"],
8638 }
8639
8640 java_library {
8641 name: "another_util",
8642 srcs: ["a.java"],
8643 min_sdk_version: "31",
8644 apex_available: ["myapex"],
8645 }
8646 `)
8647 })
8648
8649 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
8650 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8651 preparer.RunTestWithBp(t, `
8652 apex {
8653 name: "myapex",
8654 key: "myapex.key",
8655 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8656 min_sdk_version: "30",
8657 updatable: false,
8658 }
8659
8660 apex_key {
8661 name: "myapex.key",
8662 public_key: "testkey.avbpubkey",
8663 private_key: "testkey.pem",
8664 }
8665
8666 systemserverclasspath_fragment {
8667 name: "mysystemserverclasspathfragment",
8668 contents: ["mysystemserverclasspathlib"],
8669 apex_available: ["myapex"],
8670 }
8671
8672 java_sdk_library {
8673 name: "mysystemserverclasspathlib",
8674 srcs: ["mysystemserverclasspathlib.java"],
8675 apex_available: ["myapex"],
8676 compile_dex: true,
8677 min_sdk_version: "32",
8678 unsafe_ignore_missing_latest_api: true,
8679 static_libs: ["util"],
8680 }
8681
8682 java_library {
8683 name: "util",
8684 srcs: ["a.java"],
8685 apex_available: ["myapex"],
8686 min_sdk_version: "31",
8687 static_libs: ["another_util"],
8688 }
8689
8690 java_library {
8691 name: "another_util",
8692 srcs: ["a.java"],
8693 min_sdk_version: "31",
8694 apex_available: ["myapex"],
8695 }
8696 `)
8697 })
8698
8699 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8700 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
8701 RunTestWithBp(t, `
8702 apex {
8703 name: "myapex",
8704 key: "myapex.key",
8705 bootclasspath_fragments: ["mybootclasspathfragment"],
8706 min_sdk_version: "30",
8707 updatable: false,
8708 }
8709
8710 apex_key {
8711 name: "myapex.key",
8712 public_key: "testkey.avbpubkey",
8713 private_key: "testkey.pem",
8714 }
8715
8716 bootclasspath_fragment {
8717 name: "mybootclasspathfragment",
8718 contents: ["mybootclasspathlib"],
8719 apex_available: ["myapex"],
8720 }
8721
8722 java_sdk_library {
8723 name: "mybootclasspathlib",
8724 srcs: ["mybootclasspathlib.java"],
8725 apex_available: ["myapex"],
8726 compile_dex: true,
8727 unsafe_ignore_missing_latest_api: true,
8728 }
8729 `)
8730 })
8731
8732 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8733 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
8734 RunTestWithBp(t, `
8735 apex {
8736 name: "myapex",
8737 key: "myapex.key",
8738 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8739 min_sdk_version: "30",
8740 updatable: false,
8741 }
8742
8743 apex_key {
8744 name: "myapex.key",
8745 public_key: "testkey.avbpubkey",
8746 private_key: "testkey.pem",
8747 }
8748
8749 systemserverclasspath_fragment {
8750 name: "mysystemserverclasspathfragment",
8751 contents: ["mysystemserverclasspathlib"],
8752 apex_available: ["myapex"],
8753 }
8754
8755 java_sdk_library {
8756 name: "mysystemserverclasspathlib",
8757 srcs: ["mysystemserverclasspathlib.java"],
8758 apex_available: ["myapex"],
8759 compile_dex: true,
8760 unsafe_ignore_missing_latest_api: true,
8761 }
8762 `)
8763 })
8764}
8765
Jiakai Zhang6decef92022-01-12 17:56:19 +00008766// Verifies that the APEX depends on all the Make modules in the list.
8767func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
8768 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
8769 for _, dep := range deps {
8770 android.AssertStringListContains(t, "", a.requiredDeps, dep)
8771 }
8772}
8773
8774// Verifies that the APEX does not depend on any of the Make modules in the list.
8775func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
8776 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
8777 for _, dep := range deps {
8778 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
8779 }
8780}
8781
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07008782func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01008783 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07008784}