blob: 9c6f8cbee785cd292953d310f1987500192c7fa8 [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) {
Jooyung Han91f92032022-02-04 12:36:33 +09002734 // myapex myapex2
2735 // | |
2736 // mybin ------. mybin2
2737 // \ \ / |
2738 // (stable) .---\--------` |
2739 // \ / \ |
2740 // \ / \ /
2741 // libvndk libvendor
2742 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002743 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002744 apex {
2745 name: "myapex",
2746 key: "myapex.key",
2747 binaries: ["mybin"],
2748 vendor: true,
2749 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002750 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002751 }
2752 apex_key {
2753 name: "myapex.key",
2754 public_key: "testkey.avbpubkey",
2755 private_key: "testkey.pem",
2756 }
2757 cc_binary {
2758 name: "mybin",
2759 vendor: true,
2760 shared_libs: ["libvndk", "libvendor"],
2761 }
2762 cc_library {
2763 name: "libvndk",
2764 vndk: {
2765 enabled: true,
2766 },
2767 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002768 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002769 }
2770 cc_library {
2771 name: "libvendor",
2772 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002773 stl: "none",
2774 }
2775 apex {
2776 name: "myapex2",
2777 key: "myapex.key",
2778 binaries: ["mybin2"],
2779 vendor: true,
2780 use_vndk_as_stable: false,
2781 updatable: false,
2782 }
2783 cc_binary {
2784 name: "mybin2",
2785 vendor: true,
2786 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002787 }
2788 `)
2789
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002790 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002791
Jooyung Han91f92032022-02-04 12:36:33 +09002792 for _, tc := range []struct {
2793 name string
2794 apexName string
2795 moduleName string
2796 moduleVariant string
2797 libs []string
2798 contents []string
2799 requireVndkNamespace bool
2800 }{
2801 {
2802 name: "use_vndk_as_stable",
2803 apexName: "myapex",
2804 moduleName: "mybin",
2805 moduleVariant: vendorVariant + "_apex10000",
2806 libs: []string{
2807 // should link with vendor variants of VNDK libs(libvndk/libc++)
2808 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2809 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2810 // unstable Vendor libs as APEX variant
2811 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2812 },
2813 contents: []string{
2814 "bin/mybin",
2815 "lib64/libvendor.so",
2816 // VNDK libs (libvndk/libc++) are not included
2817 },
2818 requireVndkNamespace: true,
2819 },
2820 {
2821 name: "!use_vndk_as_stable",
2822 apexName: "myapex2",
2823 moduleName: "mybin2",
2824 moduleVariant: vendorVariant + "_myapex2",
2825 libs: []string{
2826 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2827 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2828 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2829 // unstable vendor libs have "merged" APEX variants
2830 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2831 },
2832 contents: []string{
2833 "bin/mybin2",
2834 "lib64/libvendor.so",
2835 // VNDK libs are included as well
2836 "lib64/libvndk.so",
2837 "lib64/libc++.so",
2838 },
2839 requireVndkNamespace: false,
2840 },
2841 } {
2842 t.Run(tc.name, func(t *testing.T) {
2843 // Check linked libs
2844 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2845 libs := names(ldRule.Args["libFlags"])
2846 for _, lib := range tc.libs {
2847 ensureListContains(t, libs, lib)
2848 }
2849 // Check apex contents
2850 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002851
Jooyung Han91f92032022-02-04 12:36:33 +09002852 // Check "requireNativeLibs"
2853 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2854 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2855 if tc.requireVndkNamespace {
2856 ensureListContains(t, requireNativeLibs, ":vndk")
2857 } else {
2858 ensureListNotContains(t, requireNativeLibs, ":vndk")
2859 }
2860 })
2861 }
Jooyung Handf78e212020-07-22 15:54:47 +09002862}
2863
Justin Yun13decfb2021-03-08 19:25:55 +09002864func TestProductVariant(t *testing.T) {
2865 ctx := testApex(t, `
2866 apex {
2867 name: "myapex",
2868 key: "myapex.key",
2869 updatable: false,
2870 product_specific: true,
2871 binaries: ["foo"],
2872 }
2873
2874 apex_key {
2875 name: "myapex.key",
2876 public_key: "testkey.avbpubkey",
2877 private_key: "testkey.pem",
2878 }
2879
2880 cc_binary {
2881 name: "foo",
2882 product_available: true,
2883 apex_available: ["myapex"],
2884 srcs: ["foo.cpp"],
2885 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002886 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2887 variables.ProductVndkVersion = proptools.StringPtr("current")
2888 }),
2889 )
Justin Yun13decfb2021-03-08 19:25:55 +09002890
2891 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002892 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002893 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2894 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2895 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2896 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2897}
2898
Jooyung Han8e5685d2020-09-21 11:02:57 +09002899func TestApex_withPrebuiltFirmware(t *testing.T) {
2900 testCases := []struct {
2901 name string
2902 additionalProp string
2903 }{
2904 {"system apex with prebuilt_firmware", ""},
2905 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2906 }
2907 for _, tc := range testCases {
2908 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002909 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002910 apex {
2911 name: "myapex",
2912 key: "myapex.key",
2913 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002914 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002915 `+tc.additionalProp+`
2916 }
2917 apex_key {
2918 name: "myapex.key",
2919 public_key: "testkey.avbpubkey",
2920 private_key: "testkey.pem",
2921 }
2922 prebuilt_firmware {
2923 name: "myfirmware",
2924 src: "myfirmware.bin",
2925 filename_from_src: true,
2926 `+tc.additionalProp+`
2927 }
2928 `)
2929 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2930 "etc/firmware/myfirmware.bin",
2931 })
2932 })
2933 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002934}
2935
Jooyung Hanefb184e2020-06-25 17:14:25 +09002936func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002937 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002938 apex {
2939 name: "myapex",
2940 key: "myapex.key",
2941 vendor: true,
2942 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002943 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002944 }
2945
2946 apex_key {
2947 name: "myapex.key",
2948 public_key: "testkey.avbpubkey",
2949 private_key: "testkey.pem",
2950 }
2951
2952 cc_library {
2953 name: "mylib",
2954 vendor_available: true,
2955 }
2956 `)
2957
2958 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002959 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002960 name := apexBundle.BaseModuleName()
2961 prefix := "TARGET_"
2962 var builder strings.Builder
2963 data.Custom(&builder, name, prefix, "", data)
2964 androidMk := builder.String()
2965 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2966}
2967
Jooyung Han2ed99d02020-06-24 23:26:26 +09002968func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002969 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002970 apex {
2971 name: "myapex",
2972 key: "myapex.key",
2973 vintf_fragments: ["fragment.xml"],
2974 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002975 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002976 }
2977 apex_key {
2978 name: "myapex.key",
2979 public_key: "testkey.avbpubkey",
2980 private_key: "testkey.pem",
2981 }
2982 cc_binary {
2983 name: "mybin",
2984 }
2985 `)
2986
2987 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002988 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002989 name := apexBundle.BaseModuleName()
2990 prefix := "TARGET_"
2991 var builder strings.Builder
2992 data.Custom(&builder, name, prefix, "", data)
2993 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002994 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002995 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002996}
2997
Jiyong Park16e91a02018-12-20 18:18:08 +09002998func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002999 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003000 apex {
3001 name: "myapex",
3002 key: "myapex.key",
3003 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003004 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003005 }
3006
3007 apex_key {
3008 name: "myapex.key",
3009 public_key: "testkey.avbpubkey",
3010 private_key: "testkey.pem",
3011 }
3012
3013 cc_library {
3014 name: "mylib",
3015 srcs: ["mylib.cpp"],
3016 system_shared_libs: [],
3017 stl: "none",
3018 stubs: {
3019 versions: ["1", "2", "3"],
3020 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003021 apex_available: [
3022 "//apex_available:platform",
3023 "myapex",
3024 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003025 }
3026
3027 cc_binary {
3028 name: "not_in_apex",
3029 srcs: ["mylib.cpp"],
3030 static_libs: ["mylib"],
3031 static_executable: true,
3032 system_shared_libs: [],
3033 stl: "none",
3034 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003035 `)
3036
Colin Cross7113d202019-11-20 16:39:12 -08003037 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003038
3039 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003040 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003041}
Jiyong Park9335a262018-12-24 11:31:58 +09003042
3043func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003044 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003045 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003046 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003047 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003048 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003049 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003050 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003051 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003052 }
3053
3054 cc_library {
3055 name: "mylib",
3056 srcs: ["mylib.cpp"],
3057 system_shared_libs: [],
3058 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003059 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003060 }
3061
3062 apex_key {
3063 name: "myapex.key",
3064 public_key: "testkey.avbpubkey",
3065 private_key: "testkey.pem",
3066 }
3067
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003068 android_app_certificate {
3069 name: "myapex.certificate",
3070 certificate: "testkey",
3071 }
3072
3073 android_app_certificate {
3074 name: "myapex.certificate.override",
3075 certificate: "testkey.override",
3076 }
3077
Jiyong Park9335a262018-12-24 11:31:58 +09003078 `)
3079
3080 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003081 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003082
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003083 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3084 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003085 "vendor/foo/devkeys/testkey.avbpubkey")
3086 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003087 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3088 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003089 "vendor/foo/devkeys/testkey.pem")
3090 }
3091
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003092 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003093 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003094 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003095 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003096 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003097 }
3098}
Jiyong Park58e364a2019-01-19 19:24:06 +09003099
Jooyung Hanf121a652019-12-17 14:30:11 +09003100func TestCertificate(t *testing.T) {
3101 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003102 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003103 apex {
3104 name: "myapex",
3105 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003106 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003107 }
3108 apex_key {
3109 name: "myapex.key",
3110 public_key: "testkey.avbpubkey",
3111 private_key: "testkey.pem",
3112 }`)
3113 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3114 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3115 if actual := rule.Args["certificates"]; actual != expected {
3116 t.Errorf("certificates should be %q, not %q", expected, actual)
3117 }
3118 })
3119 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003120 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003121 apex {
3122 name: "myapex_keytest",
3123 key: "myapex.key",
3124 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003125 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003126 }
3127 apex_key {
3128 name: "myapex.key",
3129 public_key: "testkey.avbpubkey",
3130 private_key: "testkey.pem",
3131 }
3132 android_app_certificate {
3133 name: "myapex.certificate.override",
3134 certificate: "testkey.override",
3135 }`)
3136 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3137 expected := "testkey.override.x509.pem testkey.override.pk8"
3138 if actual := rule.Args["certificates"]; actual != expected {
3139 t.Errorf("certificates should be %q, not %q", expected, actual)
3140 }
3141 })
3142 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003143 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003144 apex {
3145 name: "myapex",
3146 key: "myapex.key",
3147 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003148 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003149 }
3150 apex_key {
3151 name: "myapex.key",
3152 public_key: "testkey.avbpubkey",
3153 private_key: "testkey.pem",
3154 }
3155 android_app_certificate {
3156 name: "myapex.certificate",
3157 certificate: "testkey",
3158 }`)
3159 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3160 expected := "testkey.x509.pem testkey.pk8"
3161 if actual := rule.Args["certificates"]; actual != expected {
3162 t.Errorf("certificates should be %q, not %q", expected, actual)
3163 }
3164 })
3165 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003166 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003167 apex {
3168 name: "myapex_keytest",
3169 key: "myapex.key",
3170 file_contexts: ":myapex-file_contexts",
3171 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003172 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003173 }
3174 apex_key {
3175 name: "myapex.key",
3176 public_key: "testkey.avbpubkey",
3177 private_key: "testkey.pem",
3178 }
3179 android_app_certificate {
3180 name: "myapex.certificate.override",
3181 certificate: "testkey.override",
3182 }`)
3183 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3184 expected := "testkey.override.x509.pem testkey.override.pk8"
3185 if actual := rule.Args["certificates"]; actual != expected {
3186 t.Errorf("certificates should be %q, not %q", expected, actual)
3187 }
3188 })
3189 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003190 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003191 apex {
3192 name: "myapex",
3193 key: "myapex.key",
3194 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003195 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003196 }
3197 apex_key {
3198 name: "myapex.key",
3199 public_key: "testkey.avbpubkey",
3200 private_key: "testkey.pem",
3201 }`)
3202 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3203 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3204 if actual := rule.Args["certificates"]; actual != expected {
3205 t.Errorf("certificates should be %q, not %q", expected, actual)
3206 }
3207 })
3208 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003209 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003210 apex {
3211 name: "myapex_keytest",
3212 key: "myapex.key",
3213 file_contexts: ":myapex-file_contexts",
3214 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003215 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003216 }
3217 apex_key {
3218 name: "myapex.key",
3219 public_key: "testkey.avbpubkey",
3220 private_key: "testkey.pem",
3221 }
3222 android_app_certificate {
3223 name: "myapex.certificate.override",
3224 certificate: "testkey.override",
3225 }`)
3226 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3227 expected := "testkey.override.x509.pem testkey.override.pk8"
3228 if actual := rule.Args["certificates"]; actual != expected {
3229 t.Errorf("certificates should be %q, not %q", expected, actual)
3230 }
3231 })
3232}
3233
Jiyong Park58e364a2019-01-19 19:24:06 +09003234func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003235 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003236 apex {
3237 name: "myapex",
3238 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003239 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003240 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003241 }
3242
3243 apex {
3244 name: "otherapex",
3245 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003246 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003247 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003248 }
3249
3250 apex_key {
3251 name: "myapex.key",
3252 public_key: "testkey.avbpubkey",
3253 private_key: "testkey.pem",
3254 }
3255
3256 cc_library {
3257 name: "mylib",
3258 srcs: ["mylib.cpp"],
3259 system_shared_libs: [],
3260 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003261 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003262 "myapex",
3263 "otherapex",
3264 ],
Jooyung Han24282772020-03-21 23:20:55 +09003265 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003266 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003267 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003268 cc_library {
3269 name: "mylib2",
3270 srcs: ["mylib.cpp"],
3271 system_shared_libs: [],
3272 stl: "none",
3273 apex_available: [
3274 "myapex",
3275 "otherapex",
3276 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003277 static_libs: ["mylib3"],
3278 recovery_available: true,
3279 min_sdk_version: "29",
3280 }
3281 cc_library {
3282 name: "mylib3",
3283 srcs: ["mylib.cpp"],
3284 system_shared_libs: [],
3285 stl: "none",
3286 apex_available: [
3287 "myapex",
3288 "otherapex",
3289 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003290 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003291 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003292 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003293 `)
3294
Jooyung Hanc87a0592020-03-02 17:44:33 +09003295 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003296 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003297 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003298 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003299
Jooyung Hanccce2f22020-03-07 03:45:53 +09003300 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003301 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003302 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003303 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003304
Jooyung Hanccce2f22020-03-07 03:45:53 +09003305 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003306 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003307 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003308 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003309
Colin Crossaede88c2020-08-11 12:17:01 -07003310 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3311 // each variant defines additional macros to distinguish which apex variant it is built for
3312
3313 // non-APEX variant does not have __ANDROID_APEX__ defined
3314 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3315 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3316
Dan Albertb19953d2020-11-17 15:29:36 -08003317 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003318 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3319 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003320 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003321
Jooyung Hanc87a0592020-03-02 17:44:33 +09003322 // non-APEX variant does not have __ANDROID_APEX__ defined
3323 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3324 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3325
Dan Albertb19953d2020-11-17 15:29:36 -08003326 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003327 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003328 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003329 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003330}
Jiyong Park7e636d02019-01-28 16:16:54 +09003331
3332func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003333 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003334 apex {
3335 name: "myapex",
3336 key: "myapex.key",
3337 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003338 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003339 }
3340
3341 apex_key {
3342 name: "myapex.key",
3343 public_key: "testkey.avbpubkey",
3344 private_key: "testkey.pem",
3345 }
3346
3347 cc_library_headers {
3348 name: "mylib_headers",
3349 export_include_dirs: ["my_include"],
3350 system_shared_libs: [],
3351 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003352 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003353 }
3354
3355 cc_library {
3356 name: "mylib",
3357 srcs: ["mylib.cpp"],
3358 system_shared_libs: [],
3359 stl: "none",
3360 header_libs: ["mylib_headers"],
3361 export_header_lib_headers: ["mylib_headers"],
3362 stubs: {
3363 versions: ["1", "2", "3"],
3364 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003365 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003366 }
3367
3368 cc_library {
3369 name: "otherlib",
3370 srcs: ["mylib.cpp"],
3371 system_shared_libs: [],
3372 stl: "none",
3373 shared_libs: ["mylib"],
3374 }
3375 `)
3376
Colin Cross7113d202019-11-20 16:39:12 -08003377 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003378
3379 // Ensure that the include path of the header lib is exported to 'otherlib'
3380 ensureContains(t, cFlags, "-Imy_include")
3381}
Alex Light9670d332019-01-29 18:07:33 -08003382
Jiyong Park7cd10e32020-01-14 09:22:18 +09003383type fileInApex struct {
3384 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003385 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003386 isLink bool
3387}
3388
Jooyung Hana57af4a2020-01-23 05:36:59 +00003389func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003390 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003391 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003392 copyCmds := apexRule.Args["copy_commands"]
3393 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003394 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003395 for _, cmd := range strings.Split(copyCmds, "&&") {
3396 cmd = strings.TrimSpace(cmd)
3397 if cmd == "" {
3398 continue
3399 }
3400 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003401 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003402 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003403 switch terms[0] {
3404 case "mkdir":
3405 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003406 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003407 t.Fatal("copyCmds contains invalid cp command", cmd)
3408 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003409 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003410 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003411 isLink = false
3412 case "ln":
3413 if len(terms) != 3 && len(terms) != 4 {
3414 // ln LINK TARGET or ln -s LINK TARGET
3415 t.Fatal("copyCmds contains invalid ln command", cmd)
3416 }
3417 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003418 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003419 isLink = true
3420 default:
3421 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3422 }
3423 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003424 index := strings.Index(dst, imageApexDir)
3425 if index == -1 {
3426 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3427 }
3428 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003429 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003430 }
3431 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003432 return ret
3433}
3434
Jooyung Hana57af4a2020-01-23 05:36:59 +00003435func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3436 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003437 var failed bool
3438 var surplus []string
3439 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003440 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003441 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003442 for _, expected := range files {
3443 if matched, _ := path.Match(expected, file.path); matched {
3444 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003445 mactchFound = true
3446 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003447 }
3448 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003449 if !mactchFound {
3450 surplus = append(surplus, file.path)
3451 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003452 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003453
Jooyung Han31c470b2019-10-18 16:26:59 +09003454 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003455 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003456 t.Log("surplus files", surplus)
3457 failed = true
3458 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003459
3460 if len(files) > len(filesMatched) {
3461 var missing []string
3462 for _, expected := range files {
3463 if !filesMatched[expected] {
3464 missing = append(missing, expected)
3465 }
3466 }
3467 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003468 t.Log("missing files", missing)
3469 failed = true
3470 }
3471 if failed {
3472 t.Fail()
3473 }
3474}
3475
Jooyung Han344d5432019-08-23 11:17:39 +09003476func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003477 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003478 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003479 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003480 "etc/llndk.libraries.29.txt",
3481 "etc/vndkcore.libraries.29.txt",
3482 "etc/vndksp.libraries.29.txt",
3483 "etc/vndkprivate.libraries.29.txt",
3484 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003485 }
3486 testCases := []struct {
3487 vndkVersion string
3488 expectedFiles []string
3489 }{
3490 {
3491 vndkVersion: "current",
3492 expectedFiles: append(commonFiles,
3493 "lib/libvndk.so",
3494 "lib/libvndksp.so",
3495 "lib64/libvndk.so",
3496 "lib64/libvndksp.so"),
3497 },
3498 {
3499 vndkVersion: "",
3500 expectedFiles: append(commonFiles,
3501 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3502 "lib/libvndksp.so",
3503 "lib64/libvndksp.so"),
3504 },
3505 }
3506 for _, tc := range testCases {
3507 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3508 ctx := testApex(t, `
3509 apex_vndk {
3510 name: "com.android.vndk.current",
3511 key: "com.android.vndk.current.key",
3512 updatable: false,
3513 }
3514
3515 apex_key {
3516 name: "com.android.vndk.current.key",
3517 public_key: "testkey.avbpubkey",
3518 private_key: "testkey.pem",
3519 }
3520
3521 cc_library {
3522 name: "libvndk",
3523 srcs: ["mylib.cpp"],
3524 vendor_available: true,
3525 product_available: true,
3526 vndk: {
3527 enabled: true,
3528 },
3529 system_shared_libs: [],
3530 stl: "none",
3531 apex_available: [ "com.android.vndk.current" ],
3532 }
3533
3534 cc_library {
3535 name: "libvndksp",
3536 srcs: ["mylib.cpp"],
3537 vendor_available: true,
3538 product_available: true,
3539 vndk: {
3540 enabled: true,
3541 support_system_process: true,
3542 },
3543 system_shared_libs: [],
3544 stl: "none",
3545 apex_available: [ "com.android.vndk.current" ],
3546 }
3547
3548 // VNDK-Ext should not cause any problems
3549
3550 cc_library {
3551 name: "libvndk.ext",
3552 srcs: ["mylib2.cpp"],
3553 vendor: true,
3554 vndk: {
3555 enabled: true,
3556 extends: "libvndk",
3557 },
3558 system_shared_libs: [],
3559 stl: "none",
3560 }
3561
3562 cc_library {
3563 name: "libvndksp.ext",
3564 srcs: ["mylib2.cpp"],
3565 vendor: true,
3566 vndk: {
3567 enabled: true,
3568 support_system_process: true,
3569 extends: "libvndksp",
3570 },
3571 system_shared_libs: [],
3572 stl: "none",
3573 }
3574 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3575 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3576 }))
3577 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3578 })
3579 }
Jooyung Han344d5432019-08-23 11:17:39 +09003580}
3581
3582func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003583 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003584 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003585 name: "com.android.vndk.current",
3586 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003587 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003588 }
3589
3590 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003591 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003592 public_key: "testkey.avbpubkey",
3593 private_key: "testkey.pem",
3594 }
3595
3596 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003597 name: "libvndk",
3598 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003599 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003600 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003601 vndk: {
3602 enabled: true,
3603 },
3604 system_shared_libs: [],
3605 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003606 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003607 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003608
3609 cc_prebuilt_library_shared {
3610 name: "libvndk.arm",
3611 srcs: ["libvndk.arm.so"],
3612 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003613 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003614 vndk: {
3615 enabled: true,
3616 },
3617 enabled: false,
3618 arch: {
3619 arm: {
3620 enabled: true,
3621 },
3622 },
3623 system_shared_libs: [],
3624 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003625 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003626 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003627 `+vndkLibrariesTxtFiles("current"),
3628 withFiles(map[string][]byte{
3629 "libvndk.so": nil,
3630 "libvndk.arm.so": nil,
3631 }))
Colin Cross2807f002021-03-02 10:15:29 -08003632 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003633 "lib/libvndk.so",
3634 "lib/libvndk.arm.so",
3635 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003636 "lib/libc++.so",
3637 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003638 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003639 })
Jooyung Han344d5432019-08-23 11:17:39 +09003640}
3641
Jooyung Han39edb6c2019-11-06 16:53:07 +09003642func vndkLibrariesTxtFiles(vers ...string) (result string) {
3643 for _, v := range vers {
3644 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003645 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003646 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003647 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003648 name: "` + txt + `.libraries.txt",
3649 }
3650 `
3651 }
3652 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003653 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003654 result += `
3655 prebuilt_etc {
3656 name: "` + txt + `.libraries.` + v + `.txt",
3657 src: "dummy.txt",
3658 }
3659 `
3660 }
3661 }
3662 }
3663 return
3664}
3665
Jooyung Han344d5432019-08-23 11:17:39 +09003666func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003667 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003668 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003669 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003670 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003671 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003672 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003673 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003674 }
3675
3676 apex_key {
3677 name: "myapex.key",
3678 public_key: "testkey.avbpubkey",
3679 private_key: "testkey.pem",
3680 }
3681
Jooyung Han31c470b2019-10-18 16:26:59 +09003682 vndk_prebuilt_shared {
3683 name: "libvndk27",
3684 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003685 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003686 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003687 vndk: {
3688 enabled: true,
3689 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003690 target_arch: "arm64",
3691 arch: {
3692 arm: {
3693 srcs: ["libvndk27_arm.so"],
3694 },
3695 arm64: {
3696 srcs: ["libvndk27_arm64.so"],
3697 },
3698 },
Colin Cross2807f002021-03-02 10:15:29 -08003699 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003700 }
3701
3702 vndk_prebuilt_shared {
3703 name: "libvndk27",
3704 version: "27",
3705 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003706 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003707 vndk: {
3708 enabled: true,
3709 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003710 target_arch: "x86_64",
3711 arch: {
3712 x86: {
3713 srcs: ["libvndk27_x86.so"],
3714 },
3715 x86_64: {
3716 srcs: ["libvndk27_x86_64.so"],
3717 },
3718 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003719 }
3720 `+vndkLibrariesTxtFiles("27"),
3721 withFiles(map[string][]byte{
3722 "libvndk27_arm.so": nil,
3723 "libvndk27_arm64.so": nil,
3724 "libvndk27_x86.so": nil,
3725 "libvndk27_x86_64.so": nil,
3726 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003727
Colin Cross2807f002021-03-02 10:15:29 -08003728 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003729 "lib/libvndk27_arm.so",
3730 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003731 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003732 })
Jooyung Han344d5432019-08-23 11:17:39 +09003733}
3734
Jooyung Han90eee022019-10-01 20:02:42 +09003735func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003736 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003737 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003738 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003739 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003740 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003741 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003742 }
3743 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003744 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003745 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003746 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003747 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003748 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003749 }
3750 apex_key {
3751 name: "myapex.key",
3752 public_key: "testkey.avbpubkey",
3753 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003754 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003755
3756 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003757 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003758 actual := proptools.String(bundle.properties.Apex_name)
3759 if !reflect.DeepEqual(actual, expected) {
3760 t.Errorf("Got '%v', expected '%v'", actual, expected)
3761 }
3762 }
3763
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003764 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003765 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003766}
3767
Jooyung Han344d5432019-08-23 11:17:39 +09003768func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003769 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003770 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003771 name: "com.android.vndk.current",
3772 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003773 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003774 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003775 }
3776
3777 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003778 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003779 public_key: "testkey.avbpubkey",
3780 private_key: "testkey.pem",
3781 }
3782
3783 cc_library {
3784 name: "libvndk",
3785 srcs: ["mylib.cpp"],
3786 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003787 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003788 native_bridge_supported: true,
3789 host_supported: true,
3790 vndk: {
3791 enabled: true,
3792 },
3793 system_shared_libs: [],
3794 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003795 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003796 }
Colin Cross2807f002021-03-02 10:15:29 -08003797 `+vndkLibrariesTxtFiles("current"),
3798 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003799
Colin Cross2807f002021-03-02 10:15:29 -08003800 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003801 "lib/libvndk.so",
3802 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003803 "lib/libc++.so",
3804 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003805 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003806 })
Jooyung Han344d5432019-08-23 11:17:39 +09003807}
3808
3809func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003810 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003811 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003812 name: "com.android.vndk.current",
3813 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003814 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003815 native_bridge_supported: true,
3816 }
3817
3818 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003819 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003820 public_key: "testkey.avbpubkey",
3821 private_key: "testkey.pem",
3822 }
3823
3824 cc_library {
3825 name: "libvndk",
3826 srcs: ["mylib.cpp"],
3827 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003828 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003829 native_bridge_supported: true,
3830 host_supported: true,
3831 vndk: {
3832 enabled: true,
3833 },
3834 system_shared_libs: [],
3835 stl: "none",
3836 }
3837 `)
3838}
3839
Jooyung Han31c470b2019-10-18 16:26:59 +09003840func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003841 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003842 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003843 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003844 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003845 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003846 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003847 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003848 }
3849
3850 apex_key {
3851 name: "myapex.key",
3852 public_key: "testkey.avbpubkey",
3853 private_key: "testkey.pem",
3854 }
3855
3856 vndk_prebuilt_shared {
3857 name: "libvndk27",
3858 version: "27",
3859 target_arch: "arm",
3860 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003861 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003862 vndk: {
3863 enabled: true,
3864 },
3865 arch: {
3866 arm: {
3867 srcs: ["libvndk27.so"],
3868 }
3869 },
3870 }
3871
3872 vndk_prebuilt_shared {
3873 name: "libvndk27",
3874 version: "27",
3875 target_arch: "arm",
3876 binder32bit: true,
3877 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003878 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003879 vndk: {
3880 enabled: true,
3881 },
3882 arch: {
3883 arm: {
3884 srcs: ["libvndk27binder32.so"],
3885 }
3886 },
Colin Cross2807f002021-03-02 10:15:29 -08003887 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003888 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003889 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003890 withFiles(map[string][]byte{
3891 "libvndk27.so": nil,
3892 "libvndk27binder32.so": nil,
3893 }),
3894 withBinder32bit,
3895 withTargets(map[android.OsType][]android.Target{
3896 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003897 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3898 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003899 },
3900 }),
3901 )
3902
Colin Cross2807f002021-03-02 10:15:29 -08003903 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003904 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003905 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003906 })
3907}
3908
Jooyung Han45a96772020-06-15 14:59:42 +09003909func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003910 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003911 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003912 name: "com.android.vndk.current",
3913 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003914 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003915 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003916 }
3917
3918 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003919 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003920 public_key: "testkey.avbpubkey",
3921 private_key: "testkey.pem",
3922 }
3923
3924 cc_library {
3925 name: "libz",
3926 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003927 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003928 vndk: {
3929 enabled: true,
3930 },
3931 stubs: {
3932 symbol_file: "libz.map.txt",
3933 versions: ["30"],
3934 }
3935 }
3936 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3937 "libz.map.txt": nil,
3938 }))
3939
Colin Cross2807f002021-03-02 10:15:29 -08003940 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003941 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3942 ensureListEmpty(t, provideNativeLibs)
3943}
3944
Jooyung Hane1633032019-08-01 17:41:43 +09003945func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003946 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003947 apex {
3948 name: "myapex_nodep",
3949 key: "myapex.key",
3950 native_shared_libs: ["lib_nodep"],
3951 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003952 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003953 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003954 }
3955
3956 apex {
3957 name: "myapex_dep",
3958 key: "myapex.key",
3959 native_shared_libs: ["lib_dep"],
3960 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003961 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003962 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003963 }
3964
3965 apex {
3966 name: "myapex_provider",
3967 key: "myapex.key",
3968 native_shared_libs: ["libfoo"],
3969 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003970 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003971 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003972 }
3973
3974 apex {
3975 name: "myapex_selfcontained",
3976 key: "myapex.key",
3977 native_shared_libs: ["lib_dep", "libfoo"],
3978 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003979 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003980 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003981 }
3982
3983 apex_key {
3984 name: "myapex.key",
3985 public_key: "testkey.avbpubkey",
3986 private_key: "testkey.pem",
3987 }
3988
3989 cc_library {
3990 name: "lib_nodep",
3991 srcs: ["mylib.cpp"],
3992 system_shared_libs: [],
3993 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003994 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003995 }
3996
3997 cc_library {
3998 name: "lib_dep",
3999 srcs: ["mylib.cpp"],
4000 shared_libs: ["libfoo"],
4001 system_shared_libs: [],
4002 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004003 apex_available: [
4004 "myapex_dep",
4005 "myapex_provider",
4006 "myapex_selfcontained",
4007 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004008 }
4009
4010 cc_library {
4011 name: "libfoo",
4012 srcs: ["mytest.cpp"],
4013 stubs: {
4014 versions: ["1"],
4015 },
4016 system_shared_libs: [],
4017 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004018 apex_available: [
4019 "myapex_provider",
4020 "myapex_selfcontained",
4021 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004022 }
4023 `)
4024
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004025 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004026 var provideNativeLibs, requireNativeLibs []string
4027
Sundong Ahnabb64432019-10-22 13:58:29 +09004028 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004029 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4030 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004031 ensureListEmpty(t, provideNativeLibs)
4032 ensureListEmpty(t, requireNativeLibs)
4033
Sundong Ahnabb64432019-10-22 13:58:29 +09004034 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004035 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4036 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004037 ensureListEmpty(t, provideNativeLibs)
4038 ensureListContains(t, requireNativeLibs, "libfoo.so")
4039
Sundong Ahnabb64432019-10-22 13:58:29 +09004040 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004041 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4042 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004043 ensureListContains(t, provideNativeLibs, "libfoo.so")
4044 ensureListEmpty(t, requireNativeLibs)
4045
Sundong Ahnabb64432019-10-22 13:58:29 +09004046 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004047 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4048 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004049 ensureListContains(t, provideNativeLibs, "libfoo.so")
4050 ensureListEmpty(t, requireNativeLibs)
4051}
4052
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004053func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004054 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004055 apex {
4056 name: "myapex",
4057 key: "myapex.key",
4058 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004059 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004060 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004061 }
4062
4063 apex_key {
4064 name: "myapex.key",
4065 public_key: "testkey.avbpubkey",
4066 private_key: "testkey.pem",
4067 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004068
4069 cc_library {
4070 name: "mylib",
4071 srcs: ["mylib.cpp"],
4072 system_shared_libs: [],
4073 stl: "none",
4074 apex_available: [
4075 "//apex_available:platform",
4076 "myapex",
4077 ],
4078 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004079 `)
4080
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004081 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004082 apexManifestRule := module.Rule("apexManifestRule")
4083 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4084 apexRule := module.Rule("apexRule")
4085 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004086
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004087 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004088 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004089 name := apexBundle.BaseModuleName()
4090 prefix := "TARGET_"
4091 var builder strings.Builder
4092 data.Custom(&builder, name, prefix, "", data)
4093 androidMk := builder.String()
4094 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4095 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004096}
4097
Alex Light0851b882019-02-07 13:20:53 -08004098func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004099 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004100 apex {
4101 name: "myapex",
4102 key: "myapex.key",
4103 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004104 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004105 }
4106
4107 apex_key {
4108 name: "myapex.key",
4109 public_key: "testkey.avbpubkey",
4110 private_key: "testkey.pem",
4111 }
4112
4113 cc_library {
4114 name: "mylib_common",
4115 srcs: ["mylib.cpp"],
4116 system_shared_libs: [],
4117 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004118 apex_available: [
4119 "//apex_available:platform",
4120 "myapex",
4121 ],
Alex Light0851b882019-02-07 13:20:53 -08004122 }
4123 `)
4124
Sundong Ahnabb64432019-10-22 13:58:29 +09004125 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004126 apexRule := module.Rule("apexRule")
4127 copyCmds := apexRule.Args["copy_commands"]
4128
4129 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4130 t.Log("Apex was a test apex!")
4131 t.Fail()
4132 }
4133 // Ensure that main rule creates an output
4134 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4135
4136 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004137 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004138
4139 // Ensure that both direct and indirect deps are copied into apex
4140 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4141
Colin Cross7113d202019-11-20 16:39:12 -08004142 // Ensure that the platform variant ends with _shared
4143 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004144
Colin Cross56a83212020-09-15 18:30:11 -07004145 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004146 t.Log("Found mylib_common not in any apex!")
4147 t.Fail()
4148 }
4149}
4150
4151func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004152 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004153 apex_test {
4154 name: "myapex",
4155 key: "myapex.key",
4156 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004157 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004158 }
4159
4160 apex_key {
4161 name: "myapex.key",
4162 public_key: "testkey.avbpubkey",
4163 private_key: "testkey.pem",
4164 }
4165
4166 cc_library {
4167 name: "mylib_common_test",
4168 srcs: ["mylib.cpp"],
4169 system_shared_libs: [],
4170 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004171 // TODO: remove //apex_available:platform
4172 apex_available: [
4173 "//apex_available:platform",
4174 "myapex",
4175 ],
Alex Light0851b882019-02-07 13:20:53 -08004176 }
4177 `)
4178
Sundong Ahnabb64432019-10-22 13:58:29 +09004179 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004180 apexRule := module.Rule("apexRule")
4181 copyCmds := apexRule.Args["copy_commands"]
4182
4183 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4184 t.Log("Apex was not a test apex!")
4185 t.Fail()
4186 }
4187 // Ensure that main rule creates an output
4188 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4189
4190 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004191 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004192
4193 // Ensure that both direct and indirect deps are copied into apex
4194 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4195
Colin Cross7113d202019-11-20 16:39:12 -08004196 // Ensure that the platform variant ends with _shared
4197 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004198}
4199
Alex Light9670d332019-01-29 18:07:33 -08004200func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004201 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004202 apex {
4203 name: "myapex",
4204 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004205 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004206 multilib: {
4207 first: {
4208 native_shared_libs: ["mylib_common"],
4209 }
4210 },
4211 target: {
4212 android: {
4213 multilib: {
4214 first: {
4215 native_shared_libs: ["mylib"],
4216 }
4217 }
4218 },
4219 host: {
4220 multilib: {
4221 first: {
4222 native_shared_libs: ["mylib2"],
4223 }
4224 }
4225 }
4226 }
4227 }
4228
4229 apex_key {
4230 name: "myapex.key",
4231 public_key: "testkey.avbpubkey",
4232 private_key: "testkey.pem",
4233 }
4234
4235 cc_library {
4236 name: "mylib",
4237 srcs: ["mylib.cpp"],
4238 system_shared_libs: [],
4239 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004240 // TODO: remove //apex_available:platform
4241 apex_available: [
4242 "//apex_available:platform",
4243 "myapex",
4244 ],
Alex Light9670d332019-01-29 18:07:33 -08004245 }
4246
4247 cc_library {
4248 name: "mylib_common",
4249 srcs: ["mylib.cpp"],
4250 system_shared_libs: [],
4251 stl: "none",
4252 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004253 // TODO: remove //apex_available:platform
4254 apex_available: [
4255 "//apex_available:platform",
4256 "myapex",
4257 ],
Alex Light9670d332019-01-29 18:07:33 -08004258 }
4259
4260 cc_library {
4261 name: "mylib2",
4262 srcs: ["mylib.cpp"],
4263 system_shared_libs: [],
4264 stl: "none",
4265 compile_multilib: "first",
4266 }
4267 `)
4268
Sundong Ahnabb64432019-10-22 13:58:29 +09004269 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004270 copyCmds := apexRule.Args["copy_commands"]
4271
4272 // Ensure that main rule creates an output
4273 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4274
4275 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004276 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4277 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4278 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004279
4280 // Ensure that both direct and indirect deps are copied into apex
4281 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4282 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4283 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4284
Colin Cross7113d202019-11-20 16:39:12 -08004285 // Ensure that the platform variant ends with _shared
4286 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4287 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4288 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004289}
Jiyong Park04480cf2019-02-06 00:16:29 +09004290
Jiyong Park59140302020-12-14 18:44:04 +09004291func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004292 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004293 apex {
4294 name: "myapex",
4295 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004296 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004297 arch: {
4298 arm64: {
4299 native_shared_libs: ["mylib.arm64"],
4300 },
4301 x86_64: {
4302 native_shared_libs: ["mylib.x64"],
4303 },
4304 }
4305 }
4306
4307 apex_key {
4308 name: "myapex.key",
4309 public_key: "testkey.avbpubkey",
4310 private_key: "testkey.pem",
4311 }
4312
4313 cc_library {
4314 name: "mylib.arm64",
4315 srcs: ["mylib.cpp"],
4316 system_shared_libs: [],
4317 stl: "none",
4318 // TODO: remove //apex_available:platform
4319 apex_available: [
4320 "//apex_available:platform",
4321 "myapex",
4322 ],
4323 }
4324
4325 cc_library {
4326 name: "mylib.x64",
4327 srcs: ["mylib.cpp"],
4328 system_shared_libs: [],
4329 stl: "none",
4330 // TODO: remove //apex_available:platform
4331 apex_available: [
4332 "//apex_available:platform",
4333 "myapex",
4334 ],
4335 }
4336 `)
4337
4338 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4339 copyCmds := apexRule.Args["copy_commands"]
4340
4341 // Ensure that apex variant is created for the direct dep
4342 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4343 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4344
4345 // Ensure that both direct and indirect deps are copied into apex
4346 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4347 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4348}
4349
Jiyong Park04480cf2019-02-06 00:16:29 +09004350func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004351 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004352 apex {
4353 name: "myapex",
4354 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004355 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004356 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004357 }
4358
4359 apex_key {
4360 name: "myapex.key",
4361 public_key: "testkey.avbpubkey",
4362 private_key: "testkey.pem",
4363 }
4364
4365 sh_binary {
4366 name: "myscript",
4367 src: "mylib.cpp",
4368 filename: "myscript.sh",
4369 sub_dir: "script",
4370 }
4371 `)
4372
Sundong Ahnabb64432019-10-22 13:58:29 +09004373 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004374 copyCmds := apexRule.Args["copy_commands"]
4375
4376 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4377}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004378
Jooyung Han91df2082019-11-20 01:49:42 +09004379func TestApexInVariousPartition(t *testing.T) {
4380 testcases := []struct {
4381 propName, parition, flattenedPartition string
4382 }{
4383 {"", "system", "system_ext"},
4384 {"product_specific: true", "product", "product"},
4385 {"soc_specific: true", "vendor", "vendor"},
4386 {"proprietary: true", "vendor", "vendor"},
4387 {"vendor: true", "vendor", "vendor"},
4388 {"system_ext_specific: true", "system_ext", "system_ext"},
4389 }
4390 for _, tc := range testcases {
4391 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004392 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004393 apex {
4394 name: "myapex",
4395 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004396 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004397 `+tc.propName+`
4398 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004399
Jooyung Han91df2082019-11-20 01:49:42 +09004400 apex_key {
4401 name: "myapex.key",
4402 public_key: "testkey.avbpubkey",
4403 private_key: "testkey.pem",
4404 }
4405 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004406
Jooyung Han91df2082019-11-20 01:49:42 +09004407 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004408 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4409 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004410 if actual != expected {
4411 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4412 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004413
Jooyung Han91df2082019-11-20 01:49:42 +09004414 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004415 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4416 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004417 if actual != expected {
4418 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4419 }
4420 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004421 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004422}
Jiyong Park67882562019-03-21 01:11:21 +09004423
Jooyung Han580eb4f2020-06-24 19:33:06 +09004424func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004425 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004426 apex {
4427 name: "myapex",
4428 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004429 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004430 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004431
Jooyung Han580eb4f2020-06-24 19:33:06 +09004432 apex_key {
4433 name: "myapex.key",
4434 public_key: "testkey.avbpubkey",
4435 private_key: "testkey.pem",
4436 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004437 `)
4438 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004439 rule := module.Output("file_contexts")
4440 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4441}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004442
Jooyung Han580eb4f2020-06-24 19:33:06 +09004443func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004444 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004445 apex {
4446 name: "myapex",
4447 key: "myapex.key",
4448 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004449 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004450 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004451
Jooyung Han580eb4f2020-06-24 19:33:06 +09004452 apex_key {
4453 name: "myapex.key",
4454 public_key: "testkey.avbpubkey",
4455 private_key: "testkey.pem",
4456 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004457 `, withFiles(map[string][]byte{
4458 "my_own_file_contexts": nil,
4459 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004460}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004461
Jooyung Han580eb4f2020-06-24 19:33:06 +09004462func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004463 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004464 apex {
4465 name: "myapex",
4466 key: "myapex.key",
4467 product_specific: true,
4468 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004469 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004470 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004471
Jooyung Han580eb4f2020-06-24 19:33:06 +09004472 apex_key {
4473 name: "myapex.key",
4474 public_key: "testkey.avbpubkey",
4475 private_key: "testkey.pem",
4476 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004477 `)
4478
Colin Cross1c460562021-02-16 17:55:47 -08004479 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004480 apex {
4481 name: "myapex",
4482 key: "myapex.key",
4483 product_specific: true,
4484 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004485 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004486 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004487
Jooyung Han580eb4f2020-06-24 19:33:06 +09004488 apex_key {
4489 name: "myapex.key",
4490 public_key: "testkey.avbpubkey",
4491 private_key: "testkey.pem",
4492 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004493 `, withFiles(map[string][]byte{
4494 "product_specific_file_contexts": nil,
4495 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004496 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4497 rule := module.Output("file_contexts")
4498 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4499}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004500
Jooyung Han580eb4f2020-06-24 19:33:06 +09004501func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004502 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004503 apex {
4504 name: "myapex",
4505 key: "myapex.key",
4506 product_specific: true,
4507 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004508 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004509 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004510
Jooyung Han580eb4f2020-06-24 19:33:06 +09004511 apex_key {
4512 name: "myapex.key",
4513 public_key: "testkey.avbpubkey",
4514 private_key: "testkey.pem",
4515 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004516
Jooyung Han580eb4f2020-06-24 19:33:06 +09004517 filegroup {
4518 name: "my-file-contexts",
4519 srcs: ["product_specific_file_contexts"],
4520 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004521 `, withFiles(map[string][]byte{
4522 "product_specific_file_contexts": nil,
4523 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004524 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4525 rule := module.Output("file_contexts")
4526 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004527}
4528
Jiyong Park67882562019-03-21 01:11:21 +09004529func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004530 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004531 apex_key {
4532 name: "myapex.key",
4533 public_key: ":my.avbpubkey",
4534 private_key: ":my.pem",
4535 product_specific: true,
4536 }
4537
4538 filegroup {
4539 name: "my.avbpubkey",
4540 srcs: ["testkey2.avbpubkey"],
4541 }
4542
4543 filegroup {
4544 name: "my.pem",
4545 srcs: ["testkey2.pem"],
4546 }
4547 `)
4548
4549 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4550 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004551 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004552 if actual_pubkey != expected_pubkey {
4553 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4554 }
4555 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004556 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004557 if actual_privkey != expected_privkey {
4558 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4559 }
4560}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004561
4562func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004563 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004564 prebuilt_apex {
4565 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004566 arch: {
4567 arm64: {
4568 src: "myapex-arm64.apex",
4569 },
4570 arm: {
4571 src: "myapex-arm.apex",
4572 },
4573 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004574 }
4575 `)
4576
Paul Duffin6717d882021-06-15 19:09:41 +01004577 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004578
Jiyong Parkc95714e2019-03-29 14:23:10 +09004579 expectedInput := "myapex-arm64.apex"
4580 if prebuilt.inputApex.String() != expectedInput {
4581 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4582 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004583}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004584
Paul Duffinc0609c62021-03-01 17:27:16 +00004585func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004586 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004587 prebuilt_apex {
4588 name: "myapex",
4589 }
4590 `)
4591}
4592
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004593func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004594 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004595 prebuilt_apex {
4596 name: "myapex",
4597 src: "myapex-arm.apex",
4598 filename: "notmyapex.apex",
4599 }
4600 `)
4601
Paul Duffin6717d882021-06-15 19:09:41 +01004602 p := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004603
4604 expected := "notmyapex.apex"
4605 if p.installFilename != expected {
4606 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4607 }
4608}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004609
Samiul Islam7c02e262021-09-08 17:48:28 +01004610func TestApexSetFilenameOverride(t *testing.T) {
4611 testApex(t, `
4612 apex_set {
4613 name: "com.company.android.myapex",
4614 apex_name: "com.android.myapex",
4615 set: "company-myapex.apks",
4616 filename: "com.company.android.myapex.apex"
4617 }
4618 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4619
4620 testApex(t, `
4621 apex_set {
4622 name: "com.company.android.myapex",
4623 apex_name: "com.android.myapex",
4624 set: "company-myapex.apks",
4625 filename: "com.company.android.myapex.capex"
4626 }
4627 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4628
4629 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4630 apex_set {
4631 name: "com.company.android.myapex",
4632 apex_name: "com.android.myapex",
4633 set: "company-myapex.apks",
4634 filename: "some-random-suffix"
4635 }
4636 `)
4637}
4638
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004639func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004640 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004641 prebuilt_apex {
4642 name: "myapex.prebuilt",
4643 src: "myapex-arm.apex",
4644 overrides: [
4645 "myapex",
4646 ],
4647 }
4648 `)
4649
Paul Duffin6717d882021-06-15 19:09:41 +01004650 p := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt").Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004651
4652 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004653 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004654 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004655 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004656 }
4657}
4658
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004659func TestPrebuiltApexName(t *testing.T) {
4660 testApex(t, `
4661 prebuilt_apex {
4662 name: "com.company.android.myapex",
4663 apex_name: "com.android.myapex",
4664 src: "company-myapex-arm.apex",
4665 }
4666 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4667
4668 testApex(t, `
4669 apex_set {
4670 name: "com.company.android.myapex",
4671 apex_name: "com.android.myapex",
4672 set: "company-myapex.apks",
4673 }
4674 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4675}
4676
4677func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4678 _ = android.GroupFixturePreparers(
4679 java.PrepareForTestWithJavaDefaultModules,
4680 PrepareForTestWithApexBuildComponents,
4681 android.FixtureWithRootAndroidBp(`
4682 platform_bootclasspath {
4683 name: "platform-bootclasspath",
4684 fragments: [
4685 {
4686 apex: "com.android.art",
4687 module: "art-bootclasspath-fragment",
4688 },
4689 ],
4690 }
4691
4692 prebuilt_apex {
4693 name: "com.company.android.art",
4694 apex_name: "com.android.art",
4695 src: "com.company.android.art-arm.apex",
4696 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4697 }
4698
4699 prebuilt_bootclasspath_fragment {
4700 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004701 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004702 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004703 hidden_api: {
4704 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4705 metadata: "my-bootclasspath-fragment/metadata.csv",
4706 index: "my-bootclasspath-fragment/index.csv",
4707 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4708 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4709 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004710 }
4711
4712 java_import {
4713 name: "core-oj",
4714 jars: ["prebuilt.jar"],
4715 }
4716 `),
4717 ).RunTest(t)
4718}
4719
Paul Duffin092153d2021-01-26 11:42:39 +00004720// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4721// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004722func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004723 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004724
Paul Duffin89886cb2021-02-05 16:44:03 +00004725 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004726 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004727 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004728 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004729 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004730 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004731 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4732 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4733 android.NormalizePathForTesting(dexJarBuildPath))
4734 }
4735
4736 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004737 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004738 // Make sure the import has been given the correct path to the dex jar.
4739 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4740 dexJarBuildPath := p.DexJarInstallPath()
4741 stem := android.RemoveOptionalPrebuiltPrefix(name)
4742 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4743 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4744 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004745 }
4746
Paul Duffin39853512021-02-26 11:09:39 +00004747 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004748 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004749 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004750 android.AssertArrayString(t, "Check if there is no source variant",
4751 []string{"android_common"},
4752 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004753 }
4754
4755 t.Run("prebuilt only", func(t *testing.T) {
4756 bp := `
4757 prebuilt_apex {
4758 name: "myapex",
4759 arch: {
4760 arm64: {
4761 src: "myapex-arm64.apex",
4762 },
4763 arm: {
4764 src: "myapex-arm.apex",
4765 },
4766 },
Paul Duffin39853512021-02-26 11:09:39 +00004767 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004768 }
4769
4770 java_import {
4771 name: "libfoo",
4772 jars: ["libfoo.jar"],
4773 }
Paul Duffin39853512021-02-26 11:09:39 +00004774
4775 java_sdk_library_import {
4776 name: "libbar",
4777 public: {
4778 jars: ["libbar.jar"],
4779 },
4780 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004781 `
4782
4783 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4784 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4785
Martin Stjernholm44825602021-09-17 01:44:12 +01004786 deapexerName := deapexerModuleName("myapex")
4787 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4788
Paul Duffinf6932af2021-02-26 18:21:56 +00004789 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004790 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004791 rule := deapexer.Rule("deapexer")
4792 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4793 t.Errorf("expected: %q, found: %q", expected, actual)
4794 }
4795
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004796 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004797 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004798 rule = prebuiltApex.Rule("android/soong/android.Cp")
4799 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4800 t.Errorf("expected: %q, found: %q", expected, actual)
4801 }
4802
Paul Duffin89886cb2021-02-05 16:44:03 +00004803 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004804 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004805
4806 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004807 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004808 })
4809
4810 t.Run("prebuilt with source preferred", func(t *testing.T) {
4811
4812 bp := `
4813 prebuilt_apex {
4814 name: "myapex",
4815 arch: {
4816 arm64: {
4817 src: "myapex-arm64.apex",
4818 },
4819 arm: {
4820 src: "myapex-arm.apex",
4821 },
4822 },
Paul Duffin39853512021-02-26 11:09:39 +00004823 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004824 }
4825
4826 java_import {
4827 name: "libfoo",
4828 jars: ["libfoo.jar"],
4829 }
4830
4831 java_library {
4832 name: "libfoo",
4833 }
Paul Duffin39853512021-02-26 11:09:39 +00004834
4835 java_sdk_library_import {
4836 name: "libbar",
4837 public: {
4838 jars: ["libbar.jar"],
4839 },
4840 }
4841
4842 java_sdk_library {
4843 name: "libbar",
4844 srcs: ["foo/bar/MyClass.java"],
4845 unsafe_ignore_missing_latest_api: true,
4846 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004847 `
4848
4849 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4850 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4851
Paul Duffin89886cb2021-02-05 16:44:03 +00004852 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004853 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004854 ensureNoSourceVariant(t, ctx, "libfoo")
4855
4856 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004857 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004858 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004859 })
4860
4861 t.Run("prebuilt preferred with source", func(t *testing.T) {
4862 bp := `
4863 prebuilt_apex {
4864 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004865 arch: {
4866 arm64: {
4867 src: "myapex-arm64.apex",
4868 },
4869 arm: {
4870 src: "myapex-arm.apex",
4871 },
4872 },
Paul Duffin39853512021-02-26 11:09:39 +00004873 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004874 }
4875
4876 java_import {
4877 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004878 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004879 jars: ["libfoo.jar"],
4880 }
4881
4882 java_library {
4883 name: "libfoo",
4884 }
Paul Duffin39853512021-02-26 11:09:39 +00004885
4886 java_sdk_library_import {
4887 name: "libbar",
4888 prefer: true,
4889 public: {
4890 jars: ["libbar.jar"],
4891 },
4892 }
4893
4894 java_sdk_library {
4895 name: "libbar",
4896 srcs: ["foo/bar/MyClass.java"],
4897 unsafe_ignore_missing_latest_api: true,
4898 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004899 `
4900
4901 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4902 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4903
Paul Duffin89886cb2021-02-05 16:44:03 +00004904 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004905 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004906 ensureNoSourceVariant(t, ctx, "libfoo")
4907
4908 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004909 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004910 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004911 })
4912}
4913
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004914func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004915 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004916 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004917 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4918 // is disabled.
4919 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4920 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004921
Paul Duffin37856732021-02-26 14:24:15 +00004922 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4923 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004924 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004925 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004926 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004927 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004928 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004929 foundLibfooJar = true
4930 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004931 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004932 }
4933 }
4934 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004935 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 +00004936 }
4937 }
4938
Paul Duffin40a3f652021-07-19 13:11:24 +01004939 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004940 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004941 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004942 var rule android.TestingBuildParams
4943
4944 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4945 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004946 }
4947
Paul Duffin40a3f652021-07-19 13:11:24 +01004948 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4949 t.Helper()
4950 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4951 var rule android.TestingBuildParams
4952
4953 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4954 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4955 }
4956
Paul Duffin89f570a2021-06-16 01:42:33 +01004957 fragment := java.ApexVariantReference{
4958 Apex: proptools.StringPtr("myapex"),
4959 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4960 }
4961
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004962 t.Run("prebuilt only", func(t *testing.T) {
4963 bp := `
4964 prebuilt_apex {
4965 name: "myapex",
4966 arch: {
4967 arm64: {
4968 src: "myapex-arm64.apex",
4969 },
4970 arm: {
4971 src: "myapex-arm.apex",
4972 },
4973 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004974 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4975 }
4976
4977 prebuilt_bootclasspath_fragment {
4978 name: "my-bootclasspath-fragment",
4979 contents: ["libfoo", "libbar"],
4980 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004981 hidden_api: {
4982 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4983 metadata: "my-bootclasspath-fragment/metadata.csv",
4984 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004985 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4986 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4987 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004988 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004989 }
4990
4991 java_import {
4992 name: "libfoo",
4993 jars: ["libfoo.jar"],
4994 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004995 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004996 }
Paul Duffin37856732021-02-26 14:24:15 +00004997
4998 java_sdk_library_import {
4999 name: "libbar",
5000 public: {
5001 jars: ["libbar.jar"],
5002 },
5003 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005004 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005005 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005006 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005007 `
5008
Paul Duffin89f570a2021-06-16 01:42:33 +01005009 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005010 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5011 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005012
Paul Duffin537ea3d2021-05-14 10:38:00 +01005013 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005014 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005015 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005016 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005017 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5018 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005019 })
5020
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005021 t.Run("apex_set only", func(t *testing.T) {
5022 bp := `
5023 apex_set {
5024 name: "myapex",
5025 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005026 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5027 }
5028
5029 prebuilt_bootclasspath_fragment {
5030 name: "my-bootclasspath-fragment",
5031 contents: ["libfoo", "libbar"],
5032 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005033 hidden_api: {
5034 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5035 metadata: "my-bootclasspath-fragment/metadata.csv",
5036 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005037 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5038 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5039 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005040 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005041 }
5042
5043 java_import {
5044 name: "libfoo",
5045 jars: ["libfoo.jar"],
5046 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005047 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005048 }
5049
5050 java_sdk_library_import {
5051 name: "libbar",
5052 public: {
5053 jars: ["libbar.jar"],
5054 },
5055 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005056 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005057 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005058 }
5059 `
5060
Paul Duffin89f570a2021-06-16 01:42:33 +01005061 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005062 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5063 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5064
Paul Duffin537ea3d2021-05-14 10:38:00 +01005065 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005066 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005067 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005068 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005069 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5070 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005071 })
5072
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005073 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5074 bp := `
5075 prebuilt_apex {
5076 name: "myapex",
5077 arch: {
5078 arm64: {
5079 src: "myapex-arm64.apex",
5080 },
5081 arm: {
5082 src: "myapex-arm.apex",
5083 },
5084 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005085 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5086 }
5087
5088 prebuilt_bootclasspath_fragment {
5089 name: "my-bootclasspath-fragment",
5090 contents: ["libfoo", "libbar"],
5091 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005092 hidden_api: {
5093 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5094 metadata: "my-bootclasspath-fragment/metadata.csv",
5095 index: "my-bootclasspath-fragment/index.csv",
5096 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5097 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5098 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005099 }
5100
5101 java_import {
5102 name: "libfoo",
5103 jars: ["libfoo.jar"],
5104 apex_available: ["myapex"],
5105 }
5106
5107 java_library {
5108 name: "libfoo",
5109 srcs: ["foo/bar/MyClass.java"],
5110 apex_available: ["myapex"],
5111 }
Paul Duffin37856732021-02-26 14:24:15 +00005112
5113 java_sdk_library_import {
5114 name: "libbar",
5115 public: {
5116 jars: ["libbar.jar"],
5117 },
5118 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005119 shared_library: false,
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
5130 // In this test the source (java_library) libfoo is active since the
5131 // prebuilt (java_import) defaults to prefer:false. However the
5132 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5133 // find the dex boot jar in it. We either need to disable the source libfoo
5134 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005135 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005136 // dexbootjar check is skipped if AllowMissingDependencies is true
5137 preparerAllowMissingDeps := android.GroupFixturePreparers(
5138 preparer,
5139 android.PrepareForTestWithAllowMissingDependencies,
5140 )
5141 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005142 })
5143
5144 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5145 bp := `
5146 prebuilt_apex {
5147 name: "myapex",
5148 arch: {
5149 arm64: {
5150 src: "myapex-arm64.apex",
5151 },
5152 arm: {
5153 src: "myapex-arm.apex",
5154 },
5155 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005156 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5157 }
5158
5159 prebuilt_bootclasspath_fragment {
5160 name: "my-bootclasspath-fragment",
5161 contents: ["libfoo", "libbar"],
5162 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005163 hidden_api: {
5164 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5165 metadata: "my-bootclasspath-fragment/metadata.csv",
5166 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005167 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5168 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5169 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005170 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005171 }
5172
5173 java_import {
5174 name: "libfoo",
5175 prefer: true,
5176 jars: ["libfoo.jar"],
5177 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005178 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005179 }
5180
5181 java_library {
5182 name: "libfoo",
5183 srcs: ["foo/bar/MyClass.java"],
5184 apex_available: ["myapex"],
5185 }
Paul Duffin37856732021-02-26 14:24:15 +00005186
5187 java_sdk_library_import {
5188 name: "libbar",
5189 prefer: true,
5190 public: {
5191 jars: ["libbar.jar"],
5192 },
5193 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005194 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005195 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005196 }
5197
5198 java_sdk_library {
5199 name: "libbar",
5200 srcs: ["foo/bar/MyClass.java"],
5201 unsafe_ignore_missing_latest_api: true,
5202 apex_available: ["myapex"],
5203 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005204 `
5205
Paul Duffin89f570a2021-06-16 01:42:33 +01005206 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005207 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5208 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005209
Paul Duffin537ea3d2021-05-14 10:38:00 +01005210 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005211 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005212 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005213 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005214 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5215 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005216 })
5217
5218 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5219 bp := `
5220 apex {
5221 name: "myapex",
5222 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005223 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005224 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005225 }
5226
5227 apex_key {
5228 name: "myapex.key",
5229 public_key: "testkey.avbpubkey",
5230 private_key: "testkey.pem",
5231 }
5232
5233 prebuilt_apex {
5234 name: "myapex",
5235 arch: {
5236 arm64: {
5237 src: "myapex-arm64.apex",
5238 },
5239 arm: {
5240 src: "myapex-arm.apex",
5241 },
5242 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005243 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5244 }
5245
5246 prebuilt_bootclasspath_fragment {
5247 name: "my-bootclasspath-fragment",
5248 contents: ["libfoo", "libbar"],
5249 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005250 hidden_api: {
5251 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5252 metadata: "my-bootclasspath-fragment/metadata.csv",
5253 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005254 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5255 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5256 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005257 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005258 }
5259
5260 java_import {
5261 name: "libfoo",
5262 jars: ["libfoo.jar"],
5263 apex_available: ["myapex"],
5264 }
5265
5266 java_library {
5267 name: "libfoo",
5268 srcs: ["foo/bar/MyClass.java"],
5269 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005270 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005271 }
Paul Duffin37856732021-02-26 14:24:15 +00005272
5273 java_sdk_library_import {
5274 name: "libbar",
5275 public: {
5276 jars: ["libbar.jar"],
5277 },
5278 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005279 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005280 }
5281
5282 java_sdk_library {
5283 name: "libbar",
5284 srcs: ["foo/bar/MyClass.java"],
5285 unsafe_ignore_missing_latest_api: true,
5286 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005287 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005288 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005289 `
5290
Paul Duffin89f570a2021-06-16 01:42:33 +01005291 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005292 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5293 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005294
Paul Duffin537ea3d2021-05-14 10:38:00 +01005295 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005296 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005297 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005298 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005299 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5300 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005301 })
5302
5303 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5304 bp := `
5305 apex {
5306 name: "myapex",
5307 enabled: false,
5308 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005309 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005310 }
5311
5312 apex_key {
5313 name: "myapex.key",
5314 public_key: "testkey.avbpubkey",
5315 private_key: "testkey.pem",
5316 }
5317
5318 prebuilt_apex {
5319 name: "myapex",
5320 arch: {
5321 arm64: {
5322 src: "myapex-arm64.apex",
5323 },
5324 arm: {
5325 src: "myapex-arm.apex",
5326 },
5327 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005328 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5329 }
5330
5331 prebuilt_bootclasspath_fragment {
5332 name: "my-bootclasspath-fragment",
5333 contents: ["libfoo", "libbar"],
5334 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005335 hidden_api: {
5336 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5337 metadata: "my-bootclasspath-fragment/metadata.csv",
5338 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005339 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5340 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5341 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005342 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005343 }
5344
5345 java_import {
5346 name: "libfoo",
5347 prefer: true,
5348 jars: ["libfoo.jar"],
5349 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005350 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005351 }
5352
5353 java_library {
5354 name: "libfoo",
5355 srcs: ["foo/bar/MyClass.java"],
5356 apex_available: ["myapex"],
5357 }
Paul Duffin37856732021-02-26 14:24:15 +00005358
5359 java_sdk_library_import {
5360 name: "libbar",
5361 prefer: true,
5362 public: {
5363 jars: ["libbar.jar"],
5364 },
5365 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005366 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005367 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005368 }
5369
5370 java_sdk_library {
5371 name: "libbar",
5372 srcs: ["foo/bar/MyClass.java"],
5373 unsafe_ignore_missing_latest_api: true,
5374 apex_available: ["myapex"],
5375 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005376 `
5377
Paul Duffin89f570a2021-06-16 01:42:33 +01005378 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005379 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5380 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005381
Paul Duffin537ea3d2021-05-14 10:38:00 +01005382 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005383 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005384 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005385 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005386 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5387 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005388 })
5389}
5390
Roland Levillain630846d2019-06-26 12:48:34 +01005391func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005392 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005393 apex_test {
5394 name: "myapex",
5395 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005396 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005397 tests: [
5398 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005399 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005400 ],
5401 }
5402
5403 apex_key {
5404 name: "myapex.key",
5405 public_key: "testkey.avbpubkey",
5406 private_key: "testkey.pem",
5407 }
5408
Liz Kammer1c14a212020-05-12 15:26:55 -07005409 filegroup {
5410 name: "fg",
5411 srcs: [
5412 "baz",
5413 "bar/baz"
5414 ],
5415 }
5416
Roland Levillain630846d2019-06-26 12:48:34 +01005417 cc_test {
5418 name: "mytest",
5419 gtest: false,
5420 srcs: ["mytest.cpp"],
5421 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005422 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005423 system_shared_libs: [],
5424 static_executable: true,
5425 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005426 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005427 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005428
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005429 cc_library {
5430 name: "mylib",
5431 srcs: ["mylib.cpp"],
5432 system_shared_libs: [],
5433 stl: "none",
5434 }
5435
Liz Kammer5bd365f2020-05-27 15:15:11 -07005436 filegroup {
5437 name: "fg2",
5438 srcs: [
5439 "testdata/baz"
5440 ],
5441 }
5442
Roland Levillain9b5fde92019-06-28 15:41:19 +01005443 cc_test {
5444 name: "mytests",
5445 gtest: false,
5446 srcs: [
5447 "mytest1.cpp",
5448 "mytest2.cpp",
5449 "mytest3.cpp",
5450 ],
5451 test_per_src: true,
5452 relative_install_path: "test",
5453 system_shared_libs: [],
5454 static_executable: true,
5455 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005456 data: [
5457 ":fg",
5458 ":fg2",
5459 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005460 }
Roland Levillain630846d2019-06-26 12:48:34 +01005461 `)
5462
Sundong Ahnabb64432019-10-22 13:58:29 +09005463 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005464 copyCmds := apexRule.Args["copy_commands"]
5465
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005466 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005467 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005468 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005469
Liz Kammer1c14a212020-05-12 15:26:55 -07005470 //Ensure that test data are copied into apex.
5471 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5472 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5473
Roland Levillain9b5fde92019-06-28 15:41:19 +01005474 // Ensure that test deps built with `test_per_src` are copied into apex.
5475 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5476 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5477 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005478
5479 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005480 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005481 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005482 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005483 prefix := "TARGET_"
5484 var builder strings.Builder
5485 data.Custom(&builder, name, prefix, "", data)
5486 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005487 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5488 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5489 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5490 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005491 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005492 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005493 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005494
5495 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005496 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005497 data.Custom(&builder, name, prefix, "", data)
5498 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005499 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5500 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005501}
5502
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005503func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005504 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005505 apex {
5506 name: "myapex",
5507 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005508 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005509 }
5510 apex_key {
5511 name: "myapex.key",
5512 public_key: "testkey.avbpubkey",
5513 private_key: "testkey.pem",
5514 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005515 `,
5516 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5517 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5518 }),
5519 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005520 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005521 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005522 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005523 var builder strings.Builder
5524 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5525 androidMk := builder.String()
5526 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5527}
5528
Jooyung Hand48f3c32019-08-23 11:18:57 +09005529func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5530 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5531 apex {
5532 name: "myapex",
5533 key: "myapex.key",
5534 native_shared_libs: ["libfoo"],
5535 }
5536
5537 apex_key {
5538 name: "myapex.key",
5539 public_key: "testkey.avbpubkey",
5540 private_key: "testkey.pem",
5541 }
5542
5543 cc_library {
5544 name: "libfoo",
5545 stl: "none",
5546 system_shared_libs: [],
5547 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005548 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005549 }
5550 `)
5551 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5552 apex {
5553 name: "myapex",
5554 key: "myapex.key",
5555 java_libs: ["myjar"],
5556 }
5557
5558 apex_key {
5559 name: "myapex.key",
5560 public_key: "testkey.avbpubkey",
5561 private_key: "testkey.pem",
5562 }
5563
5564 java_library {
5565 name: "myjar",
5566 srcs: ["foo/bar/MyClass.java"],
5567 sdk_version: "none",
5568 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005569 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005570 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005571 }
5572 `)
5573}
5574
Bill Peckhama41a6962021-01-11 10:58:54 -08005575func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005576 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005577 apex {
5578 name: "myapex",
5579 key: "myapex.key",
5580 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005581 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005582 }
5583
5584 apex_key {
5585 name: "myapex.key",
5586 public_key: "testkey.avbpubkey",
5587 private_key: "testkey.pem",
5588 }
5589
5590 java_import {
5591 name: "myjavaimport",
5592 apex_available: ["myapex"],
5593 jars: ["my.jar"],
5594 compile_dex: true,
5595 }
5596 `)
5597
5598 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5599 apexRule := module.Rule("apexRule")
5600 copyCmds := apexRule.Args["copy_commands"]
5601 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5602}
5603
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005604func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005605 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005606 apex {
5607 name: "myapex",
5608 key: "myapex.key",
5609 apps: [
5610 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005611 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005612 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005613 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005614 }
5615
5616 apex_key {
5617 name: "myapex.key",
5618 public_key: "testkey.avbpubkey",
5619 private_key: "testkey.pem",
5620 }
5621
5622 android_app {
5623 name: "AppFoo",
5624 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005625 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005626 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005627 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005628 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005629 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005630 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005631
5632 android_app {
5633 name: "AppFooPriv",
5634 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005635 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005636 system_modules: "none",
5637 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005638 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005639 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005640 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005641
5642 cc_library_shared {
5643 name: "libjni",
5644 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005645 shared_libs: ["libfoo"],
5646 stl: "none",
5647 system_shared_libs: [],
5648 apex_available: [ "myapex" ],
5649 sdk_version: "current",
5650 }
5651
5652 cc_library_shared {
5653 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005654 stl: "none",
5655 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005656 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005657 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005658 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005659 `)
5660
Sundong Ahnabb64432019-10-22 13:58:29 +09005661 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005662 apexRule := module.Rule("apexRule")
5663 copyCmds := apexRule.Args["copy_commands"]
5664
5665 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005666 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005667
Colin Crossaede88c2020-08-11 12:17:01 -07005668 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005669 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005670 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005671 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005672 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005673 // JNI libraries including transitive deps are
5674 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005675 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005676 // ... embedded inside APK (jnilibs.zip)
5677 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5678 // ... and not directly inside the APEX
5679 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5680 }
Dario Frenicde2a032019-10-27 00:29:22 +01005681}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005682
Dario Frenicde2a032019-10-27 00:29:22 +01005683func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005684 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005685 apex {
5686 name: "myapex",
5687 key: "myapex.key",
5688 apps: [
5689 "AppFooPrebuilt",
5690 "AppFooPrivPrebuilt",
5691 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005692 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005693 }
5694
5695 apex_key {
5696 name: "myapex.key",
5697 public_key: "testkey.avbpubkey",
5698 private_key: "testkey.pem",
5699 }
5700
5701 android_app_import {
5702 name: "AppFooPrebuilt",
5703 apk: "PrebuiltAppFoo.apk",
5704 presigned: true,
5705 dex_preopt: {
5706 enabled: false,
5707 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005708 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005709 }
5710
5711 android_app_import {
5712 name: "AppFooPrivPrebuilt",
5713 apk: "PrebuiltAppFooPriv.apk",
5714 privileged: true,
5715 presigned: true,
5716 dex_preopt: {
5717 enabled: false,
5718 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005719 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005720 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005721 }
5722 `)
5723
Sundong Ahnabb64432019-10-22 13:58:29 +09005724 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005725 apexRule := module.Rule("apexRule")
5726 copyCmds := apexRule.Args["copy_commands"]
5727
5728 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005729 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5730}
5731
5732func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005733 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005734 apex {
5735 name: "myapex",
5736 key: "myapex.key",
5737 apps: [
5738 "AppFoo",
5739 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005740 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005741 }
5742
5743 apex_key {
5744 name: "myapex.key",
5745 public_key: "testkey.avbpubkey",
5746 private_key: "testkey.pem",
5747 }
5748
5749 android_app {
5750 name: "AppFoo",
5751 srcs: ["foo/bar/MyClass.java"],
5752 sdk_version: "none",
5753 system_modules: "none",
5754 apex_available: [ "myapex" ],
5755 }
5756
5757 android_app_import {
5758 name: "AppFoo",
5759 apk: "AppFooPrebuilt.apk",
5760 filename: "AppFooPrebuilt.apk",
5761 presigned: true,
5762 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005763 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005764 }
5765 `, withFiles(map[string][]byte{
5766 "AppFooPrebuilt.apk": nil,
5767 }))
5768
5769 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005770 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005771 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005772}
5773
Dario Freni6f3937c2019-12-20 22:58:03 +00005774func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005775 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005776 apex {
5777 name: "myapex",
5778 key: "myapex.key",
5779 apps: [
5780 "TesterHelpAppFoo",
5781 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005782 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005783 }
5784
5785 apex_key {
5786 name: "myapex.key",
5787 public_key: "testkey.avbpubkey",
5788 private_key: "testkey.pem",
5789 }
5790
5791 android_test_helper_app {
5792 name: "TesterHelpAppFoo",
5793 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005794 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005795 }
5796
5797 `)
5798
5799 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5800 apexRule := module.Rule("apexRule")
5801 copyCmds := apexRule.Args["copy_commands"]
5802
5803 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5804}
5805
Jooyung Han18020ea2019-11-13 10:50:48 +09005806func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5807 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005808 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005809 apex {
5810 name: "myapex",
5811 key: "myapex.key",
5812 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005813 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005814 }
5815
5816 apex_key {
5817 name: "myapex.key",
5818 public_key: "testkey.avbpubkey",
5819 private_key: "testkey.pem",
5820 }
5821
5822 apex {
5823 name: "otherapex",
5824 key: "myapex.key",
5825 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005826 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005827 }
5828
5829 cc_defaults {
5830 name: "libfoo-defaults",
5831 apex_available: ["otherapex"],
5832 }
5833
5834 cc_library {
5835 name: "libfoo",
5836 defaults: ["libfoo-defaults"],
5837 stl: "none",
5838 system_shared_libs: [],
5839 }`)
5840}
5841
Paul Duffine52e66f2020-03-30 17:54:29 +01005842func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005843 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005844 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005845 apex {
5846 name: "myapex",
5847 key: "myapex.key",
5848 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005849 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005850 }
5851
5852 apex_key {
5853 name: "myapex.key",
5854 public_key: "testkey.avbpubkey",
5855 private_key: "testkey.pem",
5856 }
5857
5858 apex {
5859 name: "otherapex",
5860 key: "otherapex.key",
5861 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005862 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005863 }
5864
5865 apex_key {
5866 name: "otherapex.key",
5867 public_key: "testkey.avbpubkey",
5868 private_key: "testkey.pem",
5869 }
5870
5871 cc_library {
5872 name: "libfoo",
5873 stl: "none",
5874 system_shared_libs: [],
5875 apex_available: ["otherapex"],
5876 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005877}
Jiyong Park127b40b2019-09-30 16:04:35 +09005878
Paul Duffine52e66f2020-03-30 17:54:29 +01005879func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005880 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005881 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005882.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005883.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005884.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005885.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005886.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005887.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005888 apex {
5889 name: "myapex",
5890 key: "myapex.key",
5891 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005892 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005893 }
5894
5895 apex_key {
5896 name: "myapex.key",
5897 public_key: "testkey.avbpubkey",
5898 private_key: "testkey.pem",
5899 }
5900
Jiyong Park127b40b2019-09-30 16:04:35 +09005901 cc_library {
5902 name: "libfoo",
5903 stl: "none",
5904 shared_libs: ["libbar"],
5905 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005906 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005907 }
5908
5909 cc_library {
5910 name: "libbar",
5911 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005912 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005913 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005914 apex_available: ["myapex"],
5915 }
5916
5917 cc_library {
5918 name: "libbaz",
5919 stl: "none",
5920 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005921 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005922}
Jiyong Park127b40b2019-09-30 16:04:35 +09005923
Paul Duffine52e66f2020-03-30 17:54:29 +01005924func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005925 testApexError(t, "\"otherapex\" is not a valid module name", `
5926 apex {
5927 name: "myapex",
5928 key: "myapex.key",
5929 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005930 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005931 }
5932
5933 apex_key {
5934 name: "myapex.key",
5935 public_key: "testkey.avbpubkey",
5936 private_key: "testkey.pem",
5937 }
5938
5939 cc_library {
5940 name: "libfoo",
5941 stl: "none",
5942 system_shared_libs: [],
5943 apex_available: ["otherapex"],
5944 }`)
5945
Paul Duffine52e66f2020-03-30 17:54:29 +01005946 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005947 apex {
5948 name: "myapex",
5949 key: "myapex.key",
5950 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005951 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005952 }
5953
5954 apex_key {
5955 name: "myapex.key",
5956 public_key: "testkey.avbpubkey",
5957 private_key: "testkey.pem",
5958 }
5959
5960 cc_library {
5961 name: "libfoo",
5962 stl: "none",
5963 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005964 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005965 apex_available: ["myapex"],
5966 }
5967
5968 cc_library {
5969 name: "libbar",
5970 stl: "none",
5971 system_shared_libs: [],
5972 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005973 }
5974
5975 cc_library {
5976 name: "libbaz",
5977 stl: "none",
5978 system_shared_libs: [],
5979 stubs: {
5980 versions: ["10", "20", "30"],
5981 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005982 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005983}
Jiyong Park127b40b2019-09-30 16:04:35 +09005984
Jiyong Park89e850a2020-04-07 16:37:39 +09005985func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005986 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005987 apex {
5988 name: "myapex",
5989 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005990 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005991 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005992 }
5993
5994 apex_key {
5995 name: "myapex.key",
5996 public_key: "testkey.avbpubkey",
5997 private_key: "testkey.pem",
5998 }
5999
6000 cc_library {
6001 name: "libfoo",
6002 stl: "none",
6003 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006004 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006005 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006006 }
6007
6008 cc_library {
6009 name: "libfoo2",
6010 stl: "none",
6011 system_shared_libs: [],
6012 shared_libs: ["libbaz"],
6013 apex_available: ["//apex_available:platform"],
6014 }
6015
6016 cc_library {
6017 name: "libbar",
6018 stl: "none",
6019 system_shared_libs: [],
6020 apex_available: ["myapex"],
6021 }
6022
6023 cc_library {
6024 name: "libbaz",
6025 stl: "none",
6026 system_shared_libs: [],
6027 apex_available: ["myapex"],
6028 stubs: {
6029 versions: ["1"],
6030 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006031 }`)
6032
Jiyong Park89e850a2020-04-07 16:37:39 +09006033 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6034 // because it depends on libbar which isn't available to platform
6035 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6036 if libfoo.NotAvailableForPlatform() != true {
6037 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6038 }
6039
6040 // libfoo2 however can be available to platform because it depends on libbaz which provides
6041 // stubs
6042 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6043 if libfoo2.NotAvailableForPlatform() == true {
6044 t.Errorf("%q should be available to platform", libfoo2.String())
6045 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006046}
Jiyong Parka90ca002019-10-07 15:47:24 +09006047
Paul Duffine52e66f2020-03-30 17:54:29 +01006048func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006049 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006050 apex {
6051 name: "myapex",
6052 key: "myapex.key",
6053 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006054 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006055 }
6056
6057 apex_key {
6058 name: "myapex.key",
6059 public_key: "testkey.avbpubkey",
6060 private_key: "testkey.pem",
6061 }
6062
6063 cc_library {
6064 name: "libfoo",
6065 stl: "none",
6066 system_shared_libs: [],
6067 apex_available: ["myapex"],
6068 static: {
6069 apex_available: ["//apex_available:platform"],
6070 },
6071 }`)
6072
Jiyong Park89e850a2020-04-07 16:37:39 +09006073 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6074 if libfooShared.NotAvailableForPlatform() != true {
6075 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6076 }
6077 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6078 if libfooStatic.NotAvailableForPlatform() != false {
6079 t.Errorf("%q should be available to platform", libfooStatic.String())
6080 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006081}
6082
Jiyong Park5d790c32019-11-15 18:40:32 +09006083func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006084 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006085 apex {
6086 name: "myapex",
6087 key: "myapex.key",
6088 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006089 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006090 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006091 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006092 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006093 }
6094
6095 override_apex {
6096 name: "override_myapex",
6097 base: "myapex",
6098 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08006099 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006100 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006101 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006102 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006103 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006104 key: "mynewapex.key",
6105 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006106 }
6107
6108 apex_key {
6109 name: "myapex.key",
6110 public_key: "testkey.avbpubkey",
6111 private_key: "testkey.pem",
6112 }
6113
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006114 apex_key {
6115 name: "mynewapex.key",
6116 public_key: "testkey2.avbpubkey",
6117 private_key: "testkey2.pem",
6118 }
6119
6120 android_app_certificate {
6121 name: "myapex.certificate",
6122 certificate: "testkey",
6123 }
6124
Jiyong Park5d790c32019-11-15 18:40:32 +09006125 android_app {
6126 name: "app",
6127 srcs: ["foo/bar/MyClass.java"],
6128 package_name: "foo",
6129 sdk_version: "none",
6130 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006131 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006132 }
6133
6134 override_android_app {
6135 name: "override_app",
6136 base: "app",
6137 package_name: "bar",
6138 }
markchien7c803b82021-08-26 22:10:06 +08006139
6140 bpf {
6141 name: "bpf",
6142 srcs: ["bpf.c"],
6143 }
6144
6145 bpf {
6146 name: "override_bpf",
6147 srcs: ["override_bpf.c"],
6148 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006149
6150 prebuilt_etc {
6151 name: "myetc",
6152 src: "myprebuilt",
6153 }
6154
6155 prebuilt_etc {
6156 name: "override_myetc",
6157 src: "override_myprebuilt",
6158 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006159 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006160
Jiyong Park317645e2019-12-05 13:20:58 +09006161 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6162 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6163 if originalVariant.GetOverriddenBy() != "" {
6164 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6165 }
6166 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6167 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6168 }
6169
Jiyong Park5d790c32019-11-15 18:40:32 +09006170 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6171 apexRule := module.Rule("apexRule")
6172 copyCmds := apexRule.Args["copy_commands"]
6173
6174 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006175 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006176
markchien7c803b82021-08-26 22:10:06 +08006177 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6178 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6179
Daniel Norman5a3ce132021-08-26 15:44:43 -07006180 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6181 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6182
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006183 apexBundle := module.Module().(*apexBundle)
6184 name := apexBundle.Name()
6185 if name != "override_myapex" {
6186 t.Errorf("name should be \"override_myapex\", but was %q", name)
6187 }
6188
Baligh Uddin004d7172020-02-19 21:29:28 -08006189 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6190 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6191 }
6192
Jiyong Park20bacab2020-03-03 11:45:41 +09006193 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006194 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006195 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6196
6197 signApkRule := module.Rule("signapk")
6198 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006199
Colin Crossaa255532020-07-03 13:18:24 -07006200 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006201 var builder strings.Builder
6202 data.Custom(&builder, name, "TARGET_", "", data)
6203 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006204 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006205 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006206 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
6207 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006208 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006209 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006210 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006211 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006212 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6213 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006214}
6215
Jooyung Han214bf372019-11-12 13:03:50 +09006216func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006217 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006218 apex {
6219 name: "myapex",
6220 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006221 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006222 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006223 }
6224
6225 apex_key {
6226 name: "myapex.key",
6227 public_key: "testkey.avbpubkey",
6228 private_key: "testkey.pem",
6229 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006230
6231 cc_library {
6232 name: "mylib",
6233 srcs: ["mylib.cpp"],
6234 stl: "libc++",
6235 system_shared_libs: [],
6236 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006237 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006238 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006239 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006240
6241 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6242 args := module.Rule("apexRule").Args
6243 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006244 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006245
6246 // The copies of the libraries in the apex should have one more dependency than
6247 // the ones outside the apex, namely the unwinder. Ideally we should check
6248 // the dependency names directly here but for some reason the names are blank in
6249 // this test.
6250 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006251 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006252 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6253 if len(apexImplicits) != len(nonApexImplicits)+1 {
6254 t.Errorf("%q missing unwinder dep", lib)
6255 }
6256 }
Jooyung Han214bf372019-11-12 13:03:50 +09006257}
6258
Paul Duffine05480a2021-03-08 15:07:14 +00006259var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006260 "api/current.txt": nil,
6261 "api/removed.txt": nil,
6262 "api/system-current.txt": nil,
6263 "api/system-removed.txt": nil,
6264 "api/test-current.txt": nil,
6265 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006266
Anton Hanssondff2c782020-12-21 17:10:01 +00006267 "100/public/api/foo.txt": nil,
6268 "100/public/api/foo-removed.txt": nil,
6269 "100/system/api/foo.txt": nil,
6270 "100/system/api/foo-removed.txt": nil,
6271
Paul Duffineedc5d52020-06-12 17:46:39 +01006272 // For java_sdk_library_import
6273 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006274}
6275
Jooyung Han58f26ab2019-12-18 15:34:32 +09006276func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006277 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006278 apex {
6279 name: "myapex",
6280 key: "myapex.key",
6281 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006282 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006283 }
6284
6285 apex_key {
6286 name: "myapex.key",
6287 public_key: "testkey.avbpubkey",
6288 private_key: "testkey.pem",
6289 }
6290
6291 java_sdk_library {
6292 name: "foo",
6293 srcs: ["a.java"],
6294 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006295 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006296 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006297
6298 prebuilt_apis {
6299 name: "sdk",
6300 api_dirs: ["100"],
6301 }
Paul Duffin9b879592020-05-26 13:21:35 +01006302 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006303
6304 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006305 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006306 "javalib/foo.jar",
6307 "etc/permissions/foo.xml",
6308 })
6309 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006310 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006311 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 +09006312}
6313
Paul Duffin9b879592020-05-26 13:21:35 +01006314func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006315 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006316 apex {
6317 name: "myapex",
6318 key: "myapex.key",
6319 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006320 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006321 }
6322
6323 apex_key {
6324 name: "myapex.key",
6325 public_key: "testkey.avbpubkey",
6326 private_key: "testkey.pem",
6327 }
6328
6329 java_sdk_library {
6330 name: "foo",
6331 srcs: ["a.java"],
6332 api_packages: ["foo"],
6333 apex_available: ["myapex"],
6334 sdk_version: "none",
6335 system_modules: "none",
6336 }
6337
6338 java_library {
6339 name: "bar",
6340 srcs: ["a.java"],
6341 libs: ["foo"],
6342 apex_available: ["myapex"],
6343 sdk_version: "none",
6344 system_modules: "none",
6345 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006346
6347 prebuilt_apis {
6348 name: "sdk",
6349 api_dirs: ["100"],
6350 }
Paul Duffin9b879592020-05-26 13:21:35 +01006351 `, withFiles(filesForSdkLibrary))
6352
6353 // java_sdk_library installs both impl jar and permission XML
6354 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6355 "javalib/bar.jar",
6356 "javalib/foo.jar",
6357 "etc/permissions/foo.xml",
6358 })
6359
6360 // The bar library should depend on the implementation jar.
6361 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006362 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006363 t.Errorf("expected %q, found %#q", expected, actual)
6364 }
6365}
6366
6367func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006368 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006369 apex {
6370 name: "myapex",
6371 key: "myapex.key",
6372 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006373 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006374 }
6375
6376 apex_key {
6377 name: "myapex.key",
6378 public_key: "testkey.avbpubkey",
6379 private_key: "testkey.pem",
6380 }
6381
6382 java_sdk_library {
6383 name: "foo",
6384 srcs: ["a.java"],
6385 api_packages: ["foo"],
6386 apex_available: ["myapex"],
6387 sdk_version: "none",
6388 system_modules: "none",
6389 }
6390
6391 java_library {
6392 name: "bar",
6393 srcs: ["a.java"],
6394 libs: ["foo"],
6395 sdk_version: "none",
6396 system_modules: "none",
6397 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006398
6399 prebuilt_apis {
6400 name: "sdk",
6401 api_dirs: ["100"],
6402 }
Paul Duffin9b879592020-05-26 13:21:35 +01006403 `, withFiles(filesForSdkLibrary))
6404
6405 // java_sdk_library installs both impl jar and permission XML
6406 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6407 "javalib/foo.jar",
6408 "etc/permissions/foo.xml",
6409 })
6410
6411 // The bar library should depend on the stubs jar.
6412 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006413 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006414 t.Errorf("expected %q, found %#q", expected, actual)
6415 }
6416}
6417
Paul Duffineedc5d52020-06-12 17:46:39 +01006418func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006419 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006420 prebuilt_apis {
6421 name: "sdk",
6422 api_dirs: ["100"],
6423 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006424 withFiles(map[string][]byte{
6425 "apex/a.java": nil,
6426 "apex/apex_manifest.json": nil,
6427 "apex/Android.bp": []byte(`
6428 package {
6429 default_visibility: ["//visibility:private"],
6430 }
6431
6432 apex {
6433 name: "myapex",
6434 key: "myapex.key",
6435 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006436 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006437 }
6438
6439 apex_key {
6440 name: "myapex.key",
6441 public_key: "testkey.avbpubkey",
6442 private_key: "testkey.pem",
6443 }
6444
6445 java_library {
6446 name: "bar",
6447 srcs: ["a.java"],
6448 libs: ["foo"],
6449 apex_available: ["myapex"],
6450 sdk_version: "none",
6451 system_modules: "none",
6452 }
6453`),
6454 "source/a.java": nil,
6455 "source/api/current.txt": nil,
6456 "source/api/removed.txt": nil,
6457 "source/Android.bp": []byte(`
6458 package {
6459 default_visibility: ["//visibility:private"],
6460 }
6461
6462 java_sdk_library {
6463 name: "foo",
6464 visibility: ["//apex"],
6465 srcs: ["a.java"],
6466 api_packages: ["foo"],
6467 apex_available: ["myapex"],
6468 sdk_version: "none",
6469 system_modules: "none",
6470 public: {
6471 enabled: true,
6472 },
6473 }
6474`),
6475 "prebuilt/a.jar": nil,
6476 "prebuilt/Android.bp": []byte(`
6477 package {
6478 default_visibility: ["//visibility:private"],
6479 }
6480
6481 java_sdk_library_import {
6482 name: "foo",
6483 visibility: ["//apex", "//source"],
6484 apex_available: ["myapex"],
6485 prefer: true,
6486 public: {
6487 jars: ["a.jar"],
6488 },
6489 }
6490`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006491 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006492 )
6493
6494 // java_sdk_library installs both impl jar and permission XML
6495 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6496 "javalib/bar.jar",
6497 "javalib/foo.jar",
6498 "etc/permissions/foo.xml",
6499 })
6500
6501 // The bar library should depend on the implementation jar.
6502 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006503 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006504 t.Errorf("expected %q, found %#q", expected, actual)
6505 }
6506}
6507
6508func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6509 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6510 apex {
6511 name: "myapex",
6512 key: "myapex.key",
6513 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006514 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006515 }
6516
6517 apex_key {
6518 name: "myapex.key",
6519 public_key: "testkey.avbpubkey",
6520 private_key: "testkey.pem",
6521 }
6522
6523 java_sdk_library_import {
6524 name: "foo",
6525 apex_available: ["myapex"],
6526 prefer: true,
6527 public: {
6528 jars: ["a.jar"],
6529 },
6530 }
6531
6532 `, withFiles(filesForSdkLibrary))
6533}
6534
atrost6e126252020-01-27 17:01:16 +00006535func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006536 result := android.GroupFixturePreparers(
6537 prepareForApexTest,
6538 java.PrepareForTestWithPlatformCompatConfig,
6539 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006540 apex {
6541 name: "myapex",
6542 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006543 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006544 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006545 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006546 }
6547
6548 apex_key {
6549 name: "myapex.key",
6550 public_key: "testkey.avbpubkey",
6551 private_key: "testkey.pem",
6552 }
6553
6554 platform_compat_config {
6555 name: "myjar-platform-compat-config",
6556 src: ":myjar",
6557 }
6558
6559 java_library {
6560 name: "myjar",
6561 srcs: ["foo/bar/MyClass.java"],
6562 sdk_version: "none",
6563 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006564 apex_available: [ "myapex" ],
6565 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006566
6567 // Make sure that a preferred prebuilt does not affect the apex contents.
6568 prebuilt_platform_compat_config {
6569 name: "myjar-platform-compat-config",
6570 metadata: "compat-config/metadata.xml",
6571 prefer: true,
6572 }
atrost6e126252020-01-27 17:01:16 +00006573 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006574 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006575 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6576 "etc/compatconfig/myjar-platform-compat-config.xml",
6577 "javalib/myjar.jar",
6578 })
6579}
6580
Jiyong Park479321d2019-12-16 11:47:12 +09006581func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6582 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6583 apex {
6584 name: "myapex",
6585 key: "myapex.key",
6586 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006587 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006588 }
6589
6590 apex_key {
6591 name: "myapex.key",
6592 public_key: "testkey.avbpubkey",
6593 private_key: "testkey.pem",
6594 }
6595
6596 java_library {
6597 name: "myjar",
6598 srcs: ["foo/bar/MyClass.java"],
6599 sdk_version: "none",
6600 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006601 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006602 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006603 }
6604 `)
6605}
6606
Jiyong Park7afd1072019-12-30 16:56:33 +09006607func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006608 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006609 apex {
6610 name: "myapex",
6611 key: "myapex.key",
6612 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006613 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006614 }
6615
6616 apex_key {
6617 name: "myapex.key",
6618 public_key: "testkey.avbpubkey",
6619 private_key: "testkey.pem",
6620 }
6621
6622 cc_library {
6623 name: "mylib",
6624 srcs: ["mylib.cpp"],
6625 system_shared_libs: [],
6626 stl: "none",
6627 required: ["a", "b"],
6628 host_required: ["c", "d"],
6629 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006630 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006631 }
6632 `)
6633
6634 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006635 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006636 name := apexBundle.BaseModuleName()
6637 prefix := "TARGET_"
6638 var builder strings.Builder
6639 data.Custom(&builder, name, prefix, "", data)
6640 androidMk := builder.String()
6641 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6642 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6643 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6644}
6645
Jiyong Park7cd10e32020-01-14 09:22:18 +09006646func TestSymlinksFromApexToSystem(t *testing.T) {
6647 bp := `
6648 apex {
6649 name: "myapex",
6650 key: "myapex.key",
6651 native_shared_libs: ["mylib"],
6652 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006653 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006654 }
6655
Jiyong Park9d677202020-02-19 16:29:35 +09006656 apex {
6657 name: "myapex.updatable",
6658 key: "myapex.key",
6659 native_shared_libs: ["mylib"],
6660 java_libs: ["myjar"],
6661 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006662 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006663 }
6664
Jiyong Park7cd10e32020-01-14 09:22:18 +09006665 apex_key {
6666 name: "myapex.key",
6667 public_key: "testkey.avbpubkey",
6668 private_key: "testkey.pem",
6669 }
6670
6671 cc_library {
6672 name: "mylib",
6673 srcs: ["mylib.cpp"],
6674 shared_libs: ["myotherlib"],
6675 system_shared_libs: [],
6676 stl: "none",
6677 apex_available: [
6678 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006679 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006680 "//apex_available:platform",
6681 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006682 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006683 }
6684
6685 cc_library {
6686 name: "myotherlib",
6687 srcs: ["mylib.cpp"],
6688 system_shared_libs: [],
6689 stl: "none",
6690 apex_available: [
6691 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006692 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006693 "//apex_available:platform",
6694 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006695 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006696 }
6697
6698 java_library {
6699 name: "myjar",
6700 srcs: ["foo/bar/MyClass.java"],
6701 sdk_version: "none",
6702 system_modules: "none",
6703 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006704 apex_available: [
6705 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006706 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006707 "//apex_available:platform",
6708 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006709 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006710 }
6711
6712 java_library {
6713 name: "myotherjar",
6714 srcs: ["foo/bar/MyClass.java"],
6715 sdk_version: "none",
6716 system_modules: "none",
6717 apex_available: [
6718 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006719 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006720 "//apex_available:platform",
6721 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006722 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006723 }
6724 `
6725
6726 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6727 for _, f := range files {
6728 if f.path == file {
6729 if f.isLink {
6730 t.Errorf("%q is not a real file", file)
6731 }
6732 return
6733 }
6734 }
6735 t.Errorf("%q is not found", file)
6736 }
6737
6738 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6739 for _, f := range files {
6740 if f.path == file {
6741 if !f.isLink {
6742 t.Errorf("%q is not a symlink", file)
6743 }
6744 return
6745 }
6746 }
6747 t.Errorf("%q is not found", file)
6748 }
6749
Jiyong Park9d677202020-02-19 16:29:35 +09006750 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6751 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006752 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006753 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006754 ensureRealfileExists(t, files, "javalib/myjar.jar")
6755 ensureRealfileExists(t, files, "lib64/mylib.so")
6756 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6757
Jiyong Park9d677202020-02-19 16:29:35 +09006758 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6759 ensureRealfileExists(t, files, "javalib/myjar.jar")
6760 ensureRealfileExists(t, files, "lib64/mylib.so")
6761 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6762
6763 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006764 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006765 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006766 ensureRealfileExists(t, files, "javalib/myjar.jar")
6767 ensureRealfileExists(t, files, "lib64/mylib.so")
6768 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006769
6770 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6771 ensureRealfileExists(t, files, "javalib/myjar.jar")
6772 ensureRealfileExists(t, files, "lib64/mylib.so")
6773 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006774}
6775
Yo Chiange8128052020-07-23 20:09:18 +08006776func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006777 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006778 apex {
6779 name: "myapex",
6780 key: "myapex.key",
6781 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006782 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006783 }
6784
6785 apex_key {
6786 name: "myapex.key",
6787 public_key: "testkey.avbpubkey",
6788 private_key: "testkey.pem",
6789 }
6790
6791 cc_library_shared {
6792 name: "mylib",
6793 srcs: ["mylib.cpp"],
6794 shared_libs: ["myotherlib"],
6795 system_shared_libs: [],
6796 stl: "none",
6797 apex_available: [
6798 "myapex",
6799 "//apex_available:platform",
6800 ],
6801 }
6802
6803 cc_prebuilt_library_shared {
6804 name: "myotherlib",
6805 srcs: ["prebuilt.so"],
6806 system_shared_libs: [],
6807 stl: "none",
6808 apex_available: [
6809 "myapex",
6810 "//apex_available:platform",
6811 ],
6812 }
6813 `)
6814
6815 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006816 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006817 var builder strings.Builder
6818 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6819 androidMk := builder.String()
6820 // `myotherlib` is added to `myapex` as symlink
6821 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6822 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6823 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6824 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006825 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 +08006826}
6827
Jooyung Han643adc42020-02-27 13:50:06 +09006828func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006829 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006830 apex {
6831 name: "myapex",
6832 key: "myapex.key",
6833 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006834 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006835 }
6836
6837 apex_key {
6838 name: "myapex.key",
6839 public_key: "testkey.avbpubkey",
6840 private_key: "testkey.pem",
6841 }
6842
6843 cc_library {
6844 name: "mylib",
6845 srcs: ["mylib.cpp"],
6846 shared_libs: ["mylib2"],
6847 system_shared_libs: [],
6848 stl: "none",
6849 apex_available: [ "myapex" ],
6850 }
6851
6852 cc_library {
6853 name: "mylib2",
6854 srcs: ["mylib.cpp"],
6855 system_shared_libs: [],
6856 stl: "none",
6857 apex_available: [ "myapex" ],
6858 }
6859 `)
6860
6861 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6862 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6863 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6864 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6865 "lib64/mylib.so",
6866 "lib64/mylib2.so",
6867 })
6868}
6869
Jooyung Han49f67012020-04-17 13:43:10 +09006870func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006871 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006872 apex {
6873 name: "myapex",
6874 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006875 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006876 }
6877 apex_key {
6878 name: "myapex.key",
6879 public_key: "testkey.avbpubkey",
6880 private_key: "testkey.pem",
6881 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006882 `,
6883 android.FixtureModifyConfig(func(config android.Config) {
6884 delete(config.Targets, android.Android)
6885 config.AndroidCommonTarget = android.Target{}
6886 }),
6887 )
Jooyung Han49f67012020-04-17 13:43:10 +09006888
6889 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6890 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6891 }
6892}
6893
Jiyong Parkbd159612020-02-28 15:22:21 +09006894func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006895 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006896 apex {
6897 name: "myapex",
6898 key: "myapex.key",
6899 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006900 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006901 }
6902
6903 apex_key {
6904 name: "myapex.key",
6905 public_key: "testkey.avbpubkey",
6906 private_key: "testkey.pem",
6907 }
6908
6909 android_app {
6910 name: "AppFoo",
6911 srcs: ["foo/bar/MyClass.java"],
6912 sdk_version: "none",
6913 system_modules: "none",
6914 apex_available: [ "myapex" ],
6915 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006916 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006917
Colin Crosscf371cc2020-11-13 11:48:42 -08006918 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006919 content := bundleConfigRule.Args["content"]
6920
6921 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006922 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 +09006923}
6924
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006925func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006926 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006927 apex {
6928 name: "myapex",
6929 key: "myapex.key",
6930 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006931 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006932 }
6933
6934 apex_key {
6935 name: "myapex.key",
6936 public_key: "testkey.avbpubkey",
6937 private_key: "testkey.pem",
6938 }
6939
6940 android_app_set {
6941 name: "AppSet",
6942 set: "AppSet.apks",
6943 }`)
6944 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006945 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006946 content := bundleConfigRule.Args["content"]
6947 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6948 s := mod.Rule("apexRule").Args["copy_commands"]
6949 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6950 if len(copyCmds) != 3 {
6951 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6952 }
6953 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6954 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6955 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6956}
6957
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006958func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01006959 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006960 apex_set {
6961 name: "myapex",
6962 filename: "foo_v2.apex",
6963 sanitized: {
6964 none: { set: "myapex.apks", },
6965 hwaddress: { set: "myapex.hwasan.apks", },
6966 },
Paul Duffin24704672021-04-06 16:09:30 +01006967 }
6968 `
6969 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006970
Paul Duffin24704672021-04-06 16:09:30 +01006971 // Check that the extractor produces the correct output file from the correct input file.
6972 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006973
Paul Duffin24704672021-04-06 16:09:30 +01006974 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
6975 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006976
Paul Duffin24704672021-04-06 16:09:30 +01006977 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
6978
6979 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01006980 m = ctx.ModuleForTests("myapex", "android_common_myapex")
6981 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01006982
6983 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006984}
6985
Paul Duffin89f570a2021-06-16 01:42:33 +01006986func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006987 t.Helper()
6988
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006989 bp := `
6990 java_library {
6991 name: "some-updatable-apex-lib",
6992 srcs: ["a.java"],
6993 sdk_version: "current",
6994 apex_available: [
6995 "some-updatable-apex",
6996 ],
satayevabcd5972021-08-06 17:49:46 +01006997 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006998 }
6999
7000 java_library {
7001 name: "some-non-updatable-apex-lib",
7002 srcs: ["a.java"],
7003 apex_available: [
7004 "some-non-updatable-apex",
7005 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007006 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007007 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007008 }
7009
7010 bootclasspath_fragment {
7011 name: "some-non-updatable-fragment",
7012 contents: ["some-non-updatable-apex-lib"],
7013 apex_available: [
7014 "some-non-updatable-apex",
7015 ],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007016 }
7017
7018 java_library {
7019 name: "some-platform-lib",
7020 srcs: ["a.java"],
7021 sdk_version: "current",
7022 installable: true,
7023 }
7024
7025 java_library {
7026 name: "some-art-lib",
7027 srcs: ["a.java"],
7028 sdk_version: "current",
7029 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007030 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007031 ],
7032 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007033 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007034 }
7035
7036 apex {
7037 name: "some-updatable-apex",
7038 key: "some-updatable-apex.key",
7039 java_libs: ["some-updatable-apex-lib"],
7040 updatable: true,
7041 min_sdk_version: "current",
7042 }
7043
7044 apex {
7045 name: "some-non-updatable-apex",
7046 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007047 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007048 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007049 }
7050
7051 apex_key {
7052 name: "some-updatable-apex.key",
7053 }
7054
7055 apex_key {
7056 name: "some-non-updatable-apex.key",
7057 }
7058
7059 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007060 name: "com.android.art.debug",
7061 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007062 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007063 updatable: true,
7064 min_sdk_version: "current",
7065 }
7066
Paul Duffinf23bc472021-04-27 12:42:20 +01007067 bootclasspath_fragment {
7068 name: "art-bootclasspath-fragment",
7069 image_name: "art",
7070 contents: ["some-art-lib"],
7071 apex_available: [
7072 "com.android.art.debug",
7073 ],
7074 }
7075
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007076 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007077 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007078 }
7079
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007080 filegroup {
7081 name: "some-updatable-apex-file_contexts",
7082 srcs: [
7083 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7084 ],
7085 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007086
7087 filegroup {
7088 name: "some-non-updatable-apex-file_contexts",
7089 srcs: [
7090 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7091 ],
7092 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007093 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007094
Paul Duffin89f570a2021-06-16 01:42:33 +01007095 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007096}
7097
Paul Duffin89f570a2021-06-16 01:42:33 +01007098func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007099 t.Helper()
7100
Paul Duffin55607122021-03-30 23:32:51 +01007101 fs := android.MockFS{
7102 "a.java": nil,
7103 "a.jar": nil,
7104 "apex_manifest.json": nil,
7105 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007106 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007107 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7108 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7109 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007110 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007111 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007112
Paul Duffin55607122021-03-30 23:32:51 +01007113 errorHandler := android.FixtureExpectsNoErrors
7114 if errmsg != "" {
7115 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007116 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007117
Paul Duffin55607122021-03-30 23:32:51 +01007118 result := android.GroupFixturePreparers(
7119 cc.PrepareForTestWithCcDefaultModules,
7120 java.PrepareForTestWithHiddenApiBuildComponents,
7121 java.PrepareForTestWithJavaDefaultModules,
7122 java.PrepareForTestWithJavaSdkLibraryFiles,
7123 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007124 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007125 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007126 android.FixtureModifyMockFS(func(fs android.MockFS) {
7127 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7128 insert := ""
7129 for _, fragment := range fragments {
7130 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7131 }
7132 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7133 platform_bootclasspath {
7134 name: "platform-bootclasspath",
7135 fragments: [
7136 %s
7137 ],
7138 }
7139 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007140 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007141 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007142 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007143 ).
7144 ExtendWithErrorHandler(errorHandler).
7145 RunTestWithBp(t, bp)
7146
7147 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007148}
7149
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007150func TestDuplicateDeapexeresFromPrebuiltApexes(t *testing.T) {
7151 preparers := android.GroupFixturePreparers(
7152 java.PrepareForTestWithJavaDefaultModules,
7153 PrepareForTestWithApexBuildComponents,
7154 ).
7155 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7156 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7157
7158 bpBase := `
7159 apex_set {
7160 name: "com.android.myapex",
7161 installable: true,
7162 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7163 set: "myapex.apks",
7164 }
7165
7166 apex_set {
7167 name: "com.mycompany.android.myapex",
7168 apex_name: "com.android.myapex",
7169 installable: true,
7170 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7171 set: "company-myapex.apks",
7172 }
7173
7174 prebuilt_bootclasspath_fragment {
7175 name: "my-bootclasspath-fragment",
7176 apex_available: ["com.android.myapex"],
7177 %s
7178 }
7179 `
7180
7181 t.Run("java_import", func(t *testing.T) {
7182 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7183 java_import {
7184 name: "libfoo",
7185 jars: ["libfoo.jar"],
7186 apex_available: ["com.android.myapex"],
7187 }
7188 `)
7189 })
7190
7191 t.Run("java_sdk_library_import", func(t *testing.T) {
7192 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7193 java_sdk_library_import {
7194 name: "libfoo",
7195 public: {
7196 jars: ["libbar.jar"],
7197 },
7198 apex_available: ["com.android.myapex"],
7199 }
7200 `)
7201 })
7202
7203 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7204 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7205 image_name: "art",
7206 contents: ["libfoo"],
7207 `)+`
7208 java_sdk_library_import {
7209 name: "libfoo",
7210 public: {
7211 jars: ["libbar.jar"],
7212 },
7213 apex_available: ["com.android.myapex"],
7214 }
7215 `)
7216 })
7217}
7218
Jooyung Han548640b2020-04-27 12:10:30 +09007219func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7220 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7221 apex {
7222 name: "myapex",
7223 key: "myapex.key",
7224 updatable: true,
7225 }
7226
7227 apex_key {
7228 name: "myapex.key",
7229 public_key: "testkey.avbpubkey",
7230 private_key: "testkey.pem",
7231 }
7232 `)
7233}
7234
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007235func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7236 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7237 apex {
7238 name: "myapex",
7239 key: "myapex.key",
7240 }
7241
7242 apex_key {
7243 name: "myapex.key",
7244 public_key: "testkey.avbpubkey",
7245 private_key: "testkey.pem",
7246 }
7247 `)
7248}
7249
Daniel Norman69109112021-12-02 12:52:42 -08007250func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7251 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7252 apex {
7253 name: "myapex",
7254 key: "myapex.key",
7255 updatable: true,
7256 soc_specific: true,
7257 }
7258
7259 apex_key {
7260 name: "myapex.key",
7261 public_key: "testkey.avbpubkey",
7262 private_key: "testkey.pem",
7263 }
7264 `)
7265}
7266
satayevb98371c2021-06-15 16:49:50 +01007267func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7268 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7269 apex {
7270 name: "myapex",
7271 key: "myapex.key",
7272 systemserverclasspath_fragments: [
7273 "mysystemserverclasspathfragment",
7274 ],
7275 min_sdk_version: "29",
7276 updatable: true,
7277 }
7278
7279 apex_key {
7280 name: "myapex.key",
7281 public_key: "testkey.avbpubkey",
7282 private_key: "testkey.pem",
7283 }
7284
7285 java_library {
7286 name: "foo",
7287 srcs: ["b.java"],
7288 min_sdk_version: "29",
7289 installable: true,
7290 apex_available: [
7291 "myapex",
7292 ],
7293 }
7294
7295 systemserverclasspath_fragment {
7296 name: "mysystemserverclasspathfragment",
7297 generate_classpaths_proto: false,
7298 contents: [
7299 "foo",
7300 ],
7301 apex_available: [
7302 "myapex",
7303 ],
7304 }
satayevabcd5972021-08-06 17:49:46 +01007305 `,
7306 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7307 )
satayevb98371c2021-06-15 16:49:50 +01007308}
7309
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007310func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007311 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7312 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7313 // modules to be included in the BootJars.
7314 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7315 return android.GroupFixturePreparers(
7316 dexpreopt.FixtureSetBootJars(bootJars...),
7317 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7318 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7319 }),
7320 )
7321 }
7322
7323 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7324 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7325 // specified in the ArtApexJars configuration.
7326 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7327 return android.GroupFixturePreparers(
7328 dexpreopt.FixtureSetArtBootJars(bootJars...),
7329 dexpreopt.FixtureSetBootJars(bootJars...),
7330 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7331 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7332 }),
7333 )
7334 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007335
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007336 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007337 preparer := android.GroupFixturePreparers(
7338 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7339 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7340 )
7341 fragments := []java.ApexVariantReference{
7342 {
7343 Apex: proptools.StringPtr("com.android.art.debug"),
7344 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7345 },
7346 {
7347 Apex: proptools.StringPtr("some-non-updatable-apex"),
7348 Module: proptools.StringPtr("some-non-updatable-fragment"),
7349 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007350 }
satayevabcd5972021-08-06 17:49:46 +01007351 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007352 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007353
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007354 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007355 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7356 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007357 preparer := android.GroupFixturePreparers(
7358 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7359 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7360 )
Paul Duffin60264a02021-04-12 20:02:36 +01007361 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007362 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007363
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007364 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 +01007365 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 +01007366 // Update the dexpreopt ArtApexJars directly.
7367 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7368 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007369 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007370
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007371 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 +01007372 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 +01007373 // Update the dexpreopt ArtApexJars directly.
7374 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7375 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007376 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007377
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007378 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 +01007379 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 +01007380 preparer := android.GroupFixturePreparers(
7381 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7382 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7383 )
Paul Duffin60264a02021-04-12 20:02:36 +01007384 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007385 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007386
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007387 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 +01007388 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007389 fragment := java.ApexVariantReference{
7390 Apex: proptools.StringPtr("some-non-updatable-apex"),
7391 Module: proptools.StringPtr("some-non-updatable-fragment"),
7392 }
7393 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007394 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007395
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007396 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007397 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007398 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7399 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007400 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007401
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007402 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007403 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007404 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7405 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007406 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007407
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007408 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007409 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007410 // Update the dexpreopt ArtApexJars directly.
7411 preparer := prepareSetArtJars("platform:some-platform-lib")
7412 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007413 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007414
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007415 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007416 preparer := android.GroupFixturePreparers(
7417 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7418 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7419 )
7420 fragments := []java.ApexVariantReference{
7421 {
7422 Apex: proptools.StringPtr("some-non-updatable-apex"),
7423 Module: proptools.StringPtr("some-non-updatable-fragment"),
7424 },
7425 }
7426 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007427 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007428}
7429
7430func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007431 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007432 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007433 fragment := java.ApexVariantReference{
7434 Apex: proptools.StringPtr("myapex"),
7435 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7436 }
7437
Paul Duffin064b70c2020-11-02 17:32:38 +00007438 testDexpreoptWithApexes(t, `
7439 prebuilt_apex {
7440 name: "myapex" ,
7441 arch: {
7442 arm64: {
7443 src: "myapex-arm64.apex",
7444 },
7445 arm: {
7446 src: "myapex-arm.apex",
7447 },
7448 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007449 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7450 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007451
Paul Duffin89f570a2021-06-16 01:42:33 +01007452 prebuilt_bootclasspath_fragment {
7453 name: "my-bootclasspath-fragment",
7454 contents: ["libfoo"],
7455 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007456 hidden_api: {
7457 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7458 metadata: "my-bootclasspath-fragment/metadata.csv",
7459 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007460 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7461 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7462 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007463 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007464 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007465
Paul Duffin89f570a2021-06-16 01:42:33 +01007466 java_import {
7467 name: "libfoo",
7468 jars: ["libfoo.jar"],
7469 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007470 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007471 }
7472 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007473 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007474}
7475
satayevd604b212021-07-21 14:23:52 +01007476func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007477 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007478 bp += `
7479 apex_key {
7480 name: "myapex.key",
7481 public_key: "testkey.avbpubkey",
7482 private_key: "testkey.pem",
7483 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007484 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007485 "lib1/src/A.java": nil,
7486 "lib2/src/B.java": nil,
7487 "system/sepolicy/apex/myapex-file_contexts": nil,
7488 }
7489
Paul Duffin45338f02021-03-30 23:07:52 +01007490 errorHandler := android.FixtureExpectsNoErrors
7491 if errmsg != "" {
7492 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007493 }
Colin Crossae8600b2020-10-29 17:09:13 -07007494
Paul Duffin45338f02021-03-30 23:07:52 +01007495 android.GroupFixturePreparers(
7496 android.PrepareForTestWithAndroidBuildComponents,
7497 java.PrepareForTestWithJavaBuildComponents,
7498 PrepareForTestWithApexBuildComponents,
7499 android.PrepareForTestWithNeverallowRules(rules),
7500 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007501 apexBootJars := make([]string, 0, len(bootJars))
7502 for _, apexBootJar := range bootJars {
7503 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007504 }
satayevd604b212021-07-21 14:23:52 +01007505 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007506 }),
7507 fs.AddToFixture(),
7508 ).
7509 ExtendWithErrorHandler(errorHandler).
7510 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007511}
7512
7513func TestApexPermittedPackagesRules(t *testing.T) {
7514 testcases := []struct {
7515 name string
7516 expectedError string
7517 bp string
7518 bootJars []string
7519 modulesPackages map[string][]string
7520 }{
7521
7522 {
7523 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7524 expectedError: "",
7525 bp: `
7526 java_library {
7527 name: "bcp_lib1",
7528 srcs: ["lib1/src/*.java"],
7529 permitted_packages: ["foo.bar"],
7530 apex_available: ["myapex"],
7531 sdk_version: "none",
7532 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007533 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007534 }
7535 java_library {
7536 name: "nonbcp_lib2",
7537 srcs: ["lib2/src/*.java"],
7538 apex_available: ["myapex"],
7539 permitted_packages: ["a.b"],
7540 sdk_version: "none",
7541 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007542 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007543 }
7544 apex {
7545 name: "myapex",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007546 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007547 key: "myapex.key",
7548 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007549 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007550 }`,
7551 bootJars: []string{"bcp_lib1"},
7552 modulesPackages: map[string][]string{
7553 "myapex": []string{
7554 "foo.bar",
7555 },
7556 },
7557 },
7558 {
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007559 name: "Bootclasspath apex jar not satisfying allowed module packages on Q.",
Andrei Onead967aee2022-01-19 15:36:40 +00007560 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 +01007561 bp: `
7562 java_library {
7563 name: "bcp_lib1",
7564 srcs: ["lib1/src/*.java"],
7565 apex_available: ["myapex"],
7566 permitted_packages: ["foo.bar"],
7567 sdk_version: "none",
7568 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007569 min_sdk_version: "29",
Andrei Onea115e7e72020-06-05 21:14:03 +01007570 }
7571 java_library {
7572 name: "bcp_lib2",
7573 srcs: ["lib2/src/*.java"],
7574 apex_available: ["myapex"],
7575 permitted_packages: ["foo.bar", "bar.baz"],
7576 sdk_version: "none",
7577 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007578 min_sdk_version: "29",
Andrei Onea115e7e72020-06-05 21:14:03 +01007579 }
7580 apex {
7581 name: "myapex",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007582 min_sdk_version: "29",
7583 key: "myapex.key",
7584 java_libs: ["bcp_lib1", "bcp_lib2"],
7585 updatable: false,
7586 }
7587 `,
7588 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7589 modulesPackages: map[string][]string{
7590 "myapex": []string{
7591 "foo.bar",
7592 },
7593 },
7594 },
7595 {
7596 name: "Bootclasspath apex jar not satisfying allowed module packages on R.",
Andrei Onead967aee2022-01-19 15:36:40 +00007597 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 +09007598 bp: `
7599 java_library {
7600 name: "bcp_lib1",
7601 srcs: ["lib1/src/*.java"],
7602 apex_available: ["myapex"],
7603 permitted_packages: ["foo.bar"],
7604 sdk_version: "none",
7605 system_modules: "none",
7606 min_sdk_version: "30",
7607 }
7608 java_library {
7609 name: "bcp_lib2",
7610 srcs: ["lib2/src/*.java"],
7611 apex_available: ["myapex"],
7612 permitted_packages: ["foo.bar", "bar.baz"],
7613 sdk_version: "none",
7614 system_modules: "none",
7615 min_sdk_version: "30",
7616 }
7617 apex {
7618 name: "myapex",
7619 min_sdk_version: "30",
7620 key: "myapex.key",
7621 java_libs: ["bcp_lib1", "bcp_lib2"],
7622 updatable: false,
7623 }
7624 `,
7625 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7626 modulesPackages: map[string][]string{
7627 "myapex": []string{
7628 "foo.bar",
7629 },
7630 },
7631 },
7632 {
7633 name: "Bootclasspath apex jar >= T not satisfying Q/R/S allowed module packages.",
7634 expectedError: "",
7635 bp: `
7636 java_library {
7637 name: "bcp_lib1",
7638 srcs: ["lib1/src/*.java"],
7639 apex_available: ["myapex"],
7640 permitted_packages: ["foo.bar"],
7641 sdk_version: "none",
7642 system_modules: "none",
7643 min_sdk_version: "current",
7644 }
7645 java_library {
7646 name: "bcp_lib2",
7647 srcs: ["lib2/src/*.java"],
7648 apex_available: ["myapex"],
7649 permitted_packages: ["foo.bar", "bar.baz"],
7650 sdk_version: "none",
7651 system_modules: "none",
7652 min_sdk_version: "current",
7653 }
7654 apex {
7655 name: "myapex",
7656 min_sdk_version: "current",
Andrei Onea115e7e72020-06-05 21:14:03 +01007657 key: "myapex.key",
7658 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007659 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007660 }
7661 `,
7662 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7663 modulesPackages: map[string][]string{
7664 "myapex": []string{
7665 "foo.bar",
7666 },
7667 },
7668 },
7669 }
7670 for _, tc := range testcases {
7671 t.Run(tc.name, func(t *testing.T) {
7672 rules := createApexPermittedPackagesRules(tc.modulesPackages)
7673 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
7674 })
7675 }
7676}
7677
Jiyong Park62304bb2020-04-13 16:19:48 +09007678func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007679 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09007680 apex {
7681 name: "myapex",
7682 key: "myapex.key",
7683 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007684 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09007685 }
7686
7687 apex_key {
7688 name: "myapex.key",
7689 public_key: "testkey.avbpubkey",
7690 private_key: "testkey.pem",
7691 }
7692
7693 cc_library {
7694 name: "mylib",
7695 srcs: ["mylib.cpp"],
7696 system_shared_libs: [],
7697 stl: "none",
7698 stubs: {
7699 versions: ["1"],
7700 },
7701 apex_available: ["myapex"],
7702 }
7703
7704 cc_library {
7705 name: "myprivlib",
7706 srcs: ["mylib.cpp"],
7707 system_shared_libs: [],
7708 stl: "none",
7709 apex_available: ["myapex"],
7710 }
7711
7712
7713 cc_test {
7714 name: "mytest",
7715 gtest: false,
7716 srcs: ["mylib.cpp"],
7717 system_shared_libs: [],
7718 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09007719 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09007720 test_for: ["myapex"]
7721 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007722
7723 cc_library {
7724 name: "mytestlib",
7725 srcs: ["mylib.cpp"],
7726 system_shared_libs: [],
7727 shared_libs: ["mylib", "myprivlib"],
7728 stl: "none",
7729 test_for: ["myapex"],
7730 }
7731
7732 cc_benchmark {
7733 name: "mybench",
7734 srcs: ["mylib.cpp"],
7735 system_shared_libs: [],
7736 shared_libs: ["mylib", "myprivlib"],
7737 stl: "none",
7738 test_for: ["myapex"],
7739 }
Jiyong Park62304bb2020-04-13 16:19:48 +09007740 `)
7741
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007742 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007743 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007744 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7745 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7746 }
7747
7748 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09007749 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007750 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7751 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7752 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7753}
Jiyong Park46a512f2020-12-04 18:02:13 +09007754
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007755func TestIndirectTestFor(t *testing.T) {
7756 ctx := testApex(t, `
7757 apex {
7758 name: "myapex",
7759 key: "myapex.key",
7760 native_shared_libs: ["mylib", "myprivlib"],
7761 updatable: false,
7762 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007763
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007764 apex_key {
7765 name: "myapex.key",
7766 public_key: "testkey.avbpubkey",
7767 private_key: "testkey.pem",
7768 }
7769
7770 cc_library {
7771 name: "mylib",
7772 srcs: ["mylib.cpp"],
7773 system_shared_libs: [],
7774 stl: "none",
7775 stubs: {
7776 versions: ["1"],
7777 },
7778 apex_available: ["myapex"],
7779 }
7780
7781 cc_library {
7782 name: "myprivlib",
7783 srcs: ["mylib.cpp"],
7784 system_shared_libs: [],
7785 stl: "none",
7786 shared_libs: ["mylib"],
7787 apex_available: ["myapex"],
7788 }
7789
7790 cc_library {
7791 name: "mytestlib",
7792 srcs: ["mylib.cpp"],
7793 system_shared_libs: [],
7794 shared_libs: ["myprivlib"],
7795 stl: "none",
7796 test_for: ["myapex"],
7797 }
7798 `)
7799
7800 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007801 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007802 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7803 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7804 }
7805
7806 // The platform variant of mytestlib links to the platform variant of the
7807 // internal myprivlib.
7808 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
7809
7810 // The platform variant of myprivlib links to the platform variant of mylib
7811 // and bypasses its stubs.
7812 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 +09007813}
7814
Martin Stjernholmec009002021-03-27 15:18:31 +00007815func TestTestForForLibInOtherApex(t *testing.T) {
7816 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
7817 _ = testApex(t, `
7818 apex {
7819 name: "com.android.art",
7820 key: "myapex.key",
7821 native_shared_libs: ["mylib"],
7822 updatable: false,
7823 }
7824
7825 apex {
7826 name: "com.android.art.debug",
7827 key: "myapex.key",
7828 native_shared_libs: ["mylib", "mytestlib"],
7829 updatable: false,
7830 }
7831
7832 apex_key {
7833 name: "myapex.key",
7834 public_key: "testkey.avbpubkey",
7835 private_key: "testkey.pem",
7836 }
7837
7838 cc_library {
7839 name: "mylib",
7840 srcs: ["mylib.cpp"],
7841 system_shared_libs: [],
7842 stl: "none",
7843 stubs: {
7844 versions: ["1"],
7845 },
7846 apex_available: ["com.android.art", "com.android.art.debug"],
7847 }
7848
7849 cc_library {
7850 name: "mytestlib",
7851 srcs: ["mylib.cpp"],
7852 system_shared_libs: [],
7853 shared_libs: ["mylib"],
7854 stl: "none",
7855 apex_available: ["com.android.art.debug"],
7856 test_for: ["com.android.art"],
7857 }
7858 `,
7859 android.MockFS{
7860 "system/sepolicy/apex/com.android.art-file_contexts": nil,
7861 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
7862 }.AddToFixture())
7863}
7864
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007865// TODO(jungjw): Move this to proptools
7866func intPtr(i int) *int {
7867 return &i
7868}
7869
7870func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007871 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007872 apex_set {
7873 name: "myapex",
7874 set: "myapex.apks",
7875 filename: "foo_v2.apex",
7876 overrides: ["foo"],
7877 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007878 `,
7879 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7880 variables.Platform_sdk_version = intPtr(30)
7881 }),
7882 android.FixtureModifyConfig(func(config android.Config) {
7883 config.Targets[android.Android] = []android.Target{
7884 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
7885 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
7886 }
7887 }),
7888 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007889
Paul Duffin24704672021-04-06 16:09:30 +01007890 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007891
7892 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01007893 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007894 actual := extractedApex.Args["abis"]
7895 expected := "ARMEABI_V7A,ARM64_V8A"
7896 if actual != expected {
7897 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7898 }
7899 actual = extractedApex.Args["sdk-version"]
7900 expected = "30"
7901 if actual != expected {
7902 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7903 }
7904
Paul Duffin6717d882021-06-15 19:09:41 +01007905 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007906 a := m.Module().(*ApexSet)
7907 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07007908 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007909 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
7910 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
7911 }
7912}
7913
Jiyong Park7d95a512020-05-10 15:16:24 +09007914func TestNoStaticLinkingToStubsLib(t *testing.T) {
7915 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
7916 apex {
7917 name: "myapex",
7918 key: "myapex.key",
7919 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007920 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09007921 }
7922
7923 apex_key {
7924 name: "myapex.key",
7925 public_key: "testkey.avbpubkey",
7926 private_key: "testkey.pem",
7927 }
7928
7929 cc_library {
7930 name: "mylib",
7931 srcs: ["mylib.cpp"],
7932 static_libs: ["otherlib"],
7933 system_shared_libs: [],
7934 stl: "none",
7935 apex_available: [ "myapex" ],
7936 }
7937
7938 cc_library {
7939 name: "otherlib",
7940 srcs: ["mylib.cpp"],
7941 system_shared_libs: [],
7942 stl: "none",
7943 stubs: {
7944 versions: ["1", "2", "3"],
7945 },
7946 apex_available: [ "myapex" ],
7947 }
7948 `)
7949}
7950
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007951func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007952 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007953 apex {
7954 name: "myapex",
7955 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007956 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09007957 custom_sign_tool: "sign_myapex",
7958 }
7959
7960 apex_key {
7961 name: "myapex.key",
7962 public_key: "testkey.avbpubkey",
7963 private_key: "testkey.pem",
7964 }
7965 `)
7966
7967 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7968 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7969 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"`)
7970}
7971
7972func TestApexKeysTxtOverrides(t *testing.T) {
7973 ctx := testApex(t, `
7974 apex {
7975 name: "myapex",
7976 key: "myapex.key",
7977 updatable: false,
7978 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007979 }
7980
7981 apex_key {
7982 name: "myapex.key",
7983 public_key: "testkey.avbpubkey",
7984 private_key: "testkey.pem",
7985 }
7986
7987 prebuilt_apex {
7988 name: "myapex",
7989 prefer: true,
7990 arch: {
7991 arm64: {
7992 src: "myapex-arm64.apex",
7993 },
7994 arm: {
7995 src: "myapex-arm.apex",
7996 },
7997 },
7998 }
7999
8000 apex_set {
8001 name: "myapex_set",
8002 set: "myapex.apks",
8003 filename: "myapex_set.apex",
8004 overrides: ["myapex"],
8005 }
8006 `)
8007
8008 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8009 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8010 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 +09008011 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 +09008012}
8013
Jooyung Han938b5932020-06-20 12:47:47 +09008014func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008015 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008016 apex {
8017 name: "myapex",
8018 key: "myapex.key",
8019 apps: ["app"],
8020 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008021 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008022 }
8023
8024 apex_key {
8025 name: "myapex.key",
8026 public_key: "testkey.avbpubkey",
8027 private_key: "testkey.pem",
8028 }
8029
8030 android_app {
8031 name: "app",
8032 srcs: ["foo/bar/MyClass.java"],
8033 package_name: "foo",
8034 sdk_version: "none",
8035 system_modules: "none",
8036 apex_available: [ "myapex" ],
8037 }
8038 `, withFiles(map[string][]byte{
8039 "sub/Android.bp": []byte(`
8040 override_apex {
8041 name: "override_myapex",
8042 base: "myapex",
8043 apps: ["override_app"],
8044 allowed_files: ":allowed",
8045 }
8046 // Overridable "path" property should be referenced indirectly
8047 filegroup {
8048 name: "allowed",
8049 srcs: ["allowed.txt"],
8050 }
8051 override_android_app {
8052 name: "override_app",
8053 base: "app",
8054 package_name: "bar",
8055 }
8056 `),
8057 }))
8058
8059 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8060 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8061 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8062 }
8063
8064 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8065 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8066 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8067 }
8068}
8069
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008070func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008071 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008072 apex {
8073 name: "myapex",
8074 key: "myapex.key",
8075 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008076 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008077 }
8078
8079 apex_key {
8080 name: "myapex.key",
8081 public_key: "testkey.avbpubkey",
8082 private_key: "testkey.pem",
8083 }
8084
8085 cc_library {
8086 name: "mylib",
8087 srcs: ["mylib.cpp"],
8088 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008089 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008090 },
8091 apex_available: ["myapex"],
8092 }
8093
8094 cc_prebuilt_library_shared {
8095 name: "mylib",
8096 prefer: false,
8097 srcs: ["prebuilt.so"],
8098 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008099 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008100 },
8101 apex_available: ["myapex"],
8102 }
8103 `)
8104}
8105
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008106func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008107 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008108 apex {
8109 name: "myapex",
8110 key: "myapex.key",
8111 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008112 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008113 }
8114 apex_key {
8115 name: "myapex.key",
8116 public_key: "testkey.avbpubkey",
8117 private_key: "testkey.pem",
8118 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008119 `,
8120 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8121 variables.CompressedApex = proptools.BoolPtr(true)
8122 }),
8123 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008124
8125 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8126 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8127
8128 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8129 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8130
8131 // Make sure output of bundle is .capex
8132 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8133 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8134
8135 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008136 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008137 var builder strings.Builder
8138 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8139 androidMk := builder.String()
8140 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8141}
8142
Martin Stjernholm2856c662020-12-02 15:03:42 +00008143func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008144 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008145 apex {
8146 name: "myapex",
8147 key: "myapex.key",
8148 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008149 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008150 }
8151
8152 apex_key {
8153 name: "myapex.key",
8154 public_key: "testkey.avbpubkey",
8155 private_key: "testkey.pem",
8156 }
8157
8158 cc_library {
8159 name: "mylib",
8160 srcs: ["mylib.cpp"],
8161 apex_available: ["myapex"],
8162 shared_libs: ["otherlib"],
8163 system_shared_libs: [],
8164 }
8165
8166 cc_library {
8167 name: "otherlib",
8168 srcs: ["mylib.cpp"],
8169 stubs: {
8170 versions: ["current"],
8171 },
8172 }
8173
8174 cc_prebuilt_library_shared {
8175 name: "otherlib",
8176 prefer: true,
8177 srcs: ["prebuilt.so"],
8178 stubs: {
8179 versions: ["current"],
8180 },
8181 }
8182 `)
8183
8184 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008185 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008186 var builder strings.Builder
8187 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8188 androidMk := builder.String()
8189
8190 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8191 // a thing there.
8192 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8193}
8194
Jiyong Parke3867542020-12-03 17:28:25 +09008195func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008196 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008197 apex {
8198 name: "myapex",
8199 key: "myapex.key",
8200 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008201 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008202 }
8203
8204 apex_key {
8205 name: "myapex.key",
8206 public_key: "testkey.avbpubkey",
8207 private_key: "testkey.pem",
8208 }
8209
8210 cc_library {
8211 name: "mylib",
8212 srcs: ["mylib.cpp"],
8213 system_shared_libs: [],
8214 stl: "none",
8215 apex_available: ["myapex"],
8216 shared_libs: ["mylib2"],
8217 target: {
8218 apex: {
8219 exclude_shared_libs: ["mylib2"],
8220 },
8221 },
8222 }
8223
8224 cc_library {
8225 name: "mylib2",
8226 srcs: ["mylib.cpp"],
8227 system_shared_libs: [],
8228 stl: "none",
8229 }
8230 `)
8231
8232 // Check if mylib is linked to mylib2 for the non-apex target
8233 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8234 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8235
8236 // Make sure that the link doesn't occur for the apex target
8237 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8238 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8239
8240 // It shouldn't appear in the copy cmd as well.
8241 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8242 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8243}
8244
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008245func TestPrebuiltStubLibDep(t *testing.T) {
8246 bpBase := `
8247 apex {
8248 name: "myapex",
8249 key: "myapex.key",
8250 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008251 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008252 }
8253 apex_key {
8254 name: "myapex.key",
8255 public_key: "testkey.avbpubkey",
8256 private_key: "testkey.pem",
8257 }
8258 cc_library {
8259 name: "mylib",
8260 srcs: ["mylib.cpp"],
8261 apex_available: ["myapex"],
8262 shared_libs: ["stublib"],
8263 system_shared_libs: [],
8264 }
8265 apex {
8266 name: "otherapex",
8267 enabled: %s,
8268 key: "myapex.key",
8269 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008270 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008271 }
8272 `
8273
8274 stublibSourceBp := `
8275 cc_library {
8276 name: "stublib",
8277 srcs: ["mylib.cpp"],
8278 apex_available: ["otherapex"],
8279 system_shared_libs: [],
8280 stl: "none",
8281 stubs: {
8282 versions: ["1"],
8283 },
8284 }
8285 `
8286
8287 stublibPrebuiltBp := `
8288 cc_prebuilt_library_shared {
8289 name: "stublib",
8290 srcs: ["prebuilt.so"],
8291 apex_available: ["otherapex"],
8292 stubs: {
8293 versions: ["1"],
8294 },
8295 %s
8296 }
8297 `
8298
8299 tests := []struct {
8300 name string
8301 stublibBp string
8302 usePrebuilt bool
8303 modNames []string // Modules to collect AndroidMkEntries for
8304 otherApexEnabled []string
8305 }{
8306 {
8307 name: "only_source",
8308 stublibBp: stublibSourceBp,
8309 usePrebuilt: false,
8310 modNames: []string{"stublib"},
8311 otherApexEnabled: []string{"true", "false"},
8312 },
8313 {
8314 name: "source_preferred",
8315 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8316 usePrebuilt: false,
8317 modNames: []string{"stublib", "prebuilt_stublib"},
8318 otherApexEnabled: []string{"true", "false"},
8319 },
8320 {
8321 name: "prebuilt_preferred",
8322 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8323 usePrebuilt: true,
8324 modNames: []string{"stublib", "prebuilt_stublib"},
8325 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8326 },
8327 {
8328 name: "only_prebuilt",
8329 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8330 usePrebuilt: true,
8331 modNames: []string{"stublib"},
8332 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8333 },
8334 }
8335
8336 for _, test := range tests {
8337 t.Run(test.name, func(t *testing.T) {
8338 for _, otherApexEnabled := range test.otherApexEnabled {
8339 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008340 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008341
8342 type modAndMkEntries struct {
8343 mod *cc.Module
8344 mkEntries android.AndroidMkEntries
8345 }
8346 entries := []*modAndMkEntries{}
8347
8348 // Gather shared lib modules that are installable
8349 for _, modName := range test.modNames {
8350 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8351 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8352 continue
8353 }
8354 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008355 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008356 continue
8357 }
Colin Crossaa255532020-07-03 13:18:24 -07008358 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008359 if ent.Disabled {
8360 continue
8361 }
8362 entries = append(entries, &modAndMkEntries{
8363 mod: mod,
8364 mkEntries: ent,
8365 })
8366 }
8367 }
8368 }
8369
8370 var entry *modAndMkEntries = nil
8371 for _, ent := range entries {
8372 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8373 if entry != nil {
8374 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8375 } else {
8376 entry = ent
8377 }
8378 }
8379 }
8380
8381 if entry == nil {
8382 t.Errorf("AndroidMk entry for \"stublib\" missing")
8383 } else {
8384 isPrebuilt := entry.mod.Prebuilt() != nil
8385 if isPrebuilt != test.usePrebuilt {
8386 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8387 }
8388 if !entry.mod.IsStubs() {
8389 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8390 }
8391 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8392 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8393 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008394 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008395 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008396 if !android.InList(expected, cflags) {
8397 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8398 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008399 }
8400 })
8401 }
8402 })
8403 }
8404}
8405
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008406func TestHostApexInHostOnlyBuild(t *testing.T) {
8407 testApex(t, `
8408 apex {
8409 name: "myapex",
8410 host_supported: true,
8411 key: "myapex.key",
8412 updatable: false,
8413 payload_type: "zip",
8414 }
8415 apex_key {
8416 name: "myapex.key",
8417 public_key: "testkey.avbpubkey",
8418 private_key: "testkey.pem",
8419 }
8420 `,
8421 android.FixtureModifyConfig(func(config android.Config) {
8422 // We may not have device targets in all builds, e.g. in
8423 // prebuilts/build-tools/build-prebuilts.sh
8424 config.Targets[android.Android] = []android.Target{}
8425 }))
8426}
8427
Colin Crossc33e5212021-05-25 18:16:02 -07008428func TestApexJavaCoverage(t *testing.T) {
8429 bp := `
8430 apex {
8431 name: "myapex",
8432 key: "myapex.key",
8433 java_libs: ["mylib"],
8434 bootclasspath_fragments: ["mybootclasspathfragment"],
8435 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8436 updatable: false,
8437 }
8438
8439 apex_key {
8440 name: "myapex.key",
8441 public_key: "testkey.avbpubkey",
8442 private_key: "testkey.pem",
8443 }
8444
8445 java_library {
8446 name: "mylib",
8447 srcs: ["mylib.java"],
8448 apex_available: ["myapex"],
8449 compile_dex: true,
8450 }
8451
8452 bootclasspath_fragment {
8453 name: "mybootclasspathfragment",
8454 contents: ["mybootclasspathlib"],
8455 apex_available: ["myapex"],
8456 }
8457
8458 java_library {
8459 name: "mybootclasspathlib",
8460 srcs: ["mybootclasspathlib.java"],
8461 apex_available: ["myapex"],
8462 compile_dex: true,
8463 }
8464
8465 systemserverclasspath_fragment {
8466 name: "mysystemserverclasspathfragment",
8467 contents: ["mysystemserverclasspathlib"],
8468 apex_available: ["myapex"],
8469 }
8470
8471 java_library {
8472 name: "mysystemserverclasspathlib",
8473 srcs: ["mysystemserverclasspathlib.java"],
8474 apex_available: ["myapex"],
8475 compile_dex: true,
8476 }
8477 `
8478
8479 result := android.GroupFixturePreparers(
8480 PrepareForTestWithApexBuildComponents,
8481 prepareForTestWithMyapex,
8482 java.PrepareForTestWithJavaDefaultModules,
8483 android.PrepareForTestWithAndroidBuildComponents,
8484 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008485 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8486 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008487 android.FixtureMergeEnv(map[string]string{
8488 "EMMA_INSTRUMENT": "true",
8489 }),
8490 ).RunTest(t)
8491
8492 // Make sure jacoco ran on both mylib and mybootclasspathlib
8493 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8494 t.Errorf("Failed to find jacoco rule for mylib")
8495 }
8496 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8497 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8498 }
8499 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8500 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8501 }
8502}
8503
Jiyong Park192600a2021-08-03 07:52:17 +00008504func TestProhibitStaticExecutable(t *testing.T) {
8505 testApexError(t, `executable mybin is static`, `
8506 apex {
8507 name: "myapex",
8508 key: "myapex.key",
8509 binaries: ["mybin"],
8510 min_sdk_version: "29",
8511 }
8512
8513 apex_key {
8514 name: "myapex.key",
8515 public_key: "testkey.avbpubkey",
8516 private_key: "testkey.pem",
8517 }
8518
8519 cc_binary {
8520 name: "mybin",
8521 srcs: ["mylib.cpp"],
8522 relative_install_path: "foo/bar",
8523 static_executable: true,
8524 system_shared_libs: [],
8525 stl: "none",
8526 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008527 min_sdk_version: "29",
8528 }
8529 `)
8530
8531 testApexError(t, `executable mybin.rust is static`, `
8532 apex {
8533 name: "myapex",
8534 key: "myapex.key",
8535 binaries: ["mybin.rust"],
8536 min_sdk_version: "29",
8537 }
8538
8539 apex_key {
8540 name: "myapex.key",
8541 public_key: "testkey.avbpubkey",
8542 private_key: "testkey.pem",
8543 }
8544
8545 rust_binary {
8546 name: "mybin.rust",
8547 srcs: ["foo.rs"],
8548 static_executable: true,
8549 apex_available: ["myapex"],
8550 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008551 }
8552 `)
8553}
8554
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008555func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8556 ctx := testApex(t, `
8557 apex {
8558 name: "myapex",
8559 key: "myapex.key",
8560 updatable: false,
8561 java_libs: ["foo"],
8562 }
8563
8564 apex_key {
8565 name: "myapex.key",
8566 public_key: "testkey.avbpubkey",
8567 private_key: "testkey.pem",
8568 }
8569
8570 java_library {
8571 name: "foo",
8572 srcs: ["foo.java"],
8573 apex_available: ["myapex"],
8574 installable: true,
8575 }
8576 `,
8577 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
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 += foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex")
8586}
8587
8588func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8589 ctx := testApex(t, `
8590 prebuilt_apex {
8591 name: "myapex",
8592 arch: {
8593 arm64: {
8594 src: "myapex-arm64.apex",
8595 },
8596 arm: {
8597 src: "myapex-arm.apex",
8598 },
8599 },
8600 exported_java_libs: ["foo"],
8601 }
8602
8603 java_import {
8604 name: "foo",
8605 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008606 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008607 }
8608 `,
8609 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8610 )
8611
8612 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8613 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8614 mainModuleEntries := entriesList[0]
8615 android.AssertArrayString(t,
8616 "LOCAL_REQUIRED_MODULES",
8617 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8618 []string{
8619 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8620 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8621 })
8622}
8623
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008624func TestAndroidMk_RequiredModules(t *testing.T) {
8625 ctx := testApex(t, `
8626 apex {
8627 name: "myapex",
8628 key: "myapex.key",
8629 updatable: false,
8630 java_libs: ["foo"],
8631 required: ["otherapex"],
8632 }
8633
8634 apex {
8635 name: "otherapex",
8636 key: "myapex.key",
8637 updatable: false,
8638 java_libs: ["foo"],
8639 required: ["otherapex"],
8640 }
8641
8642 apex_key {
8643 name: "myapex.key",
8644 public_key: "testkey.avbpubkey",
8645 private_key: "testkey.pem",
8646 }
8647
8648 java_library {
8649 name: "foo",
8650 srcs: ["foo.java"],
8651 apex_available: ["myapex", "otherapex"],
8652 installable: true,
8653 }
8654 `)
8655
8656 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8657 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8658 var builder strings.Builder
8659 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8660 androidMk := builder.String()
8661 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
8662}
8663
satayev758968a2021-12-06 11:42:40 +00008664func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
8665 preparer := android.GroupFixturePreparers(
8666 PrepareForTestWithApexBuildComponents,
8667 prepareForTestWithMyapex,
8668 java.PrepareForTestWithJavaSdkLibraryFiles,
8669 java.PrepareForTestWithJavaDefaultModules,
8670 android.PrepareForTestWithAndroidBuildComponents,
8671 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8672 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
8673 )
8674
8675 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
8676 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8677 preparer.RunTestWithBp(t, `
8678 apex {
8679 name: "myapex",
8680 key: "myapex.key",
8681 bootclasspath_fragments: ["mybootclasspathfragment"],
8682 min_sdk_version: "30",
8683 updatable: false,
8684 }
8685
8686 apex_key {
8687 name: "myapex.key",
8688 public_key: "testkey.avbpubkey",
8689 private_key: "testkey.pem",
8690 }
8691
8692 bootclasspath_fragment {
8693 name: "mybootclasspathfragment",
8694 contents: ["mybootclasspathlib"],
8695 apex_available: ["myapex"],
8696 }
8697
8698 java_sdk_library {
8699 name: "mybootclasspathlib",
8700 srcs: ["mybootclasspathlib.java"],
8701 apex_available: ["myapex"],
8702 compile_dex: true,
8703 unsafe_ignore_missing_latest_api: true,
8704 min_sdk_version: "31",
8705 static_libs: ["util"],
8706 }
8707
8708 java_library {
8709 name: "util",
8710 srcs: ["a.java"],
8711 apex_available: ["myapex"],
8712 min_sdk_version: "31",
8713 static_libs: ["another_util"],
8714 }
8715
8716 java_library {
8717 name: "another_util",
8718 srcs: ["a.java"],
8719 min_sdk_version: "31",
8720 apex_available: ["myapex"],
8721 }
8722 `)
8723 })
8724
8725 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
8726 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8727 preparer.RunTestWithBp(t, `
8728 apex {
8729 name: "myapex",
8730 key: "myapex.key",
8731 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8732 min_sdk_version: "30",
8733 updatable: false,
8734 }
8735
8736 apex_key {
8737 name: "myapex.key",
8738 public_key: "testkey.avbpubkey",
8739 private_key: "testkey.pem",
8740 }
8741
8742 systemserverclasspath_fragment {
8743 name: "mysystemserverclasspathfragment",
8744 contents: ["mysystemserverclasspathlib"],
8745 apex_available: ["myapex"],
8746 }
8747
8748 java_sdk_library {
8749 name: "mysystemserverclasspathlib",
8750 srcs: ["mysystemserverclasspathlib.java"],
8751 apex_available: ["myapex"],
8752 compile_dex: true,
8753 min_sdk_version: "32",
8754 unsafe_ignore_missing_latest_api: true,
8755 static_libs: ["util"],
8756 }
8757
8758 java_library {
8759 name: "util",
8760 srcs: ["a.java"],
8761 apex_available: ["myapex"],
8762 min_sdk_version: "31",
8763 static_libs: ["another_util"],
8764 }
8765
8766 java_library {
8767 name: "another_util",
8768 srcs: ["a.java"],
8769 min_sdk_version: "31",
8770 apex_available: ["myapex"],
8771 }
8772 `)
8773 })
8774
8775 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8776 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
8777 RunTestWithBp(t, `
8778 apex {
8779 name: "myapex",
8780 key: "myapex.key",
8781 bootclasspath_fragments: ["mybootclasspathfragment"],
8782 min_sdk_version: "30",
8783 updatable: false,
8784 }
8785
8786 apex_key {
8787 name: "myapex.key",
8788 public_key: "testkey.avbpubkey",
8789 private_key: "testkey.pem",
8790 }
8791
8792 bootclasspath_fragment {
8793 name: "mybootclasspathfragment",
8794 contents: ["mybootclasspathlib"],
8795 apex_available: ["myapex"],
8796 }
8797
8798 java_sdk_library {
8799 name: "mybootclasspathlib",
8800 srcs: ["mybootclasspathlib.java"],
8801 apex_available: ["myapex"],
8802 compile_dex: true,
8803 unsafe_ignore_missing_latest_api: true,
8804 }
8805 `)
8806 })
8807
8808 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8809 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
8810 RunTestWithBp(t, `
8811 apex {
8812 name: "myapex",
8813 key: "myapex.key",
8814 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8815 min_sdk_version: "30",
8816 updatable: false,
8817 }
8818
8819 apex_key {
8820 name: "myapex.key",
8821 public_key: "testkey.avbpubkey",
8822 private_key: "testkey.pem",
8823 }
8824
8825 systemserverclasspath_fragment {
8826 name: "mysystemserverclasspathfragment",
8827 contents: ["mysystemserverclasspathlib"],
8828 apex_available: ["myapex"],
8829 }
8830
8831 java_sdk_library {
8832 name: "mysystemserverclasspathlib",
8833 srcs: ["mysystemserverclasspathlib.java"],
8834 apex_available: ["myapex"],
8835 compile_dex: true,
8836 unsafe_ignore_missing_latest_api: true,
8837 }
8838 `)
8839 })
8840}
8841
Jiakai Zhang6decef92022-01-12 17:56:19 +00008842// Verifies that the APEX depends on all the Make modules in the list.
8843func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
8844 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
8845 for _, dep := range deps {
8846 android.AssertStringListContains(t, "", a.requiredDeps, dep)
8847 }
8848}
8849
8850// Verifies that the APEX does not depend on any of the Make modules in the list.
8851func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
8852 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
8853 for _, dep := range deps {
8854 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
8855 }
8856}
8857
Spandan Das66773252022-01-15 00:23:18 +00008858func TestApexStrictUpdtabilityLint(t *testing.T) {
8859 bpTemplate := `
8860 apex {
8861 name: "myapex",
8862 key: "myapex.key",
8863 java_libs: ["myjavalib"],
8864 updatable: %v,
8865 min_sdk_version: "29",
8866 }
8867 apex_key {
8868 name: "myapex.key",
8869 }
8870 java_library {
8871 name: "myjavalib",
8872 srcs: ["MyClass.java"],
8873 apex_available: [ "myapex" ],
8874 lint: {
8875 strict_updatability_linting: %v,
8876 },
8877 sdk_version: "current",
8878 min_sdk_version: "29",
8879 }
8880 `
8881 fs := android.MockFS{
8882 "lint-baseline.xml": nil,
8883 }
8884
8885 testCases := []struct {
8886 testCaseName string
8887 apexUpdatable bool
8888 javaStrictUpdtabilityLint bool
8889 lintFileExists bool
8890 disallowedFlagExpected bool
8891 }{
8892 {
8893 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
8894 apexUpdatable: true,
8895 javaStrictUpdtabilityLint: true,
8896 lintFileExists: false,
8897 disallowedFlagExpected: false,
8898 },
8899 {
8900 testCaseName: "non-updatable apex respects strict_updatability of javalib",
8901 apexUpdatable: false,
8902 javaStrictUpdtabilityLint: false,
8903 lintFileExists: true,
8904 disallowedFlagExpected: false,
8905 },
8906 {
8907 testCaseName: "non-updatable apex respects strict updatability of javalib",
8908 apexUpdatable: false,
8909 javaStrictUpdtabilityLint: true,
8910 lintFileExists: true,
8911 disallowedFlagExpected: true,
8912 },
8913 {
8914 testCaseName: "updatable apex sets strict updatability of javalib to true",
8915 apexUpdatable: true,
8916 javaStrictUpdtabilityLint: false, // will be set to true by mutator
8917 lintFileExists: true,
8918 disallowedFlagExpected: true,
8919 },
8920 }
8921
8922 for _, testCase := range testCases {
8923 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
8924 fixtures := []android.FixturePreparer{}
8925 if testCase.lintFileExists {
8926 fixtures = append(fixtures, fs.AddToFixture())
8927 }
8928
8929 result := testApex(t, bp, fixtures...)
8930 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
8931 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
8932 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
8933
8934 if disallowedFlagActual != testCase.disallowedFlagExpected {
8935 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
8936 }
8937 }
8938}
8939
8940// checks transtive deps of an apex coming from bootclasspath_fragment
8941func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
8942 bp := `
8943 apex {
8944 name: "myapex",
8945 key: "myapex.key",
8946 bootclasspath_fragments: ["mybootclasspathfragment"],
8947 updatable: true,
8948 min_sdk_version: "29",
8949 }
8950 apex_key {
8951 name: "myapex.key",
8952 }
8953 bootclasspath_fragment {
8954 name: "mybootclasspathfragment",
8955 contents: ["myjavalib"],
8956 apex_available: ["myapex"],
8957 }
8958 java_library {
8959 name: "myjavalib",
8960 srcs: ["MyClass.java"],
8961 apex_available: [ "myapex" ],
8962 sdk_version: "current",
8963 min_sdk_version: "29",
8964 compile_dex: true,
8965 }
8966 `
8967 fs := android.MockFS{
8968 "lint-baseline.xml": nil,
8969 }
8970
8971 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
8972 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
8973 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
8974 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
8975 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
8976 }
8977}
8978
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07008979func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01008980 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07008981}