blob: e2262f7faeef8f91eb9c4d488d144d39e3c84d8a [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"],
markchien2f59ec92020-09-02 16:23:38 +0800626 bpfs: ["bpf"],
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
Jooyung Hanf21c7972019-12-16 22:32:06 +0900679 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000680 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900681 "etc/myetc",
682 "javalib/myjar.jar",
683 "lib64/mylib.so",
684 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900685 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800686 "etc/bpf/bpf.o",
687 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900688 })
689}
690
Jooyung Han01a3ee22019-11-02 02:52:25 +0900691func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800692 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693 apex {
694 name: "myapex",
695 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000696 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900697 }
698
699 apex_key {
700 name: "myapex.key",
701 public_key: "testkey.avbpubkey",
702 private_key: "testkey.pem",
703 }
704 `)
705
706 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900707 args := module.Rule("apexRule").Args
708 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
709 t.Error("manifest should be apex_manifest.pb, but " + manifest)
710 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900711}
712
Liz Kammer4854a7d2021-05-27 14:28:27 -0400713func TestApexManifestMinSdkVersion(t *testing.T) {
714 ctx := testApex(t, `
715 apex_defaults {
716 name: "my_defaults",
717 key: "myapex.key",
718 product_specific: true,
719 file_contexts: ":my-file-contexts",
720 updatable: false,
721 }
722 apex {
723 name: "myapex_30",
724 min_sdk_version: "30",
725 defaults: ["my_defaults"],
726 }
727
728 apex {
729 name: "myapex_current",
730 min_sdk_version: "current",
731 defaults: ["my_defaults"],
732 }
733
734 apex {
735 name: "myapex_none",
736 defaults: ["my_defaults"],
737 }
738
739 apex_key {
740 name: "myapex.key",
741 public_key: "testkey.avbpubkey",
742 private_key: "testkey.pem",
743 }
744
745 filegroup {
746 name: "my-file-contexts",
747 srcs: ["product_specific_file_contexts"],
748 }
749 `, withFiles(map[string][]byte{
750 "product_specific_file_contexts": nil,
751 }), android.FixtureModifyProductVariables(
752 func(variables android.FixtureProductVariables) {
753 variables.Unbundled_build = proptools.BoolPtr(true)
754 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
755 }), android.FixtureMergeEnv(map[string]string{
756 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
757 }))
758
759 testCases := []struct {
760 module string
761 minSdkVersion string
762 }{
763 {
764 module: "myapex_30",
765 minSdkVersion: "30",
766 },
767 {
768 module: "myapex_current",
769 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
770 },
771 {
772 module: "myapex_none",
773 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
774 },
775 }
776 for _, tc := range testCases {
777 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
778 args := module.Rule("apexRule").Args
779 optFlags := args["opt_flags"]
780 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
781 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
782 }
783 }
784}
785
Alex Light5098a612018-11-29 17:12:15 -0800786func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800787 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800788 apex {
789 name: "myapex",
790 key: "myapex.key",
791 payload_type: "zip",
792 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000793 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800794 }
795
796 apex_key {
797 name: "myapex.key",
798 public_key: "testkey.avbpubkey",
799 private_key: "testkey.pem",
800 }
801
802 cc_library {
803 name: "mylib",
804 srcs: ["mylib.cpp"],
805 shared_libs: ["mylib2"],
806 system_shared_libs: [],
807 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000808 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800809 }
810
811 cc_library {
812 name: "mylib2",
813 srcs: ["mylib.cpp"],
814 system_shared_libs: [],
815 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000816 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800817 }
818 `)
819
Sundong Ahnabb64432019-10-22 13:58:29 +0900820 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800821 copyCmds := zipApexRule.Args["copy_commands"]
822
823 // Ensure that main rule creates an output
824 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
825
826 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700827 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800828
829 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800831
832 // Ensure that both direct and indirect deps are copied into apex
833 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
834 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900835}
836
837func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800838 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900839 apex {
840 name: "myapex",
841 key: "myapex.key",
842 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900843 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000844 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900845 }
846
847 apex_key {
848 name: "myapex.key",
849 public_key: "testkey.avbpubkey",
850 private_key: "testkey.pem",
851 }
852
853 cc_library {
854 name: "mylib",
855 srcs: ["mylib.cpp"],
856 shared_libs: ["mylib2", "mylib3"],
857 system_shared_libs: [],
858 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000859 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900860 }
861
862 cc_library {
863 name: "mylib2",
864 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900865 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900866 system_shared_libs: [],
867 stl: "none",
868 stubs: {
869 versions: ["1", "2", "3"],
870 },
871 }
872
873 cc_library {
874 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900875 srcs: ["mylib.cpp"],
876 shared_libs: ["mylib4"],
877 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900878 stl: "none",
879 stubs: {
880 versions: ["10", "11", "12"],
881 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000882 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900883 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900884
885 cc_library {
886 name: "mylib4",
887 srcs: ["mylib.cpp"],
888 system_shared_libs: [],
889 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000890 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900891 }
Jiyong Park105dc322021-06-11 17:22:09 +0900892
893 rust_binary {
894 name: "foo.rust",
895 srcs: ["foo.rs"],
896 shared_libs: ["libfoo.shared_from_rust"],
897 prefer_rlib: true,
898 apex_available: ["myapex"],
899 }
900
901 cc_library_shared {
902 name: "libfoo.shared_from_rust",
903 srcs: ["mylib.cpp"],
904 system_shared_libs: [],
905 stl: "none",
906 stubs: {
907 versions: ["10", "11", "12"],
908 },
909 }
910
Jiyong Park25fc6a92018-11-18 18:02:45 +0900911 `)
912
Sundong Ahnabb64432019-10-22 13:58:29 +0900913 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914 copyCmds := apexRule.Args["copy_commands"]
915
916 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800917 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918
919 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800920 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921
922 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800923 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924
Colin Crossaede88c2020-08-11 12:17:01 -0700925 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900926
927 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900928 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900929 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900930 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931
932 // 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 -0700933 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900934 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700935 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900936
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700937 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
938 // is replaced by sharing of "cFlags" in cc/builder.go.
939 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
940 // module variable representing "cflags". So it was not detected by ensureNotContains.
941 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
942 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
943 // including the original cflags's "-include mylib.h".
944 //
Jiyong Park64379952018-12-13 18:37:29 +0900945 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700946 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
947 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900948
949 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700950 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900951
Jooyung Hana57af4a2020-01-23 05:36:59 +0000952 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900953 "lib64/mylib.so",
954 "lib64/mylib3.so",
955 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900956 "bin/foo.rust",
957 "lib64/libc++.so", // by the implicit dependency from foo.rust
958 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900959 })
Jiyong Park105dc322021-06-11 17:22:09 +0900960
961 // Ensure that stub dependency from a rust module is not included
962 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
963 // The rust module is linked to the stub cc library
964 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
965 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
966 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900967}
968
Jiyong Park1bc84122021-06-22 20:23:05 +0900969func TestApexCanUsePrivateApis(t *testing.T) {
970 ctx := testApex(t, `
971 apex {
972 name: "myapex",
973 key: "myapex.key",
974 native_shared_libs: ["mylib"],
975 binaries: ["foo.rust"],
976 updatable: false,
977 platform_apis: true,
978 }
979
980 apex_key {
981 name: "myapex.key",
982 public_key: "testkey.avbpubkey",
983 private_key: "testkey.pem",
984 }
985
986 cc_library {
987 name: "mylib",
988 srcs: ["mylib.cpp"],
989 shared_libs: ["mylib2"],
990 system_shared_libs: [],
991 stl: "none",
992 apex_available: [ "myapex" ],
993 }
994
995 cc_library {
996 name: "mylib2",
997 srcs: ["mylib.cpp"],
998 cflags: ["-include mylib.h"],
999 system_shared_libs: [],
1000 stl: "none",
1001 stubs: {
1002 versions: ["1", "2", "3"],
1003 },
1004 }
1005
1006 rust_binary {
1007 name: "foo.rust",
1008 srcs: ["foo.rs"],
1009 shared_libs: ["libfoo.shared_from_rust"],
1010 prefer_rlib: true,
1011 apex_available: ["myapex"],
1012 }
1013
1014 cc_library_shared {
1015 name: "libfoo.shared_from_rust",
1016 srcs: ["mylib.cpp"],
1017 system_shared_libs: [],
1018 stl: "none",
1019 stubs: {
1020 versions: ["10", "11", "12"],
1021 },
1022 }
1023 `)
1024
1025 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1026 copyCmds := apexRule.Args["copy_commands"]
1027
1028 // Ensure that indirect stubs dep is not included
1029 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1030 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1031
1032 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1033 // of the platform_apis: true)
1034 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000_private").Rule("ld").Args["libFlags"]
1035 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1036 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1037 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000_private").Rule("rustc").Args["linkFlags"]
1038 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1039 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1040}
1041
Colin Cross7812fd32020-09-25 12:35:10 -07001042func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1043 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001044 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001045 apex {
1046 name: "myapex",
1047 key: "myapex.key",
1048 native_shared_libs: ["mylib", "mylib3"],
1049 min_sdk_version: "29",
1050 }
1051
1052 apex_key {
1053 name: "myapex.key",
1054 public_key: "testkey.avbpubkey",
1055 private_key: "testkey.pem",
1056 }
1057
1058 cc_library {
1059 name: "mylib",
1060 srcs: ["mylib.cpp"],
1061 shared_libs: ["mylib2", "mylib3"],
1062 system_shared_libs: [],
1063 stl: "none",
1064 apex_available: [ "myapex" ],
1065 min_sdk_version: "28",
1066 }
1067
1068 cc_library {
1069 name: "mylib2",
1070 srcs: ["mylib.cpp"],
1071 cflags: ["-include mylib.h"],
1072 system_shared_libs: [],
1073 stl: "none",
1074 stubs: {
1075 versions: ["28", "29", "30", "current"],
1076 },
1077 min_sdk_version: "28",
1078 }
1079
1080 cc_library {
1081 name: "mylib3",
1082 srcs: ["mylib.cpp"],
1083 shared_libs: ["mylib4"],
1084 system_shared_libs: [],
1085 stl: "none",
1086 stubs: {
1087 versions: ["28", "29", "30", "current"],
1088 },
1089 apex_available: [ "myapex" ],
1090 min_sdk_version: "28",
1091 }
1092
1093 cc_library {
1094 name: "mylib4",
1095 srcs: ["mylib.cpp"],
1096 system_shared_libs: [],
1097 stl: "none",
1098 apex_available: [ "myapex" ],
1099 min_sdk_version: "28",
1100 }
1101 `)
1102
1103 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1104 copyCmds := apexRule.Args["copy_commands"]
1105
1106 // Ensure that direct non-stubs dep is always included
1107 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1108
1109 // Ensure that indirect stubs dep is not included
1110 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1111
1112 // Ensure that direct stubs dep is included
1113 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1114
1115 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1116
Jiyong Park55549df2021-02-26 23:57:23 +09001117 // Ensure that mylib is linking with the latest version of stub for mylib2
1118 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001119 // ... and not linking to the non-stub (impl) variant of mylib2
1120 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1121
1122 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1123 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1124 // .. and not linking to the stubs variant of mylib3
1125 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1126
1127 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001128 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001129 ensureNotContains(t, mylib2Cflags, "-include ")
1130
1131 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -07001132 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -07001133
1134 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1135 "lib64/mylib.so",
1136 "lib64/mylib3.so",
1137 "lib64/mylib4.so",
1138 })
1139}
1140
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001141func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1142 t.Parallel()
1143 // myapex (Z)
1144 // mylib -----------------.
1145 // |
1146 // otherapex (29) |
1147 // libstub's versions: 29 Z current
1148 // |
1149 // <platform> |
1150 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001151 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001152 apex {
1153 name: "myapex",
1154 key: "myapex.key",
1155 native_shared_libs: ["mylib"],
1156 min_sdk_version: "Z", // non-final
1157 }
1158
1159 cc_library {
1160 name: "mylib",
1161 srcs: ["mylib.cpp"],
1162 shared_libs: ["libstub"],
1163 apex_available: ["myapex"],
1164 min_sdk_version: "Z",
1165 }
1166
1167 apex_key {
1168 name: "myapex.key",
1169 public_key: "testkey.avbpubkey",
1170 private_key: "testkey.pem",
1171 }
1172
1173 apex {
1174 name: "otherapex",
1175 key: "myapex.key",
1176 native_shared_libs: ["libstub"],
1177 min_sdk_version: "29",
1178 }
1179
1180 cc_library {
1181 name: "libstub",
1182 srcs: ["mylib.cpp"],
1183 stubs: {
1184 versions: ["29", "Z", "current"],
1185 },
1186 apex_available: ["otherapex"],
1187 min_sdk_version: "29",
1188 }
1189
1190 // platform module depending on libstub from otherapex should use the latest stub("current")
1191 cc_library {
1192 name: "libplatform",
1193 srcs: ["mylib.cpp"],
1194 shared_libs: ["libstub"],
1195 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001196 `,
1197 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1198 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1199 variables.Platform_sdk_final = proptools.BoolPtr(false)
1200 variables.Platform_version_active_codenames = []string{"Z"}
1201 }),
1202 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001203
Jiyong Park55549df2021-02-26 23:57:23 +09001204 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001205 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001206 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001207 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001208 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001209
1210 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1211 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1212 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1213 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1214 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1215}
1216
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001217func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001218 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001219 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001220 name: "myapex2",
1221 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001222 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001223 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001224 }
1225
1226 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001227 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001228 public_key: "testkey.avbpubkey",
1229 private_key: "testkey.pem",
1230 }
1231
1232 cc_library {
1233 name: "mylib",
1234 srcs: ["mylib.cpp"],
1235 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001236 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001237 system_shared_libs: [],
1238 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001239 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001240 }
1241
1242 cc_library {
1243 name: "libfoo",
1244 srcs: ["mylib.cpp"],
1245 shared_libs: ["libbar"],
1246 system_shared_libs: [],
1247 stl: "none",
1248 stubs: {
1249 versions: ["10", "20", "30"],
1250 },
1251 }
1252
1253 cc_library {
1254 name: "libbar",
1255 srcs: ["mylib.cpp"],
1256 system_shared_libs: [],
1257 stl: "none",
1258 }
1259
Jiyong Park678c8812020-02-07 17:25:49 +09001260 cc_library_static {
1261 name: "libbaz",
1262 srcs: ["mylib.cpp"],
1263 system_shared_libs: [],
1264 stl: "none",
1265 apex_available: [ "myapex2" ],
1266 }
1267
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001268 `)
1269
Jiyong Park83dc74b2020-01-14 18:38:44 +09001270 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001271 copyCmds := apexRule.Args["copy_commands"]
1272
1273 // Ensure that direct non-stubs dep is always included
1274 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1275
1276 // Ensure that indirect stubs dep is not included
1277 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1278
1279 // Ensure that dependency of stubs is not included
1280 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1281
Colin Crossaede88c2020-08-11 12:17:01 -07001282 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001283
1284 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001285 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001286 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001287 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001288
Jiyong Park3ff16992019-12-27 14:11:47 +09001289 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001290
1291 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1292 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001293
Artur Satayeva8bd1132020-04-27 18:07:06 +01001294 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001295 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001296
Artur Satayeva8bd1132020-04-27 18:07:06 +01001297 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001298 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001299}
1300
Jooyung Hand3639552019-08-09 12:57:43 +09001301func TestApexWithRuntimeLibsDependency(t *testing.T) {
1302 /*
1303 myapex
1304 |
1305 v (runtime_libs)
1306 mylib ------+------> libfoo [provides stub]
1307 |
1308 `------> libbar
1309 */
Colin Cross1c460562021-02-16 17:55:47 -08001310 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001311 apex {
1312 name: "myapex",
1313 key: "myapex.key",
1314 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001315 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001316 }
1317
1318 apex_key {
1319 name: "myapex.key",
1320 public_key: "testkey.avbpubkey",
1321 private_key: "testkey.pem",
1322 }
1323
1324 cc_library {
1325 name: "mylib",
1326 srcs: ["mylib.cpp"],
1327 runtime_libs: ["libfoo", "libbar"],
1328 system_shared_libs: [],
1329 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001330 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001331 }
1332
1333 cc_library {
1334 name: "libfoo",
1335 srcs: ["mylib.cpp"],
1336 system_shared_libs: [],
1337 stl: "none",
1338 stubs: {
1339 versions: ["10", "20", "30"],
1340 },
1341 }
1342
1343 cc_library {
1344 name: "libbar",
1345 srcs: ["mylib.cpp"],
1346 system_shared_libs: [],
1347 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001348 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001349 }
1350
1351 `)
1352
Sundong Ahnabb64432019-10-22 13:58:29 +09001353 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001354 copyCmds := apexRule.Args["copy_commands"]
1355
1356 // Ensure that direct non-stubs dep is always included
1357 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1358
1359 // Ensure that indirect stubs dep is not included
1360 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1361
1362 // Ensure that runtime_libs dep in included
1363 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1364
Sundong Ahnabb64432019-10-22 13:58:29 +09001365 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001366 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1367 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001368
1369}
1370
Paul Duffina02cae32021-03-09 01:44:06 +00001371var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1372 cc.PrepareForTestWithCcBuildComponents,
1373 PrepareForTestWithApexBuildComponents,
1374 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001375 apex {
1376 name: "com.android.runtime",
1377 key: "com.android.runtime.key",
1378 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001379 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001380 }
1381
1382 apex_key {
1383 name: "com.android.runtime.key",
1384 public_key: "testkey.avbpubkey",
1385 private_key: "testkey.pem",
1386 }
Paul Duffina02cae32021-03-09 01:44:06 +00001387 `),
1388 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1389)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001390
Paul Duffina02cae32021-03-09 01:44:06 +00001391func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001392 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001393 cc_library {
1394 name: "libc",
1395 no_libcrt: true,
1396 nocrt: true,
1397 stl: "none",
1398 system_shared_libs: [],
1399 stubs: { versions: ["1"] },
1400 apex_available: ["com.android.runtime"],
1401
1402 sanitize: {
1403 hwaddress: true,
1404 }
1405 }
1406
1407 cc_prebuilt_library_shared {
1408 name: "libclang_rt.hwasan-aarch64-android",
1409 no_libcrt: true,
1410 nocrt: true,
1411 stl: "none",
1412 system_shared_libs: [],
1413 srcs: [""],
1414 stubs: { versions: ["1"] },
1415
1416 sanitize: {
1417 never: true,
1418 },
Paul Duffina02cae32021-03-09 01:44:06 +00001419 } `)
1420 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001421
1422 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1423 "lib64/bionic/libc.so",
1424 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1425 })
1426
1427 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1428
1429 installed := hwasan.Description("install libclang_rt.hwasan")
1430 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1431
1432 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1433 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1434 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1435}
1436
1437func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001438 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001439 prepareForTestOfRuntimeApexWithHwasan,
1440 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1441 variables.SanitizeDevice = []string{"hwaddress"}
1442 }),
1443 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001444 cc_library {
1445 name: "libc",
1446 no_libcrt: true,
1447 nocrt: true,
1448 stl: "none",
1449 system_shared_libs: [],
1450 stubs: { versions: ["1"] },
1451 apex_available: ["com.android.runtime"],
1452 }
1453
1454 cc_prebuilt_library_shared {
1455 name: "libclang_rt.hwasan-aarch64-android",
1456 no_libcrt: true,
1457 nocrt: true,
1458 stl: "none",
1459 system_shared_libs: [],
1460 srcs: [""],
1461 stubs: { versions: ["1"] },
1462
1463 sanitize: {
1464 never: true,
1465 },
1466 }
Paul Duffina02cae32021-03-09 01:44:06 +00001467 `)
1468 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001469
1470 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1471 "lib64/bionic/libc.so",
1472 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1473 })
1474
1475 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1476
1477 installed := hwasan.Description("install libclang_rt.hwasan")
1478 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1479
1480 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1481 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1482 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1483}
1484
Jooyung Han61b66e92020-03-21 14:21:46 +00001485func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1486 testcases := []struct {
1487 name string
1488 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001489 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001490 shouldLink string
1491 shouldNotLink []string
1492 }{
1493 {
Jiyong Park55549df2021-02-26 23:57:23 +09001494 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001495 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001496 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001497 shouldLink: "current",
1498 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001499 },
1500 {
Jiyong Park55549df2021-02-26 23:57:23 +09001501 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001502 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001503 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001504 shouldLink: "current",
1505 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001506 },
1507 }
1508 for _, tc := range testcases {
1509 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001510 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001511 apex {
1512 name: "myapex",
1513 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001514 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001515 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001516 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001517 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001518
Jooyung Han61b66e92020-03-21 14:21:46 +00001519 apex_key {
1520 name: "myapex.key",
1521 public_key: "testkey.avbpubkey",
1522 private_key: "testkey.pem",
1523 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001524
Jooyung Han61b66e92020-03-21 14:21:46 +00001525 cc_library {
1526 name: "mylib",
1527 srcs: ["mylib.cpp"],
1528 vendor_available: true,
1529 shared_libs: ["libbar"],
1530 system_shared_libs: [],
1531 stl: "none",
1532 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001533 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001534 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001535
Jooyung Han61b66e92020-03-21 14:21:46 +00001536 cc_library {
1537 name: "libbar",
1538 srcs: ["mylib.cpp"],
1539 system_shared_libs: [],
1540 stl: "none",
1541 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001542 llndk: {
1543 symbol_file: "libbar.map.txt",
1544 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001545 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001546 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001547 withUnbundledBuild,
1548 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001549
Jooyung Han61b66e92020-03-21 14:21:46 +00001550 // Ensure that LLNDK dep is not included
1551 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1552 "lib64/mylib.so",
1553 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001554
Jooyung Han61b66e92020-03-21 14:21:46 +00001555 // Ensure that LLNDK dep is required
1556 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1557 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1558 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001559
Steven Moreland2c4000c2021-04-27 02:08:49 +00001560 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1561 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001562 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001563 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001564 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001565
Steven Moreland2c4000c2021-04-27 02:08:49 +00001566 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001567 ver := tc.shouldLink
1568 if tc.shouldLink == "current" {
1569 ver = strconv.Itoa(android.FutureApiLevelInt)
1570 }
1571 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 })
1573 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001574}
1575
Jiyong Park25fc6a92018-11-18 18:02:45 +09001576func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001577 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001578 apex {
1579 name: "myapex",
1580 key: "myapex.key",
1581 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001582 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001583 }
1584
1585 apex_key {
1586 name: "myapex.key",
1587 public_key: "testkey.avbpubkey",
1588 private_key: "testkey.pem",
1589 }
1590
1591 cc_library {
1592 name: "mylib",
1593 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001594 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001595 shared_libs: ["libdl#27"],
1596 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001597 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001598 }
1599
1600 cc_library_shared {
1601 name: "mylib_shared",
1602 srcs: ["mylib.cpp"],
1603 shared_libs: ["libdl#27"],
1604 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001605 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001606 }
1607
1608 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001609 name: "libBootstrap",
1610 srcs: ["mylib.cpp"],
1611 stl: "none",
1612 bootstrap: true,
1613 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001614 `)
1615
Sundong Ahnabb64432019-10-22 13:58:29 +09001616 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001617 copyCmds := apexRule.Args["copy_commands"]
1618
1619 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001620 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001621 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1622 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001623
1624 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001625 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001626
Colin Crossaede88c2020-08-11 12:17:01 -07001627 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1628 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1629 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001630
1631 // For dependency to libc
1632 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001633 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001634 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001635 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001636 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001637 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1638 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001639
1640 // For dependency to libm
1641 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001642 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001643 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001644 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001645 // ... and is not compiling with the stub
1646 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1647 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1648
1649 // For dependency to libdl
1650 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001651 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001652 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001653 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1654 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001655 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001656 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001657 // ... Cflags from stub is correctly exported to mylib
1658 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1659 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001660
1661 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001662 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1663 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1664 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1665 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001666}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001667
Jooyung Han749dc692020-04-15 11:03:39 +09001668func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001669 // there are three links between liba --> libz.
1670 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001671 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001672 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001673 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001674 apex {
1675 name: "myapex",
1676 key: "myapex.key",
1677 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001678 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001679 }
1680
1681 apex {
1682 name: "otherapex",
1683 key: "myapex.key",
1684 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001685 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001686 }
1687
1688 apex_key {
1689 name: "myapex.key",
1690 public_key: "testkey.avbpubkey",
1691 private_key: "testkey.pem",
1692 }
1693
1694 cc_library {
1695 name: "libx",
1696 shared_libs: ["liba"],
1697 system_shared_libs: [],
1698 stl: "none",
1699 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001700 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001701 }
1702
1703 cc_library {
1704 name: "liby",
1705 shared_libs: ["liba"],
1706 system_shared_libs: [],
1707 stl: "none",
1708 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001709 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001710 }
1711
1712 cc_library {
1713 name: "liba",
1714 shared_libs: ["libz"],
1715 system_shared_libs: [],
1716 stl: "none",
1717 apex_available: [
1718 "//apex_available:anyapex",
1719 "//apex_available:platform",
1720 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001721 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001722 }
1723
1724 cc_library {
1725 name: "libz",
1726 system_shared_libs: [],
1727 stl: "none",
1728 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001729 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001730 },
1731 }
Jooyung Han749dc692020-04-15 11:03:39 +09001732 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001733
1734 expectLink := func(from, from_variant, to, to_variant string) {
1735 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1736 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1737 }
1738 expectNoLink := func(from, from_variant, to, to_variant string) {
1739 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1740 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1741 }
1742 // platform liba is linked to non-stub version
1743 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001744 // liba in myapex is linked to current
1745 expectLink("liba", "shared_apex29", "libz", "shared_current")
1746 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001747 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001748 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001749 // liba in otherapex is linked to current
1750 expectLink("liba", "shared_apex30", "libz", "shared_current")
1751 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001752 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1753 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001754}
1755
Jooyung Hanaed150d2020-04-02 01:41:41 +09001756func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001757 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001758 apex {
1759 name: "myapex",
1760 key: "myapex.key",
1761 native_shared_libs: ["libx"],
1762 min_sdk_version: "R",
1763 }
1764
1765 apex_key {
1766 name: "myapex.key",
1767 public_key: "testkey.avbpubkey",
1768 private_key: "testkey.pem",
1769 }
1770
1771 cc_library {
1772 name: "libx",
1773 shared_libs: ["libz"],
1774 system_shared_libs: [],
1775 stl: "none",
1776 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001777 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001778 }
1779
1780 cc_library {
1781 name: "libz",
1782 system_shared_libs: [],
1783 stl: "none",
1784 stubs: {
1785 versions: ["29", "R"],
1786 },
1787 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001788 `,
1789 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1790 variables.Platform_version_active_codenames = []string{"R"}
1791 }),
1792 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001793
1794 expectLink := func(from, from_variant, to, to_variant string) {
1795 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1796 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1797 }
1798 expectNoLink := func(from, from_variant, to, to_variant string) {
1799 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1800 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1801 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001802 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1803 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001804 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1805 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001806}
1807
Jooyung Han4c4da062021-06-23 10:23:16 +09001808func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1809 testApex(t, `
1810 apex {
1811 name: "myapex",
1812 key: "myapex.key",
1813 java_libs: ["libx"],
1814 min_sdk_version: "S",
1815 }
1816
1817 apex_key {
1818 name: "myapex.key",
1819 public_key: "testkey.avbpubkey",
1820 private_key: "testkey.pem",
1821 }
1822
1823 java_library {
1824 name: "libx",
1825 srcs: ["a.java"],
1826 apex_available: [ "myapex" ],
1827 sdk_version: "current",
1828 min_sdk_version: "S", // should be okay
1829 }
1830 `,
1831 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1832 variables.Platform_version_active_codenames = []string{"S"}
1833 variables.Platform_sdk_codename = proptools.StringPtr("S")
1834 }),
1835 )
1836}
1837
Jooyung Han749dc692020-04-15 11:03:39 +09001838func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001839 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001840 apex {
1841 name: "myapex",
1842 key: "myapex.key",
1843 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001844 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001845 }
1846
1847 apex_key {
1848 name: "myapex.key",
1849 public_key: "testkey.avbpubkey",
1850 private_key: "testkey.pem",
1851 }
1852
1853 cc_library {
1854 name: "libx",
1855 shared_libs: ["libz"],
1856 system_shared_libs: [],
1857 stl: "none",
1858 apex_available: [ "myapex" ],
1859 }
1860
1861 cc_library {
1862 name: "libz",
1863 system_shared_libs: [],
1864 stl: "none",
1865 stubs: {
1866 versions: ["1", "2"],
1867 },
1868 }
1869 `)
1870
1871 expectLink := func(from, from_variant, to, to_variant string) {
1872 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1873 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1874 }
1875 expectNoLink := func(from, from_variant, to, to_variant string) {
1876 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1877 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1878 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001879 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001880 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001881 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001882 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001883}
1884
Jiyong Park5df7bd32021-08-25 16:18:46 +09001885func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1886 ctx := testApex(t, `
1887 apex {
1888 name: "myapex",
1889 key: "myapex.key",
1890 native_shared_libs: ["mylib"],
1891 updatable: false,
1892 vendor: true,
1893 min_sdk_version: "29",
1894 }
1895
1896 apex_key {
1897 name: "myapex.key",
1898 public_key: "testkey.avbpubkey",
1899 private_key: "testkey.pem",
1900 }
1901
1902 cc_library {
1903 name: "mylib",
1904 vendor_available: true,
1905 system_shared_libs: [],
1906 stl: "none",
1907 apex_available: [ "myapex" ],
1908 min_sdk_version: "29",
1909 }
1910 `)
1911
1912 vendorVariant := "android_vendor.29_arm64_armv8-a"
1913
1914 // First check that the correct variant of crtbegin_so is used.
1915 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1916 crtBegin := names(ldRule.Args["crtBegin"])
1917 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1918
1919 // Ensure that the crtbegin_so used by the APEX is targeting 29
1920 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1921 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1922}
1923
Jooyung Han03b51852020-02-26 22:45:42 +09001924func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001925 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001926 apex {
1927 name: "myapex",
1928 key: "myapex.key",
1929 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001930 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001931 }
1932
1933 apex_key {
1934 name: "myapex.key",
1935 public_key: "testkey.avbpubkey",
1936 private_key: "testkey.pem",
1937 }
1938
1939 cc_library {
1940 name: "libx",
1941 system_shared_libs: [],
1942 stl: "none",
1943 apex_available: [ "myapex" ],
1944 stubs: {
1945 versions: ["1", "2"],
1946 },
1947 }
1948
1949 cc_library {
1950 name: "libz",
1951 shared_libs: ["libx"],
1952 system_shared_libs: [],
1953 stl: "none",
1954 }
1955 `)
1956
1957 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001958 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001959 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1960 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1961 }
1962 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001963 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001964 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1965 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1966 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001967 expectLink("libz", "shared", "libx", "shared_current")
1968 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001969 expectNoLink("libz", "shared", "libz", "shared_1")
1970 expectNoLink("libz", "shared", "libz", "shared")
1971}
1972
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001973var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1974 func(variables android.FixtureProductVariables) {
1975 variables.SanitizeDevice = []string{"hwaddress"}
1976 },
1977)
1978
Jooyung Han75568392020-03-20 04:29:24 +09001979func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001980 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001981 apex {
1982 name: "myapex",
1983 key: "myapex.key",
1984 native_shared_libs: ["libx"],
1985 min_sdk_version: "29",
1986 }
1987
1988 apex_key {
1989 name: "myapex.key",
1990 public_key: "testkey.avbpubkey",
1991 private_key: "testkey.pem",
1992 }
1993
1994 cc_library {
1995 name: "libx",
1996 shared_libs: ["libbar"],
1997 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001998 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001999 }
2000
2001 cc_library {
2002 name: "libbar",
2003 stubs: {
2004 versions: ["29", "30"],
2005 },
2006 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002007 `,
2008 prepareForTestWithSantitizeHwaddress,
2009 )
Jooyung Han03b51852020-02-26 22:45:42 +09002010 expectLink := func(from, from_variant, to, to_variant string) {
2011 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2012 libFlags := ld.Args["libFlags"]
2013 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2014 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002015 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002016}
2017
Jooyung Han75568392020-03-20 04:29:24 +09002018func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002019 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002020 apex {
2021 name: "myapex",
2022 key: "myapex.key",
2023 native_shared_libs: ["libx"],
2024 min_sdk_version: "29",
2025 }
2026
2027 apex_key {
2028 name: "myapex.key",
2029 public_key: "testkey.avbpubkey",
2030 private_key: "testkey.pem",
2031 }
2032
2033 cc_library {
2034 name: "libx",
2035 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002036 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002037 }
Jooyung Han75568392020-03-20 04:29:24 +09002038 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002039
2040 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002041 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002042 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002043 // note that platform variant is not.
2044 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002045 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002046}
2047
Jooyung Han749dc692020-04-15 11:03:39 +09002048func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2049 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002050 apex {
2051 name: "myapex",
2052 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002053 native_shared_libs: ["mylib"],
2054 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002055 }
2056
2057 apex_key {
2058 name: "myapex.key",
2059 public_key: "testkey.avbpubkey",
2060 private_key: "testkey.pem",
2061 }
Jooyung Han749dc692020-04-15 11:03:39 +09002062
2063 cc_library {
2064 name: "mylib",
2065 srcs: ["mylib.cpp"],
2066 system_shared_libs: [],
2067 stl: "none",
2068 apex_available: [
2069 "myapex",
2070 ],
2071 min_sdk_version: "30",
2072 }
2073 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002074
2075 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2076 apex {
2077 name: "myapex",
2078 key: "myapex.key",
2079 native_shared_libs: ["libfoo.ffi"],
2080 min_sdk_version: "29",
2081 }
2082
2083 apex_key {
2084 name: "myapex.key",
2085 public_key: "testkey.avbpubkey",
2086 private_key: "testkey.pem",
2087 }
2088
2089 rust_ffi_shared {
2090 name: "libfoo.ffi",
2091 srcs: ["foo.rs"],
2092 crate_name: "foo",
2093 apex_available: [
2094 "myapex",
2095 ],
2096 min_sdk_version: "30",
2097 }
2098 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002099
2100 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2101 apex {
2102 name: "myapex",
2103 key: "myapex.key",
2104 java_libs: ["libfoo"],
2105 min_sdk_version: "29",
2106 }
2107
2108 apex_key {
2109 name: "myapex.key",
2110 public_key: "testkey.avbpubkey",
2111 private_key: "testkey.pem",
2112 }
2113
2114 java_import {
2115 name: "libfoo",
2116 jars: ["libfoo.jar"],
2117 apex_available: [
2118 "myapex",
2119 ],
2120 min_sdk_version: "30",
2121 }
2122 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002123}
2124
2125func TestApexMinSdkVersion_Okay(t *testing.T) {
2126 testApex(t, `
2127 apex {
2128 name: "myapex",
2129 key: "myapex.key",
2130 native_shared_libs: ["libfoo"],
2131 java_libs: ["libbar"],
2132 min_sdk_version: "29",
2133 }
2134
2135 apex_key {
2136 name: "myapex.key",
2137 public_key: "testkey.avbpubkey",
2138 private_key: "testkey.pem",
2139 }
2140
2141 cc_library {
2142 name: "libfoo",
2143 srcs: ["mylib.cpp"],
2144 shared_libs: ["libfoo_dep"],
2145 apex_available: ["myapex"],
2146 min_sdk_version: "29",
2147 }
2148
2149 cc_library {
2150 name: "libfoo_dep",
2151 srcs: ["mylib.cpp"],
2152 apex_available: ["myapex"],
2153 min_sdk_version: "29",
2154 }
2155
2156 java_library {
2157 name: "libbar",
2158 sdk_version: "current",
2159 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002160 static_libs: [
2161 "libbar_dep",
2162 "libbar_import_dep",
2163 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002164 apex_available: ["myapex"],
2165 min_sdk_version: "29",
2166 }
2167
2168 java_library {
2169 name: "libbar_dep",
2170 sdk_version: "current",
2171 srcs: ["a.java"],
2172 apex_available: ["myapex"],
2173 min_sdk_version: "29",
2174 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002175
2176 java_import {
2177 name: "libbar_import_dep",
2178 jars: ["libbar.jar"],
2179 apex_available: ["myapex"],
2180 min_sdk_version: "29",
2181 }
Jooyung Han03b51852020-02-26 22:45:42 +09002182 `)
2183}
2184
Artur Satayev8cf899a2020-04-15 17:29:42 +01002185func TestJavaStableSdkVersion(t *testing.T) {
2186 testCases := []struct {
2187 name string
2188 expectedError string
2189 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002190 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002191 }{
2192 {
2193 name: "Non-updatable apex with non-stable dep",
2194 bp: `
2195 apex {
2196 name: "myapex",
2197 java_libs: ["myjar"],
2198 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002199 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002200 }
2201 apex_key {
2202 name: "myapex.key",
2203 public_key: "testkey.avbpubkey",
2204 private_key: "testkey.pem",
2205 }
2206 java_library {
2207 name: "myjar",
2208 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002209 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002210 apex_available: ["myapex"],
2211 }
2212 `,
2213 },
2214 {
2215 name: "Updatable apex with stable dep",
2216 bp: `
2217 apex {
2218 name: "myapex",
2219 java_libs: ["myjar"],
2220 key: "myapex.key",
2221 updatable: true,
2222 min_sdk_version: "29",
2223 }
2224 apex_key {
2225 name: "myapex.key",
2226 public_key: "testkey.avbpubkey",
2227 private_key: "testkey.pem",
2228 }
2229 java_library {
2230 name: "myjar",
2231 srcs: ["foo/bar/MyClass.java"],
2232 sdk_version: "current",
2233 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002234 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002235 }
2236 `,
2237 },
2238 {
2239 name: "Updatable apex with non-stable dep",
2240 expectedError: "cannot depend on \"myjar\"",
2241 bp: `
2242 apex {
2243 name: "myapex",
2244 java_libs: ["myjar"],
2245 key: "myapex.key",
2246 updatable: true,
2247 }
2248 apex_key {
2249 name: "myapex.key",
2250 public_key: "testkey.avbpubkey",
2251 private_key: "testkey.pem",
2252 }
2253 java_library {
2254 name: "myjar",
2255 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002256 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002257 apex_available: ["myapex"],
2258 }
2259 `,
2260 },
2261 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002262 name: "Updatable apex with non-stable legacy core platform dep",
2263 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2264 bp: `
2265 apex {
2266 name: "myapex",
2267 java_libs: ["myjar-uses-legacy"],
2268 key: "myapex.key",
2269 updatable: true,
2270 }
2271 apex_key {
2272 name: "myapex.key",
2273 public_key: "testkey.avbpubkey",
2274 private_key: "testkey.pem",
2275 }
2276 java_library {
2277 name: "myjar-uses-legacy",
2278 srcs: ["foo/bar/MyClass.java"],
2279 sdk_version: "core_platform",
2280 apex_available: ["myapex"],
2281 }
2282 `,
2283 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2284 },
2285 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002286 name: "Updatable apex with non-stable transitive dep",
2287 // This is not actually detecting that the transitive dependency is unstable, rather it is
2288 // detecting that the transitive dependency is building against a wider API surface than the
2289 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002290 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002291 bp: `
2292 apex {
2293 name: "myapex",
2294 java_libs: ["myjar"],
2295 key: "myapex.key",
2296 updatable: true,
2297 }
2298 apex_key {
2299 name: "myapex.key",
2300 public_key: "testkey.avbpubkey",
2301 private_key: "testkey.pem",
2302 }
2303 java_library {
2304 name: "myjar",
2305 srcs: ["foo/bar/MyClass.java"],
2306 sdk_version: "current",
2307 apex_available: ["myapex"],
2308 static_libs: ["transitive-jar"],
2309 }
2310 java_library {
2311 name: "transitive-jar",
2312 srcs: ["foo/bar/MyClass.java"],
2313 sdk_version: "core_platform",
2314 apex_available: ["myapex"],
2315 }
2316 `,
2317 },
2318 }
2319
2320 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002321 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2322 continue
2323 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002324 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002325 errorHandler := android.FixtureExpectsNoErrors
2326 if test.expectedError != "" {
2327 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002328 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002329 android.GroupFixturePreparers(
2330 java.PrepareForTestWithJavaDefaultModules,
2331 PrepareForTestWithApexBuildComponents,
2332 prepareForTestWithMyapex,
2333 android.OptionalFixturePreparer(test.preparer),
2334 ).
2335 ExtendWithErrorHandler(errorHandler).
2336 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002337 })
2338 }
2339}
2340
Jooyung Han749dc692020-04-15 11:03:39 +09002341func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2342 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2343 apex {
2344 name: "myapex",
2345 key: "myapex.key",
2346 native_shared_libs: ["mylib"],
2347 min_sdk_version: "29",
2348 }
2349
2350 apex_key {
2351 name: "myapex.key",
2352 public_key: "testkey.avbpubkey",
2353 private_key: "testkey.pem",
2354 }
2355
2356 cc_library {
2357 name: "mylib",
2358 srcs: ["mylib.cpp"],
2359 shared_libs: ["mylib2"],
2360 system_shared_libs: [],
2361 stl: "none",
2362 apex_available: [
2363 "myapex",
2364 ],
2365 min_sdk_version: "29",
2366 }
2367
2368 // indirect part of the apex
2369 cc_library {
2370 name: "mylib2",
2371 srcs: ["mylib.cpp"],
2372 system_shared_libs: [],
2373 stl: "none",
2374 apex_available: [
2375 "myapex",
2376 ],
2377 min_sdk_version: "30",
2378 }
2379 `)
2380}
2381
2382func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2383 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2384 apex {
2385 name: "myapex",
2386 key: "myapex.key",
2387 apps: ["AppFoo"],
2388 min_sdk_version: "29",
2389 }
2390
2391 apex_key {
2392 name: "myapex.key",
2393 public_key: "testkey.avbpubkey",
2394 private_key: "testkey.pem",
2395 }
2396
2397 android_app {
2398 name: "AppFoo",
2399 srcs: ["foo/bar/MyClass.java"],
2400 sdk_version: "current",
2401 min_sdk_version: "29",
2402 system_modules: "none",
2403 stl: "none",
2404 static_libs: ["bar"],
2405 apex_available: [ "myapex" ],
2406 }
2407
2408 java_library {
2409 name: "bar",
2410 sdk_version: "current",
2411 srcs: ["a.java"],
2412 apex_available: [ "myapex" ],
2413 }
2414 `)
2415}
2416
2417func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002418 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002419 apex {
2420 name: "myapex",
2421 key: "myapex.key",
2422 native_shared_libs: ["mylib"],
2423 min_sdk_version: "29",
2424 }
2425
2426 apex_key {
2427 name: "myapex.key",
2428 public_key: "testkey.avbpubkey",
2429 private_key: "testkey.pem",
2430 }
2431
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002432 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002433 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2434 cc_library {
2435 name: "mylib",
2436 srcs: ["mylib.cpp"],
2437 shared_libs: ["mylib2"],
2438 system_shared_libs: [],
2439 stl: "none",
2440 apex_available: ["myapex", "otherapex"],
2441 min_sdk_version: "29",
2442 }
2443
2444 cc_library {
2445 name: "mylib2",
2446 srcs: ["mylib.cpp"],
2447 system_shared_libs: [],
2448 stl: "none",
2449 apex_available: ["otherapex"],
2450 stubs: { versions: ["29", "30"] },
2451 min_sdk_version: "30",
2452 }
2453
2454 apex {
2455 name: "otherapex",
2456 key: "myapex.key",
2457 native_shared_libs: ["mylib", "mylib2"],
2458 min_sdk_version: "30",
2459 }
2460 `)
2461 expectLink := func(from, from_variant, to, to_variant string) {
2462 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2463 libFlags := ld.Args["libFlags"]
2464 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2465 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002466 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002467 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002468}
2469
Jooyung Haned124c32021-01-26 11:43:46 +09002470func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002471 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2472 func(variables android.FixtureProductVariables) {
2473 variables.Platform_sdk_codename = proptools.StringPtr("S")
2474 variables.Platform_version_active_codenames = []string{"S"}
2475 },
2476 )
Jooyung Haned124c32021-01-26 11:43:46 +09002477 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2478 apex {
2479 name: "myapex",
2480 key: "myapex.key",
2481 native_shared_libs: ["libfoo"],
2482 min_sdk_version: "S",
2483 }
2484 apex_key {
2485 name: "myapex.key",
2486 public_key: "testkey.avbpubkey",
2487 private_key: "testkey.pem",
2488 }
2489 cc_library {
2490 name: "libfoo",
2491 shared_libs: ["libbar"],
2492 apex_available: ["myapex"],
2493 min_sdk_version: "29",
2494 }
2495 cc_library {
2496 name: "libbar",
2497 apex_available: ["myapex"],
2498 }
2499 `, withSAsActiveCodeNames)
2500}
2501
2502func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002503 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2504 variables.Platform_sdk_codename = proptools.StringPtr("S")
2505 variables.Platform_version_active_codenames = []string{"S", "T"}
2506 })
Colin Cross1c460562021-02-16 17:55:47 -08002507 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002508 apex {
2509 name: "myapex",
2510 key: "myapex.key",
2511 native_shared_libs: ["libfoo"],
2512 min_sdk_version: "S",
2513 }
2514 apex_key {
2515 name: "myapex.key",
2516 public_key: "testkey.avbpubkey",
2517 private_key: "testkey.pem",
2518 }
2519 cc_library {
2520 name: "libfoo",
2521 shared_libs: ["libbar"],
2522 apex_available: ["myapex"],
2523 min_sdk_version: "S",
2524 }
2525 cc_library {
2526 name: "libbar",
2527 stubs: {
2528 symbol_file: "libbar.map.txt",
2529 versions: ["30", "S", "T"],
2530 },
2531 }
2532 `, withSAsActiveCodeNames)
2533
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002534 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002535 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2536 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002537 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002538}
2539
Jiyong Park7c2ee712018-12-07 00:42:25 +09002540func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002541 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002542 apex {
2543 name: "myapex",
2544 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002545 native_shared_libs: ["mylib"],
2546 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002547 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002548 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002549 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002550 }
2551
2552 apex_key {
2553 name: "myapex.key",
2554 public_key: "testkey.avbpubkey",
2555 private_key: "testkey.pem",
2556 }
2557
2558 prebuilt_etc {
2559 name: "myetc",
2560 src: "myprebuilt",
2561 sub_dir: "foo/bar",
2562 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002563
2564 cc_library {
2565 name: "mylib",
2566 srcs: ["mylib.cpp"],
2567 relative_install_path: "foo/bar",
2568 system_shared_libs: [],
2569 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002570 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002571 }
2572
2573 cc_binary {
2574 name: "mybin",
2575 srcs: ["mylib.cpp"],
2576 relative_install_path: "foo/bar",
2577 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002578 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002579 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002580 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002581 `)
2582
Sundong Ahnabb64432019-10-22 13:58:29 +09002583 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002584 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002585
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002586 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002587 ensureContains(t, cmd, "/etc ")
2588 ensureContains(t, cmd, "/etc/foo ")
2589 ensureContains(t, cmd, "/etc/foo/bar ")
2590 ensureContains(t, cmd, "/lib64 ")
2591 ensureContains(t, cmd, "/lib64/foo ")
2592 ensureContains(t, cmd, "/lib64/foo/bar ")
2593 ensureContains(t, cmd, "/lib ")
2594 ensureContains(t, cmd, "/lib/foo ")
2595 ensureContains(t, cmd, "/lib/foo/bar ")
2596 ensureContains(t, cmd, "/bin ")
2597 ensureContains(t, cmd, "/bin/foo ")
2598 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002599}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002600
Jooyung Han35155c42020-02-06 17:33:20 +09002601func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002602 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002603 apex {
2604 name: "myapex",
2605 key: "myapex.key",
2606 multilib: {
2607 both: {
2608 native_shared_libs: ["mylib"],
2609 binaries: ["mybin"],
2610 },
2611 },
2612 compile_multilib: "both",
2613 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002614 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002615 }
2616
2617 apex_key {
2618 name: "myapex.key",
2619 public_key: "testkey.avbpubkey",
2620 private_key: "testkey.pem",
2621 }
2622
2623 cc_library {
2624 name: "mylib",
2625 relative_install_path: "foo/bar",
2626 system_shared_libs: [],
2627 stl: "none",
2628 apex_available: [ "myapex" ],
2629 native_bridge_supported: true,
2630 }
2631
2632 cc_binary {
2633 name: "mybin",
2634 relative_install_path: "foo/bar",
2635 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002636 stl: "none",
2637 apex_available: [ "myapex" ],
2638 native_bridge_supported: true,
2639 compile_multilib: "both", // default is "first" for binary
2640 multilib: {
2641 lib64: {
2642 suffix: "64",
2643 },
2644 },
2645 }
2646 `, withNativeBridgeEnabled)
2647 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2648 "bin/foo/bar/mybin",
2649 "bin/foo/bar/mybin64",
2650 "bin/arm/foo/bar/mybin",
2651 "bin/arm64/foo/bar/mybin64",
2652 "lib/foo/bar/mylib.so",
2653 "lib/arm/foo/bar/mylib.so",
2654 "lib64/foo/bar/mylib.so",
2655 "lib64/arm64/foo/bar/mylib.so",
2656 })
2657}
2658
Jooyung Han85d61762020-06-24 23:50:26 +09002659func TestVendorApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002660 ctx := testApex(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002661 apex {
2662 name: "myapex",
2663 key: "myapex.key",
2664 binaries: ["mybin"],
2665 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002666 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002667 }
2668 apex_key {
2669 name: "myapex.key",
2670 public_key: "testkey.avbpubkey",
2671 private_key: "testkey.pem",
2672 }
2673 cc_binary {
2674 name: "mybin",
2675 vendor: true,
2676 shared_libs: ["libfoo"],
2677 }
2678 cc_library {
2679 name: "libfoo",
2680 proprietary: true,
2681 }
2682 `)
2683
2684 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2685 "bin/mybin",
2686 "lib64/libfoo.so",
2687 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2688 "lib64/libc++.so",
2689 })
2690
2691 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002692 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002693 name := apexBundle.BaseModuleName()
2694 prefix := "TARGET_"
2695 var builder strings.Builder
2696 data.Custom(&builder, name, prefix, "", data)
Paul Duffin37ba3442021-03-29 00:21:08 +01002697 androidMk := android.StringRelativeToTop(ctx.Config(), builder.String())
2698 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002699 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002700
2701 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2702 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2703 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002704}
2705
Jooyung Handf78e212020-07-22 15:54:47 +09002706func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002707 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002708 apex {
2709 name: "myapex",
2710 key: "myapex.key",
2711 binaries: ["mybin"],
2712 vendor: true,
2713 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002714 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002715 }
2716 apex_key {
2717 name: "myapex.key",
2718 public_key: "testkey.avbpubkey",
2719 private_key: "testkey.pem",
2720 }
2721 cc_binary {
2722 name: "mybin",
2723 vendor: true,
2724 shared_libs: ["libvndk", "libvendor"],
2725 }
2726 cc_library {
2727 name: "libvndk",
2728 vndk: {
2729 enabled: true,
2730 },
2731 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002732 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002733 }
2734 cc_library {
2735 name: "libvendor",
2736 vendor: true,
2737 }
2738 `)
2739
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002740 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002741
Paul Duffina71a67a2021-03-29 00:42:57 +01002742 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002743 libs := names(ldRule.Args["libFlags"])
2744 // VNDK libs(libvndk/libc++) as they are
Paul Duffin37ba3442021-03-29 00:21:08 +01002745 ensureListContains(t, libs, "out/soong/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2746 ensureListContains(t, libs, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"libc++/"+vendorVariant+"_shared/libc++.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002747 // non-stable Vendor libs as APEX variants
Paul Duffin37ba3442021-03-29 00:21:08 +01002748 ensureListContains(t, libs, "out/soong/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002749
2750 // VNDK libs are not included when use_vndk_as_stable: true
2751 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2752 "bin/mybin",
2753 "lib64/libvendor.so",
2754 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002755
2756 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2757 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2758 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002759}
2760
Justin Yun13decfb2021-03-08 19:25:55 +09002761func TestProductVariant(t *testing.T) {
2762 ctx := testApex(t, `
2763 apex {
2764 name: "myapex",
2765 key: "myapex.key",
2766 updatable: false,
2767 product_specific: true,
2768 binaries: ["foo"],
2769 }
2770
2771 apex_key {
2772 name: "myapex.key",
2773 public_key: "testkey.avbpubkey",
2774 private_key: "testkey.pem",
2775 }
2776
2777 cc_binary {
2778 name: "foo",
2779 product_available: true,
2780 apex_available: ["myapex"],
2781 srcs: ["foo.cpp"],
2782 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002783 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2784 variables.ProductVndkVersion = proptools.StringPtr("current")
2785 }),
2786 )
Justin Yun13decfb2021-03-08 19:25:55 +09002787
2788 cflags := strings.Fields(
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002789 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002790 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2791 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2792 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2793 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2794}
2795
Jooyung Han8e5685d2020-09-21 11:02:57 +09002796func TestApex_withPrebuiltFirmware(t *testing.T) {
2797 testCases := []struct {
2798 name string
2799 additionalProp string
2800 }{
2801 {"system apex with prebuilt_firmware", ""},
2802 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2803 }
2804 for _, tc := range testCases {
2805 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002806 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002807 apex {
2808 name: "myapex",
2809 key: "myapex.key",
2810 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002811 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002812 `+tc.additionalProp+`
2813 }
2814 apex_key {
2815 name: "myapex.key",
2816 public_key: "testkey.avbpubkey",
2817 private_key: "testkey.pem",
2818 }
2819 prebuilt_firmware {
2820 name: "myfirmware",
2821 src: "myfirmware.bin",
2822 filename_from_src: true,
2823 `+tc.additionalProp+`
2824 }
2825 `)
2826 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2827 "etc/firmware/myfirmware.bin",
2828 })
2829 })
2830 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002831}
2832
Jooyung Hanefb184e2020-06-25 17:14:25 +09002833func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002834 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002835 apex {
2836 name: "myapex",
2837 key: "myapex.key",
2838 vendor: true,
2839 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002840 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002841 }
2842
2843 apex_key {
2844 name: "myapex.key",
2845 public_key: "testkey.avbpubkey",
2846 private_key: "testkey.pem",
2847 }
2848
2849 cc_library {
2850 name: "mylib",
2851 vendor_available: true,
2852 }
2853 `)
2854
2855 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002856 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002857 name := apexBundle.BaseModuleName()
2858 prefix := "TARGET_"
2859 var builder strings.Builder
2860 data.Custom(&builder, name, prefix, "", data)
2861 androidMk := builder.String()
2862 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2863}
2864
Jooyung Han2ed99d02020-06-24 23:26:26 +09002865func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002866 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002867 apex {
2868 name: "myapex",
2869 key: "myapex.key",
2870 vintf_fragments: ["fragment.xml"],
2871 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002872 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002873 }
2874 apex_key {
2875 name: "myapex.key",
2876 public_key: "testkey.avbpubkey",
2877 private_key: "testkey.pem",
2878 }
2879 cc_binary {
2880 name: "mybin",
2881 }
2882 `)
2883
2884 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002885 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002886 name := apexBundle.BaseModuleName()
2887 prefix := "TARGET_"
2888 var builder strings.Builder
2889 data.Custom(&builder, name, prefix, "", data)
2890 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002891 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002892 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002893}
2894
Jiyong Park16e91a02018-12-20 18:18:08 +09002895func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002896 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002897 apex {
2898 name: "myapex",
2899 key: "myapex.key",
2900 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002901 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09002902 }
2903
2904 apex_key {
2905 name: "myapex.key",
2906 public_key: "testkey.avbpubkey",
2907 private_key: "testkey.pem",
2908 }
2909
2910 cc_library {
2911 name: "mylib",
2912 srcs: ["mylib.cpp"],
2913 system_shared_libs: [],
2914 stl: "none",
2915 stubs: {
2916 versions: ["1", "2", "3"],
2917 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002918 apex_available: [
2919 "//apex_available:platform",
2920 "myapex",
2921 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002922 }
2923
2924 cc_binary {
2925 name: "not_in_apex",
2926 srcs: ["mylib.cpp"],
2927 static_libs: ["mylib"],
2928 static_executable: true,
2929 system_shared_libs: [],
2930 stl: "none",
2931 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002932 `)
2933
Colin Cross7113d202019-11-20 16:39:12 -08002934 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002935
2936 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002937 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002938}
Jiyong Park9335a262018-12-24 11:31:58 +09002939
2940func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002941 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002942 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002943 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002944 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002945 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002946 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002947 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002948 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09002949 }
2950
2951 cc_library {
2952 name: "mylib",
2953 srcs: ["mylib.cpp"],
2954 system_shared_libs: [],
2955 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002956 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002957 }
2958
2959 apex_key {
2960 name: "myapex.key",
2961 public_key: "testkey.avbpubkey",
2962 private_key: "testkey.pem",
2963 }
2964
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002965 android_app_certificate {
2966 name: "myapex.certificate",
2967 certificate: "testkey",
2968 }
2969
2970 android_app_certificate {
2971 name: "myapex.certificate.override",
2972 certificate: "testkey.override",
2973 }
2974
Jiyong Park9335a262018-12-24 11:31:58 +09002975 `)
2976
2977 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002978 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002979
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002980 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2981 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002982 "vendor/foo/devkeys/testkey.avbpubkey")
2983 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002984 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2985 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002986 "vendor/foo/devkeys/testkey.pem")
2987 }
2988
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002989 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002990 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002991 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002992 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002993 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002994 }
2995}
Jiyong Park58e364a2019-01-19 19:24:06 +09002996
Jooyung Hanf121a652019-12-17 14:30:11 +09002997func TestCertificate(t *testing.T) {
2998 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002999 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003000 apex {
3001 name: "myapex",
3002 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003003 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003004 }
3005 apex_key {
3006 name: "myapex.key",
3007 public_key: "testkey.avbpubkey",
3008 private_key: "testkey.pem",
3009 }`)
3010 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3011 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3012 if actual := rule.Args["certificates"]; actual != expected {
3013 t.Errorf("certificates should be %q, not %q", expected, actual)
3014 }
3015 })
3016 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003017 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003018 apex {
3019 name: "myapex_keytest",
3020 key: "myapex.key",
3021 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003022 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003023 }
3024 apex_key {
3025 name: "myapex.key",
3026 public_key: "testkey.avbpubkey",
3027 private_key: "testkey.pem",
3028 }
3029 android_app_certificate {
3030 name: "myapex.certificate.override",
3031 certificate: "testkey.override",
3032 }`)
3033 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3034 expected := "testkey.override.x509.pem testkey.override.pk8"
3035 if actual := rule.Args["certificates"]; actual != expected {
3036 t.Errorf("certificates should be %q, not %q", expected, actual)
3037 }
3038 })
3039 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003040 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003041 apex {
3042 name: "myapex",
3043 key: "myapex.key",
3044 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003045 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003046 }
3047 apex_key {
3048 name: "myapex.key",
3049 public_key: "testkey.avbpubkey",
3050 private_key: "testkey.pem",
3051 }
3052 android_app_certificate {
3053 name: "myapex.certificate",
3054 certificate: "testkey",
3055 }`)
3056 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3057 expected := "testkey.x509.pem testkey.pk8"
3058 if actual := rule.Args["certificates"]; actual != expected {
3059 t.Errorf("certificates should be %q, not %q", expected, actual)
3060 }
3061 })
3062 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003063 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003064 apex {
3065 name: "myapex_keytest",
3066 key: "myapex.key",
3067 file_contexts: ":myapex-file_contexts",
3068 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003069 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003070 }
3071 apex_key {
3072 name: "myapex.key",
3073 public_key: "testkey.avbpubkey",
3074 private_key: "testkey.pem",
3075 }
3076 android_app_certificate {
3077 name: "myapex.certificate.override",
3078 certificate: "testkey.override",
3079 }`)
3080 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3081 expected := "testkey.override.x509.pem testkey.override.pk8"
3082 if actual := rule.Args["certificates"]; actual != expected {
3083 t.Errorf("certificates should be %q, not %q", expected, actual)
3084 }
3085 })
3086 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003087 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003088 apex {
3089 name: "myapex",
3090 key: "myapex.key",
3091 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003092 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003093 }
3094 apex_key {
3095 name: "myapex.key",
3096 public_key: "testkey.avbpubkey",
3097 private_key: "testkey.pem",
3098 }`)
3099 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3100 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3101 if actual := rule.Args["certificates"]; actual != expected {
3102 t.Errorf("certificates should be %q, not %q", expected, actual)
3103 }
3104 })
3105 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003106 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003107 apex {
3108 name: "myapex_keytest",
3109 key: "myapex.key",
3110 file_contexts: ":myapex-file_contexts",
3111 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003112 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003113 }
3114 apex_key {
3115 name: "myapex.key",
3116 public_key: "testkey.avbpubkey",
3117 private_key: "testkey.pem",
3118 }
3119 android_app_certificate {
3120 name: "myapex.certificate.override",
3121 certificate: "testkey.override",
3122 }`)
3123 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3124 expected := "testkey.override.x509.pem testkey.override.pk8"
3125 if actual := rule.Args["certificates"]; actual != expected {
3126 t.Errorf("certificates should be %q, not %q", expected, actual)
3127 }
3128 })
3129}
3130
Jiyong Park58e364a2019-01-19 19:24:06 +09003131func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003132 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003133 apex {
3134 name: "myapex",
3135 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003136 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003137 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003138 }
3139
3140 apex {
3141 name: "otherapex",
3142 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003143 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003144 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003145 }
3146
3147 apex_key {
3148 name: "myapex.key",
3149 public_key: "testkey.avbpubkey",
3150 private_key: "testkey.pem",
3151 }
3152
3153 cc_library {
3154 name: "mylib",
3155 srcs: ["mylib.cpp"],
3156 system_shared_libs: [],
3157 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003158 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003159 "myapex",
3160 "otherapex",
3161 ],
Jooyung Han24282772020-03-21 23:20:55 +09003162 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003163 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003164 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003165 cc_library {
3166 name: "mylib2",
3167 srcs: ["mylib.cpp"],
3168 system_shared_libs: [],
3169 stl: "none",
3170 apex_available: [
3171 "myapex",
3172 "otherapex",
3173 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003174 static_libs: ["mylib3"],
3175 recovery_available: true,
3176 min_sdk_version: "29",
3177 }
3178 cc_library {
3179 name: "mylib3",
3180 srcs: ["mylib.cpp"],
3181 system_shared_libs: [],
3182 stl: "none",
3183 apex_available: [
3184 "myapex",
3185 "otherapex",
3186 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003187 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003188 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003189 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003190 `)
3191
Jooyung Hanc87a0592020-03-02 17:44:33 +09003192 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003193 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003194 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003195 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003196
Jooyung Hanccce2f22020-03-07 03:45:53 +09003197 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003198 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003199 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003200 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003201
Jooyung Hanccce2f22020-03-07 03:45:53 +09003202 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003203 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003204 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003205 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003206
Colin Crossaede88c2020-08-11 12:17:01 -07003207 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3208 // each variant defines additional macros to distinguish which apex variant it is built for
3209
3210 // non-APEX variant does not have __ANDROID_APEX__ defined
3211 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3212 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3213
Dan Albertb19953d2020-11-17 15:29:36 -08003214 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003215 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3216 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003217 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003218
Jooyung Hanc87a0592020-03-02 17:44:33 +09003219 // non-APEX variant does not have __ANDROID_APEX__ defined
3220 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3221 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3222
Dan Albertb19953d2020-11-17 15:29:36 -08003223 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003224 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003225 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003226 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003227}
Jiyong Park7e636d02019-01-28 16:16:54 +09003228
3229func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003230 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003231 apex {
3232 name: "myapex",
3233 key: "myapex.key",
3234 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003235 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003236 }
3237
3238 apex_key {
3239 name: "myapex.key",
3240 public_key: "testkey.avbpubkey",
3241 private_key: "testkey.pem",
3242 }
3243
3244 cc_library_headers {
3245 name: "mylib_headers",
3246 export_include_dirs: ["my_include"],
3247 system_shared_libs: [],
3248 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003249 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003250 }
3251
3252 cc_library {
3253 name: "mylib",
3254 srcs: ["mylib.cpp"],
3255 system_shared_libs: [],
3256 stl: "none",
3257 header_libs: ["mylib_headers"],
3258 export_header_lib_headers: ["mylib_headers"],
3259 stubs: {
3260 versions: ["1", "2", "3"],
3261 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003262 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003263 }
3264
3265 cc_library {
3266 name: "otherlib",
3267 srcs: ["mylib.cpp"],
3268 system_shared_libs: [],
3269 stl: "none",
3270 shared_libs: ["mylib"],
3271 }
3272 `)
3273
Colin Cross7113d202019-11-20 16:39:12 -08003274 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003275
3276 // Ensure that the include path of the header lib is exported to 'otherlib'
3277 ensureContains(t, cFlags, "-Imy_include")
3278}
Alex Light9670d332019-01-29 18:07:33 -08003279
Jiyong Park7cd10e32020-01-14 09:22:18 +09003280type fileInApex struct {
3281 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003282 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003283 isLink bool
3284}
3285
Jooyung Hana57af4a2020-01-23 05:36:59 +00003286func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003287 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003288 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003289 copyCmds := apexRule.Args["copy_commands"]
3290 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003291 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003292 for _, cmd := range strings.Split(copyCmds, "&&") {
3293 cmd = strings.TrimSpace(cmd)
3294 if cmd == "" {
3295 continue
3296 }
3297 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003298 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003299 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003300 switch terms[0] {
3301 case "mkdir":
3302 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003303 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003304 t.Fatal("copyCmds contains invalid cp command", cmd)
3305 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003306 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003307 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003308 isLink = false
3309 case "ln":
3310 if len(terms) != 3 && len(terms) != 4 {
3311 // ln LINK TARGET or ln -s LINK TARGET
3312 t.Fatal("copyCmds contains invalid ln command", cmd)
3313 }
3314 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003315 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003316 isLink = true
3317 default:
3318 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3319 }
3320 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003321 index := strings.Index(dst, imageApexDir)
3322 if index == -1 {
3323 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3324 }
3325 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003326 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003327 }
3328 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003329 return ret
3330}
3331
Jooyung Hana57af4a2020-01-23 05:36:59 +00003332func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3333 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003334 var failed bool
3335 var surplus []string
3336 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003337 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003338 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003339 for _, expected := range files {
3340 if matched, _ := path.Match(expected, file.path); matched {
3341 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003342 mactchFound = true
3343 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003344 }
3345 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003346 if !mactchFound {
3347 surplus = append(surplus, file.path)
3348 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003349 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003350
Jooyung Han31c470b2019-10-18 16:26:59 +09003351 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003352 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003353 t.Log("surplus files", surplus)
3354 failed = true
3355 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003356
3357 if len(files) > len(filesMatched) {
3358 var missing []string
3359 for _, expected := range files {
3360 if !filesMatched[expected] {
3361 missing = append(missing, expected)
3362 }
3363 }
3364 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003365 t.Log("missing files", missing)
3366 failed = true
3367 }
3368 if failed {
3369 t.Fail()
3370 }
3371}
3372
Jooyung Han344d5432019-08-23 11:17:39 +09003373func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003374 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003375 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003376 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003377 "etc/llndk.libraries.29.txt",
3378 "etc/vndkcore.libraries.29.txt",
3379 "etc/vndksp.libraries.29.txt",
3380 "etc/vndkprivate.libraries.29.txt",
3381 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003382 }
3383 testCases := []struct {
3384 vndkVersion string
3385 expectedFiles []string
3386 }{
3387 {
3388 vndkVersion: "current",
3389 expectedFiles: append(commonFiles,
3390 "lib/libvndk.so",
3391 "lib/libvndksp.so",
3392 "lib64/libvndk.so",
3393 "lib64/libvndksp.so"),
3394 },
3395 {
3396 vndkVersion: "",
3397 expectedFiles: append(commonFiles,
3398 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3399 "lib/libvndksp.so",
3400 "lib64/libvndksp.so"),
3401 },
3402 }
3403 for _, tc := range testCases {
3404 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3405 ctx := testApex(t, `
3406 apex_vndk {
3407 name: "com.android.vndk.current",
3408 key: "com.android.vndk.current.key",
3409 updatable: false,
3410 }
3411
3412 apex_key {
3413 name: "com.android.vndk.current.key",
3414 public_key: "testkey.avbpubkey",
3415 private_key: "testkey.pem",
3416 }
3417
3418 cc_library {
3419 name: "libvndk",
3420 srcs: ["mylib.cpp"],
3421 vendor_available: true,
3422 product_available: true,
3423 vndk: {
3424 enabled: true,
3425 },
3426 system_shared_libs: [],
3427 stl: "none",
3428 apex_available: [ "com.android.vndk.current" ],
3429 }
3430
3431 cc_library {
3432 name: "libvndksp",
3433 srcs: ["mylib.cpp"],
3434 vendor_available: true,
3435 product_available: true,
3436 vndk: {
3437 enabled: true,
3438 support_system_process: true,
3439 },
3440 system_shared_libs: [],
3441 stl: "none",
3442 apex_available: [ "com.android.vndk.current" ],
3443 }
3444
3445 // VNDK-Ext should not cause any problems
3446
3447 cc_library {
3448 name: "libvndk.ext",
3449 srcs: ["mylib2.cpp"],
3450 vendor: true,
3451 vndk: {
3452 enabled: true,
3453 extends: "libvndk",
3454 },
3455 system_shared_libs: [],
3456 stl: "none",
3457 }
3458
3459 cc_library {
3460 name: "libvndksp.ext",
3461 srcs: ["mylib2.cpp"],
3462 vendor: true,
3463 vndk: {
3464 enabled: true,
3465 support_system_process: true,
3466 extends: "libvndksp",
3467 },
3468 system_shared_libs: [],
3469 stl: "none",
3470 }
3471 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3472 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3473 }))
3474 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3475 })
3476 }
Jooyung Han344d5432019-08-23 11:17:39 +09003477}
3478
3479func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003480 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003481 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003482 name: "com.android.vndk.current",
3483 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003484 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003485 }
3486
3487 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003488 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003489 public_key: "testkey.avbpubkey",
3490 private_key: "testkey.pem",
3491 }
3492
3493 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003494 name: "libvndk",
3495 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003496 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003497 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003498 vndk: {
3499 enabled: true,
3500 },
3501 system_shared_libs: [],
3502 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003503 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003504 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003505
3506 cc_prebuilt_library_shared {
3507 name: "libvndk.arm",
3508 srcs: ["libvndk.arm.so"],
3509 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003510 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003511 vndk: {
3512 enabled: true,
3513 },
3514 enabled: false,
3515 arch: {
3516 arm: {
3517 enabled: true,
3518 },
3519 },
3520 system_shared_libs: [],
3521 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003522 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003523 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003524 `+vndkLibrariesTxtFiles("current"),
3525 withFiles(map[string][]byte{
3526 "libvndk.so": nil,
3527 "libvndk.arm.so": nil,
3528 }))
Colin Cross2807f002021-03-02 10:15:29 -08003529 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003530 "lib/libvndk.so",
3531 "lib/libvndk.arm.so",
3532 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003533 "lib/libc++.so",
3534 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003535 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003536 })
Jooyung Han344d5432019-08-23 11:17:39 +09003537}
3538
Jooyung Han39edb6c2019-11-06 16:53:07 +09003539func vndkLibrariesTxtFiles(vers ...string) (result string) {
3540 for _, v := range vers {
3541 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003542 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003543 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003544 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003545 name: "` + txt + `.libraries.txt",
3546 }
3547 `
3548 }
3549 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003550 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003551 result += `
3552 prebuilt_etc {
3553 name: "` + txt + `.libraries.` + v + `.txt",
3554 src: "dummy.txt",
3555 }
3556 `
3557 }
3558 }
3559 }
3560 return
3561}
3562
Jooyung Han344d5432019-08-23 11:17:39 +09003563func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003564 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003565 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003566 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003567 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003568 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003569 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003570 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003571 }
3572
3573 apex_key {
3574 name: "myapex.key",
3575 public_key: "testkey.avbpubkey",
3576 private_key: "testkey.pem",
3577 }
3578
Jooyung Han31c470b2019-10-18 16:26:59 +09003579 vndk_prebuilt_shared {
3580 name: "libvndk27",
3581 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003582 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003583 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003584 vndk: {
3585 enabled: true,
3586 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003587 target_arch: "arm64",
3588 arch: {
3589 arm: {
3590 srcs: ["libvndk27_arm.so"],
3591 },
3592 arm64: {
3593 srcs: ["libvndk27_arm64.so"],
3594 },
3595 },
Colin Cross2807f002021-03-02 10:15:29 -08003596 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003597 }
3598
3599 vndk_prebuilt_shared {
3600 name: "libvndk27",
3601 version: "27",
3602 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003603 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003604 vndk: {
3605 enabled: true,
3606 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003607 target_arch: "x86_64",
3608 arch: {
3609 x86: {
3610 srcs: ["libvndk27_x86.so"],
3611 },
3612 x86_64: {
3613 srcs: ["libvndk27_x86_64.so"],
3614 },
3615 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003616 }
3617 `+vndkLibrariesTxtFiles("27"),
3618 withFiles(map[string][]byte{
3619 "libvndk27_arm.so": nil,
3620 "libvndk27_arm64.so": nil,
3621 "libvndk27_x86.so": nil,
3622 "libvndk27_x86_64.so": nil,
3623 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003624
Colin Cross2807f002021-03-02 10:15:29 -08003625 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003626 "lib/libvndk27_arm.so",
3627 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003628 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003629 })
Jooyung Han344d5432019-08-23 11:17:39 +09003630}
3631
Jooyung Han90eee022019-10-01 20:02:42 +09003632func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003633 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003634 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003635 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003636 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003637 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003638 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003639 }
3640 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003641 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003642 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003643 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003644 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003645 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003646 }
3647 apex_key {
3648 name: "myapex.key",
3649 public_key: "testkey.avbpubkey",
3650 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003651 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003652
3653 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003654 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003655 actual := proptools.String(bundle.properties.Apex_name)
3656 if !reflect.DeepEqual(actual, expected) {
3657 t.Errorf("Got '%v', expected '%v'", actual, expected)
3658 }
3659 }
3660
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003661 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003662 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003663}
3664
Jooyung Han344d5432019-08-23 11:17:39 +09003665func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003666 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003667 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003668 name: "com.android.vndk.current",
3669 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003670 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003671 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003672 }
3673
3674 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003675 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003676 public_key: "testkey.avbpubkey",
3677 private_key: "testkey.pem",
3678 }
3679
3680 cc_library {
3681 name: "libvndk",
3682 srcs: ["mylib.cpp"],
3683 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003684 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003685 native_bridge_supported: true,
3686 host_supported: true,
3687 vndk: {
3688 enabled: true,
3689 },
3690 system_shared_libs: [],
3691 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003692 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003693 }
Colin Cross2807f002021-03-02 10:15:29 -08003694 `+vndkLibrariesTxtFiles("current"),
3695 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003696
Colin Cross2807f002021-03-02 10:15:29 -08003697 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003698 "lib/libvndk.so",
3699 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003700 "lib/libc++.so",
3701 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003702 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003703 })
Jooyung Han344d5432019-08-23 11:17:39 +09003704}
3705
3706func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003707 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003708 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003709 name: "com.android.vndk.current",
3710 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003711 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003712 native_bridge_supported: true,
3713 }
3714
3715 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003716 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003717 public_key: "testkey.avbpubkey",
3718 private_key: "testkey.pem",
3719 }
3720
3721 cc_library {
3722 name: "libvndk",
3723 srcs: ["mylib.cpp"],
3724 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003725 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003726 native_bridge_supported: true,
3727 host_supported: true,
3728 vndk: {
3729 enabled: true,
3730 },
3731 system_shared_libs: [],
3732 stl: "none",
3733 }
3734 `)
3735}
3736
Jooyung Han31c470b2019-10-18 16:26:59 +09003737func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003738 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003739 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003740 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003741 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003742 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003743 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003744 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003745 }
3746
3747 apex_key {
3748 name: "myapex.key",
3749 public_key: "testkey.avbpubkey",
3750 private_key: "testkey.pem",
3751 }
3752
3753 vndk_prebuilt_shared {
3754 name: "libvndk27",
3755 version: "27",
3756 target_arch: "arm",
3757 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003758 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003759 vndk: {
3760 enabled: true,
3761 },
3762 arch: {
3763 arm: {
3764 srcs: ["libvndk27.so"],
3765 }
3766 },
3767 }
3768
3769 vndk_prebuilt_shared {
3770 name: "libvndk27",
3771 version: "27",
3772 target_arch: "arm",
3773 binder32bit: true,
3774 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003775 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003776 vndk: {
3777 enabled: true,
3778 },
3779 arch: {
3780 arm: {
3781 srcs: ["libvndk27binder32.so"],
3782 }
3783 },
Colin Cross2807f002021-03-02 10:15:29 -08003784 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003785 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003786 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003787 withFiles(map[string][]byte{
3788 "libvndk27.so": nil,
3789 "libvndk27binder32.so": nil,
3790 }),
3791 withBinder32bit,
3792 withTargets(map[android.OsType][]android.Target{
3793 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003794 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3795 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003796 },
3797 }),
3798 )
3799
Colin Cross2807f002021-03-02 10:15:29 -08003800 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003801 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003802 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003803 })
3804}
3805
Jooyung Han45a96772020-06-15 14:59:42 +09003806func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003807 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003808 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003809 name: "com.android.vndk.current",
3810 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003811 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003812 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003813 }
3814
3815 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003816 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003817 public_key: "testkey.avbpubkey",
3818 private_key: "testkey.pem",
3819 }
3820
3821 cc_library {
3822 name: "libz",
3823 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003824 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003825 vndk: {
3826 enabled: true,
3827 },
3828 stubs: {
3829 symbol_file: "libz.map.txt",
3830 versions: ["30"],
3831 }
3832 }
3833 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3834 "libz.map.txt": nil,
3835 }))
3836
Colin Cross2807f002021-03-02 10:15:29 -08003837 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003838 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3839 ensureListEmpty(t, provideNativeLibs)
3840}
3841
Jooyung Hane1633032019-08-01 17:41:43 +09003842func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003843 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003844 apex {
3845 name: "myapex_nodep",
3846 key: "myapex.key",
3847 native_shared_libs: ["lib_nodep"],
3848 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003849 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003850 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003851 }
3852
3853 apex {
3854 name: "myapex_dep",
3855 key: "myapex.key",
3856 native_shared_libs: ["lib_dep"],
3857 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003858 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003859 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003860 }
3861
3862 apex {
3863 name: "myapex_provider",
3864 key: "myapex.key",
3865 native_shared_libs: ["libfoo"],
3866 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003867 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003868 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003869 }
3870
3871 apex {
3872 name: "myapex_selfcontained",
3873 key: "myapex.key",
3874 native_shared_libs: ["lib_dep", "libfoo"],
3875 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003876 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003877 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003878 }
3879
3880 apex_key {
3881 name: "myapex.key",
3882 public_key: "testkey.avbpubkey",
3883 private_key: "testkey.pem",
3884 }
3885
3886 cc_library {
3887 name: "lib_nodep",
3888 srcs: ["mylib.cpp"],
3889 system_shared_libs: [],
3890 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003891 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003892 }
3893
3894 cc_library {
3895 name: "lib_dep",
3896 srcs: ["mylib.cpp"],
3897 shared_libs: ["libfoo"],
3898 system_shared_libs: [],
3899 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003900 apex_available: [
3901 "myapex_dep",
3902 "myapex_provider",
3903 "myapex_selfcontained",
3904 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003905 }
3906
3907 cc_library {
3908 name: "libfoo",
3909 srcs: ["mytest.cpp"],
3910 stubs: {
3911 versions: ["1"],
3912 },
3913 system_shared_libs: [],
3914 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003915 apex_available: [
3916 "myapex_provider",
3917 "myapex_selfcontained",
3918 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003919 }
3920 `)
3921
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003922 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003923 var provideNativeLibs, requireNativeLibs []string
3924
Sundong Ahnabb64432019-10-22 13:58:29 +09003925 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003926 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3927 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003928 ensureListEmpty(t, provideNativeLibs)
3929 ensureListEmpty(t, requireNativeLibs)
3930
Sundong Ahnabb64432019-10-22 13:58:29 +09003931 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003932 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3933 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003934 ensureListEmpty(t, provideNativeLibs)
3935 ensureListContains(t, requireNativeLibs, "libfoo.so")
3936
Sundong Ahnabb64432019-10-22 13:58:29 +09003937 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003938 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3939 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003940 ensureListContains(t, provideNativeLibs, "libfoo.so")
3941 ensureListEmpty(t, requireNativeLibs)
3942
Sundong Ahnabb64432019-10-22 13:58:29 +09003943 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003944 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3945 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003946 ensureListContains(t, provideNativeLibs, "libfoo.so")
3947 ensureListEmpty(t, requireNativeLibs)
3948}
3949
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003950func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003951 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003952 apex {
3953 name: "myapex",
3954 key: "myapex.key",
3955 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003956 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003957 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003958 }
3959
3960 apex_key {
3961 name: "myapex.key",
3962 public_key: "testkey.avbpubkey",
3963 private_key: "testkey.pem",
3964 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003965
3966 cc_library {
3967 name: "mylib",
3968 srcs: ["mylib.cpp"],
3969 system_shared_libs: [],
3970 stl: "none",
3971 apex_available: [
3972 "//apex_available:platform",
3973 "myapex",
3974 ],
3975 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003976 `)
3977
Martin Stjernholmbfffae72021-06-24 14:37:13 +01003978 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003979 apexManifestRule := module.Rule("apexManifestRule")
3980 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3981 apexRule := module.Rule("apexRule")
3982 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003983
Martin Stjernholmbfffae72021-06-24 14:37:13 +01003984 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003985 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09003986 name := apexBundle.BaseModuleName()
3987 prefix := "TARGET_"
3988 var builder strings.Builder
3989 data.Custom(&builder, name, prefix, "", data)
3990 androidMk := builder.String()
3991 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3992 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003993}
3994
Alex Light0851b882019-02-07 13:20:53 -08003995func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003996 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003997 apex {
3998 name: "myapex",
3999 key: "myapex.key",
4000 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004001 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004002 }
4003
4004 apex_key {
4005 name: "myapex.key",
4006 public_key: "testkey.avbpubkey",
4007 private_key: "testkey.pem",
4008 }
4009
4010 cc_library {
4011 name: "mylib_common",
4012 srcs: ["mylib.cpp"],
4013 system_shared_libs: [],
4014 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004015 apex_available: [
4016 "//apex_available:platform",
4017 "myapex",
4018 ],
Alex Light0851b882019-02-07 13:20:53 -08004019 }
4020 `)
4021
Sundong Ahnabb64432019-10-22 13:58:29 +09004022 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004023 apexRule := module.Rule("apexRule")
4024 copyCmds := apexRule.Args["copy_commands"]
4025
4026 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4027 t.Log("Apex was a test apex!")
4028 t.Fail()
4029 }
4030 // Ensure that main rule creates an output
4031 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4032
4033 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004034 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004035
4036 // Ensure that both direct and indirect deps are copied into apex
4037 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4038
Colin Cross7113d202019-11-20 16:39:12 -08004039 // Ensure that the platform variant ends with _shared
4040 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004041
Colin Cross56a83212020-09-15 18:30:11 -07004042 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004043 t.Log("Found mylib_common not in any apex!")
4044 t.Fail()
4045 }
4046}
4047
4048func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004049 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004050 apex_test {
4051 name: "myapex",
4052 key: "myapex.key",
4053 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004054 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004055 }
4056
4057 apex_key {
4058 name: "myapex.key",
4059 public_key: "testkey.avbpubkey",
4060 private_key: "testkey.pem",
4061 }
4062
4063 cc_library {
4064 name: "mylib_common_test",
4065 srcs: ["mylib.cpp"],
4066 system_shared_libs: [],
4067 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004068 // TODO: remove //apex_available:platform
4069 apex_available: [
4070 "//apex_available:platform",
4071 "myapex",
4072 ],
Alex Light0851b882019-02-07 13:20:53 -08004073 }
4074 `)
4075
Sundong Ahnabb64432019-10-22 13:58:29 +09004076 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004077 apexRule := module.Rule("apexRule")
4078 copyCmds := apexRule.Args["copy_commands"]
4079
4080 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4081 t.Log("Apex was not a test apex!")
4082 t.Fail()
4083 }
4084 // Ensure that main rule creates an output
4085 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4086
4087 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004088 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004089
4090 // Ensure that both direct and indirect deps are copied into apex
4091 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4092
Colin Cross7113d202019-11-20 16:39:12 -08004093 // Ensure that the platform variant ends with _shared
4094 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004095}
4096
Alex Light9670d332019-01-29 18:07:33 -08004097func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004098 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004099 apex {
4100 name: "myapex",
4101 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004102 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004103 multilib: {
4104 first: {
4105 native_shared_libs: ["mylib_common"],
4106 }
4107 },
4108 target: {
4109 android: {
4110 multilib: {
4111 first: {
4112 native_shared_libs: ["mylib"],
4113 }
4114 }
4115 },
4116 host: {
4117 multilib: {
4118 first: {
4119 native_shared_libs: ["mylib2"],
4120 }
4121 }
4122 }
4123 }
4124 }
4125
4126 apex_key {
4127 name: "myapex.key",
4128 public_key: "testkey.avbpubkey",
4129 private_key: "testkey.pem",
4130 }
4131
4132 cc_library {
4133 name: "mylib",
4134 srcs: ["mylib.cpp"],
4135 system_shared_libs: [],
4136 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004137 // TODO: remove //apex_available:platform
4138 apex_available: [
4139 "//apex_available:platform",
4140 "myapex",
4141 ],
Alex Light9670d332019-01-29 18:07:33 -08004142 }
4143
4144 cc_library {
4145 name: "mylib_common",
4146 srcs: ["mylib.cpp"],
4147 system_shared_libs: [],
4148 stl: "none",
4149 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004150 // TODO: remove //apex_available:platform
4151 apex_available: [
4152 "//apex_available:platform",
4153 "myapex",
4154 ],
Alex Light9670d332019-01-29 18:07:33 -08004155 }
4156
4157 cc_library {
4158 name: "mylib2",
4159 srcs: ["mylib.cpp"],
4160 system_shared_libs: [],
4161 stl: "none",
4162 compile_multilib: "first",
4163 }
4164 `)
4165
Sundong Ahnabb64432019-10-22 13:58:29 +09004166 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004167 copyCmds := apexRule.Args["copy_commands"]
4168
4169 // Ensure that main rule creates an output
4170 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4171
4172 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004173 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4174 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4175 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004176
4177 // Ensure that both direct and indirect deps are copied into apex
4178 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4179 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4180 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4181
Colin Cross7113d202019-11-20 16:39:12 -08004182 // Ensure that the platform variant ends with _shared
4183 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4184 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4185 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004186}
Jiyong Park04480cf2019-02-06 00:16:29 +09004187
Jiyong Park59140302020-12-14 18:44:04 +09004188func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004189 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004190 apex {
4191 name: "myapex",
4192 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004193 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004194 arch: {
4195 arm64: {
4196 native_shared_libs: ["mylib.arm64"],
4197 },
4198 x86_64: {
4199 native_shared_libs: ["mylib.x64"],
4200 },
4201 }
4202 }
4203
4204 apex_key {
4205 name: "myapex.key",
4206 public_key: "testkey.avbpubkey",
4207 private_key: "testkey.pem",
4208 }
4209
4210 cc_library {
4211 name: "mylib.arm64",
4212 srcs: ["mylib.cpp"],
4213 system_shared_libs: [],
4214 stl: "none",
4215 // TODO: remove //apex_available:platform
4216 apex_available: [
4217 "//apex_available:platform",
4218 "myapex",
4219 ],
4220 }
4221
4222 cc_library {
4223 name: "mylib.x64",
4224 srcs: ["mylib.cpp"],
4225 system_shared_libs: [],
4226 stl: "none",
4227 // TODO: remove //apex_available:platform
4228 apex_available: [
4229 "//apex_available:platform",
4230 "myapex",
4231 ],
4232 }
4233 `)
4234
4235 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4236 copyCmds := apexRule.Args["copy_commands"]
4237
4238 // Ensure that apex variant is created for the direct dep
4239 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4240 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4241
4242 // Ensure that both direct and indirect deps are copied into apex
4243 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4244 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4245}
4246
Jiyong Park04480cf2019-02-06 00:16:29 +09004247func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004248 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004249 apex {
4250 name: "myapex",
4251 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004252 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004253 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004254 }
4255
4256 apex_key {
4257 name: "myapex.key",
4258 public_key: "testkey.avbpubkey",
4259 private_key: "testkey.pem",
4260 }
4261
4262 sh_binary {
4263 name: "myscript",
4264 src: "mylib.cpp",
4265 filename: "myscript.sh",
4266 sub_dir: "script",
4267 }
4268 `)
4269
Sundong Ahnabb64432019-10-22 13:58:29 +09004270 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004271 copyCmds := apexRule.Args["copy_commands"]
4272
4273 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4274}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004275
Jooyung Han91df2082019-11-20 01:49:42 +09004276func TestApexInVariousPartition(t *testing.T) {
4277 testcases := []struct {
4278 propName, parition, flattenedPartition string
4279 }{
4280 {"", "system", "system_ext"},
4281 {"product_specific: true", "product", "product"},
4282 {"soc_specific: true", "vendor", "vendor"},
4283 {"proprietary: true", "vendor", "vendor"},
4284 {"vendor: true", "vendor", "vendor"},
4285 {"system_ext_specific: true", "system_ext", "system_ext"},
4286 }
4287 for _, tc := range testcases {
4288 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004289 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004290 apex {
4291 name: "myapex",
4292 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004293 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004294 `+tc.propName+`
4295 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004296
Jooyung Han91df2082019-11-20 01:49:42 +09004297 apex_key {
4298 name: "myapex.key",
4299 public_key: "testkey.avbpubkey",
4300 private_key: "testkey.pem",
4301 }
4302 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004303
Jooyung Han91df2082019-11-20 01:49:42 +09004304 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004305 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4306 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004307 if actual != expected {
4308 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4309 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004310
Jooyung Han91df2082019-11-20 01:49:42 +09004311 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004312 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4313 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004314 if actual != expected {
4315 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4316 }
4317 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004318 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004319}
Jiyong Park67882562019-03-21 01:11:21 +09004320
Jooyung Han580eb4f2020-06-24 19:33:06 +09004321func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004322 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004323 apex {
4324 name: "myapex",
4325 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004326 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004327 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004328
Jooyung Han580eb4f2020-06-24 19:33:06 +09004329 apex_key {
4330 name: "myapex.key",
4331 public_key: "testkey.avbpubkey",
4332 private_key: "testkey.pem",
4333 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004334 `)
4335 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004336 rule := module.Output("file_contexts")
4337 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4338}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004339
Jooyung Han580eb4f2020-06-24 19:33:06 +09004340func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004341 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004342 apex {
4343 name: "myapex",
4344 key: "myapex.key",
4345 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004346 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004347 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004348
Jooyung Han580eb4f2020-06-24 19:33:06 +09004349 apex_key {
4350 name: "myapex.key",
4351 public_key: "testkey.avbpubkey",
4352 private_key: "testkey.pem",
4353 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004354 `, withFiles(map[string][]byte{
4355 "my_own_file_contexts": nil,
4356 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004357}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004358
Jooyung Han580eb4f2020-06-24 19:33:06 +09004359func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004360 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004361 apex {
4362 name: "myapex",
4363 key: "myapex.key",
4364 product_specific: true,
4365 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004366 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004367 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004368
Jooyung Han580eb4f2020-06-24 19:33:06 +09004369 apex_key {
4370 name: "myapex.key",
4371 public_key: "testkey.avbpubkey",
4372 private_key: "testkey.pem",
4373 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004374 `)
4375
Colin Cross1c460562021-02-16 17:55:47 -08004376 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004377 apex {
4378 name: "myapex",
4379 key: "myapex.key",
4380 product_specific: true,
4381 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004382 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004383 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004384
Jooyung Han580eb4f2020-06-24 19:33:06 +09004385 apex_key {
4386 name: "myapex.key",
4387 public_key: "testkey.avbpubkey",
4388 private_key: "testkey.pem",
4389 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004390 `, withFiles(map[string][]byte{
4391 "product_specific_file_contexts": nil,
4392 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004393 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4394 rule := module.Output("file_contexts")
4395 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4396}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004397
Jooyung Han580eb4f2020-06-24 19:33:06 +09004398func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004399 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004400 apex {
4401 name: "myapex",
4402 key: "myapex.key",
4403 product_specific: true,
4404 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004405 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004406 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004407
Jooyung Han580eb4f2020-06-24 19:33:06 +09004408 apex_key {
4409 name: "myapex.key",
4410 public_key: "testkey.avbpubkey",
4411 private_key: "testkey.pem",
4412 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004413
Jooyung Han580eb4f2020-06-24 19:33:06 +09004414 filegroup {
4415 name: "my-file-contexts",
4416 srcs: ["product_specific_file_contexts"],
4417 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004418 `, withFiles(map[string][]byte{
4419 "product_specific_file_contexts": nil,
4420 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004421 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4422 rule := module.Output("file_contexts")
4423 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004424}
4425
Jiyong Park67882562019-03-21 01:11:21 +09004426func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004427 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004428 apex_key {
4429 name: "myapex.key",
4430 public_key: ":my.avbpubkey",
4431 private_key: ":my.pem",
4432 product_specific: true,
4433 }
4434
4435 filegroup {
4436 name: "my.avbpubkey",
4437 srcs: ["testkey2.avbpubkey"],
4438 }
4439
4440 filegroup {
4441 name: "my.pem",
4442 srcs: ["testkey2.pem"],
4443 }
4444 `)
4445
4446 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4447 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004448 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004449 if actual_pubkey != expected_pubkey {
4450 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4451 }
4452 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004453 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004454 if actual_privkey != expected_privkey {
4455 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4456 }
4457}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004458
4459func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004460 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004461 prebuilt_apex {
4462 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004463 arch: {
4464 arm64: {
4465 src: "myapex-arm64.apex",
4466 },
4467 arm: {
4468 src: "myapex-arm.apex",
4469 },
4470 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004471 }
4472 `)
4473
Paul Duffin6717d882021-06-15 19:09:41 +01004474 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004475
Jiyong Parkc95714e2019-03-29 14:23:10 +09004476 expectedInput := "myapex-arm64.apex"
4477 if prebuilt.inputApex.String() != expectedInput {
4478 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4479 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004480}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004481
Paul Duffinc0609c62021-03-01 17:27:16 +00004482func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004483 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004484 prebuilt_apex {
4485 name: "myapex",
4486 }
4487 `)
4488}
4489
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004490func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004491 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004492 prebuilt_apex {
4493 name: "myapex",
4494 src: "myapex-arm.apex",
4495 filename: "notmyapex.apex",
4496 }
4497 `)
4498
Paul Duffin6717d882021-06-15 19:09:41 +01004499 p := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004500
4501 expected := "notmyapex.apex"
4502 if p.installFilename != expected {
4503 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4504 }
4505}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004506
Samiul Islam7c02e262021-09-08 17:48:28 +01004507func TestApexSetFilenameOverride(t *testing.T) {
4508 testApex(t, `
4509 apex_set {
4510 name: "com.company.android.myapex",
4511 apex_name: "com.android.myapex",
4512 set: "company-myapex.apks",
4513 filename: "com.company.android.myapex.apex"
4514 }
4515 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4516
4517 testApex(t, `
4518 apex_set {
4519 name: "com.company.android.myapex",
4520 apex_name: "com.android.myapex",
4521 set: "company-myapex.apks",
4522 filename: "com.company.android.myapex.capex"
4523 }
4524 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4525
4526 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4527 apex_set {
4528 name: "com.company.android.myapex",
4529 apex_name: "com.android.myapex",
4530 set: "company-myapex.apks",
4531 filename: "some-random-suffix"
4532 }
4533 `)
4534}
4535
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004536func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004537 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004538 prebuilt_apex {
4539 name: "myapex.prebuilt",
4540 src: "myapex-arm.apex",
4541 overrides: [
4542 "myapex",
4543 ],
4544 }
4545 `)
4546
Paul Duffin6717d882021-06-15 19:09:41 +01004547 p := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt").Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004548
4549 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004550 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004551 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004552 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004553 }
4554}
4555
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004556func TestPrebuiltApexName(t *testing.T) {
4557 testApex(t, `
4558 prebuilt_apex {
4559 name: "com.company.android.myapex",
4560 apex_name: "com.android.myapex",
4561 src: "company-myapex-arm.apex",
4562 }
4563 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4564
4565 testApex(t, `
4566 apex_set {
4567 name: "com.company.android.myapex",
4568 apex_name: "com.android.myapex",
4569 set: "company-myapex.apks",
4570 }
4571 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4572}
4573
4574func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4575 _ = android.GroupFixturePreparers(
4576 java.PrepareForTestWithJavaDefaultModules,
4577 PrepareForTestWithApexBuildComponents,
4578 android.FixtureWithRootAndroidBp(`
4579 platform_bootclasspath {
4580 name: "platform-bootclasspath",
4581 fragments: [
4582 {
4583 apex: "com.android.art",
4584 module: "art-bootclasspath-fragment",
4585 },
4586 ],
4587 }
4588
4589 prebuilt_apex {
4590 name: "com.company.android.art",
4591 apex_name: "com.android.art",
4592 src: "com.company.android.art-arm.apex",
4593 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4594 }
4595
4596 prebuilt_bootclasspath_fragment {
4597 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004598 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004599 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004600 hidden_api: {
4601 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4602 metadata: "my-bootclasspath-fragment/metadata.csv",
4603 index: "my-bootclasspath-fragment/index.csv",
4604 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4605 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4606 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004607 }
4608
4609 java_import {
4610 name: "core-oj",
4611 jars: ["prebuilt.jar"],
4612 }
4613 `),
4614 ).RunTest(t)
4615}
4616
Paul Duffin092153d2021-01-26 11:42:39 +00004617// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4618// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004619func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004620 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004621
Paul Duffin89886cb2021-02-05 16:44:03 +00004622 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004623 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004624 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004625 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004626 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004627 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004628 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4629 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4630 android.NormalizePathForTesting(dexJarBuildPath))
4631 }
4632
4633 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004634 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004635 // Make sure the import has been given the correct path to the dex jar.
4636 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4637 dexJarBuildPath := p.DexJarInstallPath()
4638 stem := android.RemoveOptionalPrebuiltPrefix(name)
4639 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4640 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4641 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004642 }
4643
Paul Duffin39853512021-02-26 11:09:39 +00004644 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004645 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004646 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004647 android.AssertArrayString(t, "Check if there is no source variant",
4648 []string{"android_common"},
4649 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004650 }
4651
4652 t.Run("prebuilt only", func(t *testing.T) {
4653 bp := `
4654 prebuilt_apex {
4655 name: "myapex",
4656 arch: {
4657 arm64: {
4658 src: "myapex-arm64.apex",
4659 },
4660 arm: {
4661 src: "myapex-arm.apex",
4662 },
4663 },
Paul Duffin39853512021-02-26 11:09:39 +00004664 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004665 }
4666
4667 java_import {
4668 name: "libfoo",
4669 jars: ["libfoo.jar"],
4670 }
Paul Duffin39853512021-02-26 11:09:39 +00004671
4672 java_sdk_library_import {
4673 name: "libbar",
4674 public: {
4675 jars: ["libbar.jar"],
4676 },
4677 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004678 `
4679
4680 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4681 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4682
Martin Stjernholm44825602021-09-17 01:44:12 +01004683 deapexerName := deapexerModuleName("myapex")
4684 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4685
Paul Duffinf6932af2021-02-26 18:21:56 +00004686 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004687 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004688 rule := deapexer.Rule("deapexer")
4689 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4690 t.Errorf("expected: %q, found: %q", expected, actual)
4691 }
4692
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004693 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004694 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004695 rule = prebuiltApex.Rule("android/soong/android.Cp")
4696 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4697 t.Errorf("expected: %q, found: %q", expected, actual)
4698 }
4699
Paul Duffin89886cb2021-02-05 16:44:03 +00004700 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004701 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004702
4703 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004704 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004705 })
4706
4707 t.Run("prebuilt with source preferred", func(t *testing.T) {
4708
4709 bp := `
4710 prebuilt_apex {
4711 name: "myapex",
4712 arch: {
4713 arm64: {
4714 src: "myapex-arm64.apex",
4715 },
4716 arm: {
4717 src: "myapex-arm.apex",
4718 },
4719 },
Paul Duffin39853512021-02-26 11:09:39 +00004720 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004721 }
4722
4723 java_import {
4724 name: "libfoo",
4725 jars: ["libfoo.jar"],
4726 }
4727
4728 java_library {
4729 name: "libfoo",
4730 }
Paul Duffin39853512021-02-26 11:09:39 +00004731
4732 java_sdk_library_import {
4733 name: "libbar",
4734 public: {
4735 jars: ["libbar.jar"],
4736 },
4737 }
4738
4739 java_sdk_library {
4740 name: "libbar",
4741 srcs: ["foo/bar/MyClass.java"],
4742 unsafe_ignore_missing_latest_api: true,
4743 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004744 `
4745
4746 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4747 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4748
Paul Duffin89886cb2021-02-05 16:44:03 +00004749 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004750 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004751 ensureNoSourceVariant(t, ctx, "libfoo")
4752
4753 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004754 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004755 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004756 })
4757
4758 t.Run("prebuilt preferred with source", func(t *testing.T) {
4759 bp := `
4760 prebuilt_apex {
4761 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004762 arch: {
4763 arm64: {
4764 src: "myapex-arm64.apex",
4765 },
4766 arm: {
4767 src: "myapex-arm.apex",
4768 },
4769 },
Paul Duffin39853512021-02-26 11:09:39 +00004770 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004771 }
4772
4773 java_import {
4774 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004775 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004776 jars: ["libfoo.jar"],
4777 }
4778
4779 java_library {
4780 name: "libfoo",
4781 }
Paul Duffin39853512021-02-26 11:09:39 +00004782
4783 java_sdk_library_import {
4784 name: "libbar",
4785 prefer: true,
4786 public: {
4787 jars: ["libbar.jar"],
4788 },
4789 }
4790
4791 java_sdk_library {
4792 name: "libbar",
4793 srcs: ["foo/bar/MyClass.java"],
4794 unsafe_ignore_missing_latest_api: true,
4795 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004796 `
4797
4798 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4799 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4800
Paul Duffin89886cb2021-02-05 16:44:03 +00004801 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004802 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004803 ensureNoSourceVariant(t, ctx, "libfoo")
4804
4805 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004806 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004807 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004808 })
4809}
4810
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004811func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004812 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004813 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004814 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4815 // is disabled.
4816 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4817 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004818
Paul Duffin37856732021-02-26 14:24:15 +00004819 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4820 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004821 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004822 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004823 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004824 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004825 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004826 foundLibfooJar = true
4827 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004828 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004829 }
4830 }
4831 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004832 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 +00004833 }
4834 }
4835
Paul Duffin40a3f652021-07-19 13:11:24 +01004836 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004837 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004838 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004839 var rule android.TestingBuildParams
4840
4841 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4842 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004843 }
4844
Paul Duffin40a3f652021-07-19 13:11:24 +01004845 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4846 t.Helper()
4847 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4848 var rule android.TestingBuildParams
4849
4850 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4851 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4852 }
4853
Paul Duffin89f570a2021-06-16 01:42:33 +01004854 fragment := java.ApexVariantReference{
4855 Apex: proptools.StringPtr("myapex"),
4856 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4857 }
4858
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004859 t.Run("prebuilt only", func(t *testing.T) {
4860 bp := `
4861 prebuilt_apex {
4862 name: "myapex",
4863 arch: {
4864 arm64: {
4865 src: "myapex-arm64.apex",
4866 },
4867 arm: {
4868 src: "myapex-arm.apex",
4869 },
4870 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004871 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4872 }
4873
4874 prebuilt_bootclasspath_fragment {
4875 name: "my-bootclasspath-fragment",
4876 contents: ["libfoo", "libbar"],
4877 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004878 hidden_api: {
4879 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4880 metadata: "my-bootclasspath-fragment/metadata.csv",
4881 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004882 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4883 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4884 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004885 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004886 }
4887
4888 java_import {
4889 name: "libfoo",
4890 jars: ["libfoo.jar"],
4891 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004892 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004893 }
Paul Duffin37856732021-02-26 14:24:15 +00004894
4895 java_sdk_library_import {
4896 name: "libbar",
4897 public: {
4898 jars: ["libbar.jar"],
4899 },
4900 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004901 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01004902 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00004903 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004904 `
4905
Paul Duffin89f570a2021-06-16 01:42:33 +01004906 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01004907 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4908 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004909
Paul Duffin537ea3d2021-05-14 10:38:00 +01004910 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01004911 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01004912 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01004913 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01004914 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
4915 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004916 })
4917
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004918 t.Run("apex_set only", func(t *testing.T) {
4919 bp := `
4920 apex_set {
4921 name: "myapex",
4922 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01004923 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4924 }
4925
4926 prebuilt_bootclasspath_fragment {
4927 name: "my-bootclasspath-fragment",
4928 contents: ["libfoo", "libbar"],
4929 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004930 hidden_api: {
4931 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4932 metadata: "my-bootclasspath-fragment/metadata.csv",
4933 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004934 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4935 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4936 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004937 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004938 }
4939
4940 java_import {
4941 name: "libfoo",
4942 jars: ["libfoo.jar"],
4943 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004944 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004945 }
4946
4947 java_sdk_library_import {
4948 name: "libbar",
4949 public: {
4950 jars: ["libbar.jar"],
4951 },
4952 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004953 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01004954 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004955 }
4956 `
4957
Paul Duffin89f570a2021-06-16 01:42:33 +01004958 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004959 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4960 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
4961
Paul Duffin537ea3d2021-05-14 10:38:00 +01004962 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01004963 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01004964 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01004965 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01004966 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
4967 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004968 })
4969
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004970 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4971 bp := `
4972 prebuilt_apex {
4973 name: "myapex",
4974 arch: {
4975 arm64: {
4976 src: "myapex-arm64.apex",
4977 },
4978 arm: {
4979 src: "myapex-arm.apex",
4980 },
4981 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004982 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4983 }
4984
4985 prebuilt_bootclasspath_fragment {
4986 name: "my-bootclasspath-fragment",
4987 contents: ["libfoo", "libbar"],
4988 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004989 hidden_api: {
4990 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4991 metadata: "my-bootclasspath-fragment/metadata.csv",
4992 index: "my-bootclasspath-fragment/index.csv",
4993 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4994 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4995 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004996 }
4997
4998 java_import {
4999 name: "libfoo",
5000 jars: ["libfoo.jar"],
5001 apex_available: ["myapex"],
5002 }
5003
5004 java_library {
5005 name: "libfoo",
5006 srcs: ["foo/bar/MyClass.java"],
5007 apex_available: ["myapex"],
5008 }
Paul Duffin37856732021-02-26 14:24:15 +00005009
5010 java_sdk_library_import {
5011 name: "libbar",
5012 public: {
5013 jars: ["libbar.jar"],
5014 },
5015 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005016 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005017 }
5018
5019 java_sdk_library {
5020 name: "libbar",
5021 srcs: ["foo/bar/MyClass.java"],
5022 unsafe_ignore_missing_latest_api: true,
5023 apex_available: ["myapex"],
5024 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005025 `
5026
5027 // In this test the source (java_library) libfoo is active since the
5028 // prebuilt (java_import) defaults to prefer:false. However the
5029 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5030 // find the dex boot jar in it. We either need to disable the source libfoo
5031 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005032 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005033 // dexbootjar check is skipped if AllowMissingDependencies is true
5034 preparerAllowMissingDeps := android.GroupFixturePreparers(
5035 preparer,
5036 android.PrepareForTestWithAllowMissingDependencies,
5037 )
5038 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005039 })
5040
5041 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5042 bp := `
5043 prebuilt_apex {
5044 name: "myapex",
5045 arch: {
5046 arm64: {
5047 src: "myapex-arm64.apex",
5048 },
5049 arm: {
5050 src: "myapex-arm.apex",
5051 },
5052 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005053 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5054 }
5055
5056 prebuilt_bootclasspath_fragment {
5057 name: "my-bootclasspath-fragment",
5058 contents: ["libfoo", "libbar"],
5059 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005060 hidden_api: {
5061 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5062 metadata: "my-bootclasspath-fragment/metadata.csv",
5063 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005064 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5065 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5066 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005067 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005068 }
5069
5070 java_import {
5071 name: "libfoo",
5072 prefer: true,
5073 jars: ["libfoo.jar"],
5074 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005075 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005076 }
5077
5078 java_library {
5079 name: "libfoo",
5080 srcs: ["foo/bar/MyClass.java"],
5081 apex_available: ["myapex"],
5082 }
Paul Duffin37856732021-02-26 14:24:15 +00005083
5084 java_sdk_library_import {
5085 name: "libbar",
5086 prefer: true,
5087 public: {
5088 jars: ["libbar.jar"],
5089 },
5090 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005091 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005092 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005093 }
5094
5095 java_sdk_library {
5096 name: "libbar",
5097 srcs: ["foo/bar/MyClass.java"],
5098 unsafe_ignore_missing_latest_api: true,
5099 apex_available: ["myapex"],
5100 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005101 `
5102
Paul Duffin89f570a2021-06-16 01:42:33 +01005103 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005104 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5105 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005106
Paul Duffin537ea3d2021-05-14 10:38:00 +01005107 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005108 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005109 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005110 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005111 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5112 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005113 })
5114
5115 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5116 bp := `
5117 apex {
5118 name: "myapex",
5119 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005120 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005121 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005122 }
5123
5124 apex_key {
5125 name: "myapex.key",
5126 public_key: "testkey.avbpubkey",
5127 private_key: "testkey.pem",
5128 }
5129
5130 prebuilt_apex {
5131 name: "myapex",
5132 arch: {
5133 arm64: {
5134 src: "myapex-arm64.apex",
5135 },
5136 arm: {
5137 src: "myapex-arm.apex",
5138 },
5139 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005140 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5141 }
5142
5143 prebuilt_bootclasspath_fragment {
5144 name: "my-bootclasspath-fragment",
5145 contents: ["libfoo", "libbar"],
5146 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005147 hidden_api: {
5148 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5149 metadata: "my-bootclasspath-fragment/metadata.csv",
5150 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005151 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5152 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5153 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005154 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005155 }
5156
5157 java_import {
5158 name: "libfoo",
5159 jars: ["libfoo.jar"],
5160 apex_available: ["myapex"],
5161 }
5162
5163 java_library {
5164 name: "libfoo",
5165 srcs: ["foo/bar/MyClass.java"],
5166 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005167 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005168 }
Paul Duffin37856732021-02-26 14:24:15 +00005169
5170 java_sdk_library_import {
5171 name: "libbar",
5172 public: {
5173 jars: ["libbar.jar"],
5174 },
5175 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005176 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005177 }
5178
5179 java_sdk_library {
5180 name: "libbar",
5181 srcs: ["foo/bar/MyClass.java"],
5182 unsafe_ignore_missing_latest_api: true,
5183 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005184 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005185 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005186 `
5187
Paul Duffin89f570a2021-06-16 01:42:33 +01005188 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005189 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5190 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005191
Paul Duffin537ea3d2021-05-14 10:38:00 +01005192 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005193 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005194 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005195 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005196 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5197 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005198 })
5199
5200 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5201 bp := `
5202 apex {
5203 name: "myapex",
5204 enabled: false,
5205 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005206 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005207 }
5208
5209 apex_key {
5210 name: "myapex.key",
5211 public_key: "testkey.avbpubkey",
5212 private_key: "testkey.pem",
5213 }
5214
5215 prebuilt_apex {
5216 name: "myapex",
5217 arch: {
5218 arm64: {
5219 src: "myapex-arm64.apex",
5220 },
5221 arm: {
5222 src: "myapex-arm.apex",
5223 },
5224 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005225 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5226 }
5227
5228 prebuilt_bootclasspath_fragment {
5229 name: "my-bootclasspath-fragment",
5230 contents: ["libfoo", "libbar"],
5231 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005232 hidden_api: {
5233 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5234 metadata: "my-bootclasspath-fragment/metadata.csv",
5235 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005236 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5237 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5238 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005239 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005240 }
5241
5242 java_import {
5243 name: "libfoo",
5244 prefer: true,
5245 jars: ["libfoo.jar"],
5246 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005247 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005248 }
5249
5250 java_library {
5251 name: "libfoo",
5252 srcs: ["foo/bar/MyClass.java"],
5253 apex_available: ["myapex"],
5254 }
Paul Duffin37856732021-02-26 14:24:15 +00005255
5256 java_sdk_library_import {
5257 name: "libbar",
5258 prefer: true,
5259 public: {
5260 jars: ["libbar.jar"],
5261 },
5262 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005263 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005264 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005265 }
5266
5267 java_sdk_library {
5268 name: "libbar",
5269 srcs: ["foo/bar/MyClass.java"],
5270 unsafe_ignore_missing_latest_api: true,
5271 apex_available: ["myapex"],
5272 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005273 `
5274
Paul Duffin89f570a2021-06-16 01:42:33 +01005275 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005276 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5277 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005278
Paul Duffin537ea3d2021-05-14 10:38:00 +01005279 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005280 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005281 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005282 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005283 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5284 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005285 })
5286}
5287
Roland Levillain630846d2019-06-26 12:48:34 +01005288func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005289 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005290 apex_test {
5291 name: "myapex",
5292 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005293 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005294 tests: [
5295 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005296 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005297 ],
5298 }
5299
5300 apex_key {
5301 name: "myapex.key",
5302 public_key: "testkey.avbpubkey",
5303 private_key: "testkey.pem",
5304 }
5305
Liz Kammer1c14a212020-05-12 15:26:55 -07005306 filegroup {
5307 name: "fg",
5308 srcs: [
5309 "baz",
5310 "bar/baz"
5311 ],
5312 }
5313
Roland Levillain630846d2019-06-26 12:48:34 +01005314 cc_test {
5315 name: "mytest",
5316 gtest: false,
5317 srcs: ["mytest.cpp"],
5318 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005319 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005320 system_shared_libs: [],
5321 static_executable: true,
5322 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005323 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005324 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005325
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005326 cc_library {
5327 name: "mylib",
5328 srcs: ["mylib.cpp"],
5329 system_shared_libs: [],
5330 stl: "none",
5331 }
5332
Liz Kammer5bd365f2020-05-27 15:15:11 -07005333 filegroup {
5334 name: "fg2",
5335 srcs: [
5336 "testdata/baz"
5337 ],
5338 }
5339
Roland Levillain9b5fde92019-06-28 15:41:19 +01005340 cc_test {
5341 name: "mytests",
5342 gtest: false,
5343 srcs: [
5344 "mytest1.cpp",
5345 "mytest2.cpp",
5346 "mytest3.cpp",
5347 ],
5348 test_per_src: true,
5349 relative_install_path: "test",
5350 system_shared_libs: [],
5351 static_executable: true,
5352 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005353 data: [
5354 ":fg",
5355 ":fg2",
5356 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005357 }
Roland Levillain630846d2019-06-26 12:48:34 +01005358 `)
5359
Sundong Ahnabb64432019-10-22 13:58:29 +09005360 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005361 copyCmds := apexRule.Args["copy_commands"]
5362
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005363 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005364 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005365 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005366
Liz Kammer1c14a212020-05-12 15:26:55 -07005367 //Ensure that test data are copied into apex.
5368 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5369 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5370
Roland Levillain9b5fde92019-06-28 15:41:19 +01005371 // Ensure that test deps built with `test_per_src` are copied into apex.
5372 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5373 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5374 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005375
5376 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005377 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005378 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005379 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005380 prefix := "TARGET_"
5381 var builder strings.Builder
5382 data.Custom(&builder, name, prefix, "", data)
5383 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005384 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5385 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5386 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5387 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005388 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005389 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005390 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005391
5392 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005393 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005394 data.Custom(&builder, name, prefix, "", data)
5395 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005396 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5397 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005398}
5399
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005400func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005401 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005402 apex {
5403 name: "myapex",
5404 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005405 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005406 }
5407 apex_key {
5408 name: "myapex.key",
5409 public_key: "testkey.avbpubkey",
5410 private_key: "testkey.pem",
5411 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005412 `,
5413 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5414 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5415 }),
5416 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005417 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005418 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005419 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005420 var builder strings.Builder
5421 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5422 androidMk := builder.String()
5423 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5424}
5425
Jooyung Hand48f3c32019-08-23 11:18:57 +09005426func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5427 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5428 apex {
5429 name: "myapex",
5430 key: "myapex.key",
5431 native_shared_libs: ["libfoo"],
5432 }
5433
5434 apex_key {
5435 name: "myapex.key",
5436 public_key: "testkey.avbpubkey",
5437 private_key: "testkey.pem",
5438 }
5439
5440 cc_library {
5441 name: "libfoo",
5442 stl: "none",
5443 system_shared_libs: [],
5444 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005445 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005446 }
5447 `)
5448 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5449 apex {
5450 name: "myapex",
5451 key: "myapex.key",
5452 java_libs: ["myjar"],
5453 }
5454
5455 apex_key {
5456 name: "myapex.key",
5457 public_key: "testkey.avbpubkey",
5458 private_key: "testkey.pem",
5459 }
5460
5461 java_library {
5462 name: "myjar",
5463 srcs: ["foo/bar/MyClass.java"],
5464 sdk_version: "none",
5465 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005466 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005467 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005468 }
5469 `)
5470}
5471
Bill Peckhama41a6962021-01-11 10:58:54 -08005472func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005473 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005474 apex {
5475 name: "myapex",
5476 key: "myapex.key",
5477 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005478 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005479 }
5480
5481 apex_key {
5482 name: "myapex.key",
5483 public_key: "testkey.avbpubkey",
5484 private_key: "testkey.pem",
5485 }
5486
5487 java_import {
5488 name: "myjavaimport",
5489 apex_available: ["myapex"],
5490 jars: ["my.jar"],
5491 compile_dex: true,
5492 }
5493 `)
5494
5495 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5496 apexRule := module.Rule("apexRule")
5497 copyCmds := apexRule.Args["copy_commands"]
5498 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5499}
5500
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005501func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005502 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005503 apex {
5504 name: "myapex",
5505 key: "myapex.key",
5506 apps: [
5507 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005508 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005509 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005510 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005511 }
5512
5513 apex_key {
5514 name: "myapex.key",
5515 public_key: "testkey.avbpubkey",
5516 private_key: "testkey.pem",
5517 }
5518
5519 android_app {
5520 name: "AppFoo",
5521 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005522 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005523 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005524 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005525 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005526 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005527 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005528
5529 android_app {
5530 name: "AppFooPriv",
5531 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005532 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005533 system_modules: "none",
5534 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005535 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005536 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005537 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005538
5539 cc_library_shared {
5540 name: "libjni",
5541 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005542 shared_libs: ["libfoo"],
5543 stl: "none",
5544 system_shared_libs: [],
5545 apex_available: [ "myapex" ],
5546 sdk_version: "current",
5547 }
5548
5549 cc_library_shared {
5550 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005551 stl: "none",
5552 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005553 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005554 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005555 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005556 `)
5557
Sundong Ahnabb64432019-10-22 13:58:29 +09005558 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005559 apexRule := module.Rule("apexRule")
5560 copyCmds := apexRule.Args["copy_commands"]
5561
5562 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005563 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005564
Colin Crossaede88c2020-08-11 12:17:01 -07005565 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005566 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005567 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005568 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005569 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005570 // JNI libraries including transitive deps are
5571 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005572 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005573 // ... embedded inside APK (jnilibs.zip)
5574 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5575 // ... and not directly inside the APEX
5576 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5577 }
Dario Frenicde2a032019-10-27 00:29:22 +01005578}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005579
Dario Frenicde2a032019-10-27 00:29:22 +01005580func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005581 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005582 apex {
5583 name: "myapex",
5584 key: "myapex.key",
5585 apps: [
5586 "AppFooPrebuilt",
5587 "AppFooPrivPrebuilt",
5588 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005589 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005590 }
5591
5592 apex_key {
5593 name: "myapex.key",
5594 public_key: "testkey.avbpubkey",
5595 private_key: "testkey.pem",
5596 }
5597
5598 android_app_import {
5599 name: "AppFooPrebuilt",
5600 apk: "PrebuiltAppFoo.apk",
5601 presigned: true,
5602 dex_preopt: {
5603 enabled: false,
5604 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005605 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005606 }
5607
5608 android_app_import {
5609 name: "AppFooPrivPrebuilt",
5610 apk: "PrebuiltAppFooPriv.apk",
5611 privileged: true,
5612 presigned: true,
5613 dex_preopt: {
5614 enabled: false,
5615 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005616 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005617 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005618 }
5619 `)
5620
Sundong Ahnabb64432019-10-22 13:58:29 +09005621 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005622 apexRule := module.Rule("apexRule")
5623 copyCmds := apexRule.Args["copy_commands"]
5624
5625 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005626 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5627}
5628
5629func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005630 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005631 apex {
5632 name: "myapex",
5633 key: "myapex.key",
5634 apps: [
5635 "AppFoo",
5636 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005637 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005638 }
5639
5640 apex_key {
5641 name: "myapex.key",
5642 public_key: "testkey.avbpubkey",
5643 private_key: "testkey.pem",
5644 }
5645
5646 android_app {
5647 name: "AppFoo",
5648 srcs: ["foo/bar/MyClass.java"],
5649 sdk_version: "none",
5650 system_modules: "none",
5651 apex_available: [ "myapex" ],
5652 }
5653
5654 android_app_import {
5655 name: "AppFoo",
5656 apk: "AppFooPrebuilt.apk",
5657 filename: "AppFooPrebuilt.apk",
5658 presigned: true,
5659 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005660 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005661 }
5662 `, withFiles(map[string][]byte{
5663 "AppFooPrebuilt.apk": nil,
5664 }))
5665
5666 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005667 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005668 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005669}
5670
Dario Freni6f3937c2019-12-20 22:58:03 +00005671func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005672 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005673 apex {
5674 name: "myapex",
5675 key: "myapex.key",
5676 apps: [
5677 "TesterHelpAppFoo",
5678 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005679 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005680 }
5681
5682 apex_key {
5683 name: "myapex.key",
5684 public_key: "testkey.avbpubkey",
5685 private_key: "testkey.pem",
5686 }
5687
5688 android_test_helper_app {
5689 name: "TesterHelpAppFoo",
5690 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005691 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005692 }
5693
5694 `)
5695
5696 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5697 apexRule := module.Rule("apexRule")
5698 copyCmds := apexRule.Args["copy_commands"]
5699
5700 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5701}
5702
Jooyung Han18020ea2019-11-13 10:50:48 +09005703func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5704 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005705 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005706 apex {
5707 name: "myapex",
5708 key: "myapex.key",
5709 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005710 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005711 }
5712
5713 apex_key {
5714 name: "myapex.key",
5715 public_key: "testkey.avbpubkey",
5716 private_key: "testkey.pem",
5717 }
5718
5719 apex {
5720 name: "otherapex",
5721 key: "myapex.key",
5722 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005723 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005724 }
5725
5726 cc_defaults {
5727 name: "libfoo-defaults",
5728 apex_available: ["otherapex"],
5729 }
5730
5731 cc_library {
5732 name: "libfoo",
5733 defaults: ["libfoo-defaults"],
5734 stl: "none",
5735 system_shared_libs: [],
5736 }`)
5737}
5738
Paul Duffine52e66f2020-03-30 17:54:29 +01005739func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005740 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005741 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005742 apex {
5743 name: "myapex",
5744 key: "myapex.key",
5745 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005746 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005747 }
5748
5749 apex_key {
5750 name: "myapex.key",
5751 public_key: "testkey.avbpubkey",
5752 private_key: "testkey.pem",
5753 }
5754
5755 apex {
5756 name: "otherapex",
5757 key: "otherapex.key",
5758 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005759 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005760 }
5761
5762 apex_key {
5763 name: "otherapex.key",
5764 public_key: "testkey.avbpubkey",
5765 private_key: "testkey.pem",
5766 }
5767
5768 cc_library {
5769 name: "libfoo",
5770 stl: "none",
5771 system_shared_libs: [],
5772 apex_available: ["otherapex"],
5773 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005774}
Jiyong Park127b40b2019-09-30 16:04:35 +09005775
Paul Duffine52e66f2020-03-30 17:54:29 +01005776func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005777 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005778 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005779.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005780.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005781.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005782.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005783.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005784.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005785 apex {
5786 name: "myapex",
5787 key: "myapex.key",
5788 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005789 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005790 }
5791
5792 apex_key {
5793 name: "myapex.key",
5794 public_key: "testkey.avbpubkey",
5795 private_key: "testkey.pem",
5796 }
5797
Jiyong Park127b40b2019-09-30 16:04:35 +09005798 cc_library {
5799 name: "libfoo",
5800 stl: "none",
5801 shared_libs: ["libbar"],
5802 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005803 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005804 }
5805
5806 cc_library {
5807 name: "libbar",
5808 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005809 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005810 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005811 apex_available: ["myapex"],
5812 }
5813
5814 cc_library {
5815 name: "libbaz",
5816 stl: "none",
5817 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005818 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005819}
Jiyong Park127b40b2019-09-30 16:04:35 +09005820
Paul Duffine52e66f2020-03-30 17:54:29 +01005821func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005822 testApexError(t, "\"otherapex\" is not a valid module name", `
5823 apex {
5824 name: "myapex",
5825 key: "myapex.key",
5826 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005827 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005828 }
5829
5830 apex_key {
5831 name: "myapex.key",
5832 public_key: "testkey.avbpubkey",
5833 private_key: "testkey.pem",
5834 }
5835
5836 cc_library {
5837 name: "libfoo",
5838 stl: "none",
5839 system_shared_libs: [],
5840 apex_available: ["otherapex"],
5841 }`)
5842
Paul Duffine52e66f2020-03-30 17:54:29 +01005843 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005844 apex {
5845 name: "myapex",
5846 key: "myapex.key",
5847 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005848 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005849 }
5850
5851 apex_key {
5852 name: "myapex.key",
5853 public_key: "testkey.avbpubkey",
5854 private_key: "testkey.pem",
5855 }
5856
5857 cc_library {
5858 name: "libfoo",
5859 stl: "none",
5860 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005861 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005862 apex_available: ["myapex"],
5863 }
5864
5865 cc_library {
5866 name: "libbar",
5867 stl: "none",
5868 system_shared_libs: [],
5869 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005870 }
5871
5872 cc_library {
5873 name: "libbaz",
5874 stl: "none",
5875 system_shared_libs: [],
5876 stubs: {
5877 versions: ["10", "20", "30"],
5878 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005879 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005880}
Jiyong Park127b40b2019-09-30 16:04:35 +09005881
Jiyong Park89e850a2020-04-07 16:37:39 +09005882func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005883 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005884 apex {
5885 name: "myapex",
5886 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005887 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005888 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005889 }
5890
5891 apex_key {
5892 name: "myapex.key",
5893 public_key: "testkey.avbpubkey",
5894 private_key: "testkey.pem",
5895 }
5896
5897 cc_library {
5898 name: "libfoo",
5899 stl: "none",
5900 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005901 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005902 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005903 }
5904
5905 cc_library {
5906 name: "libfoo2",
5907 stl: "none",
5908 system_shared_libs: [],
5909 shared_libs: ["libbaz"],
5910 apex_available: ["//apex_available:platform"],
5911 }
5912
5913 cc_library {
5914 name: "libbar",
5915 stl: "none",
5916 system_shared_libs: [],
5917 apex_available: ["myapex"],
5918 }
5919
5920 cc_library {
5921 name: "libbaz",
5922 stl: "none",
5923 system_shared_libs: [],
5924 apex_available: ["myapex"],
5925 stubs: {
5926 versions: ["1"],
5927 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005928 }`)
5929
Jiyong Park89e850a2020-04-07 16:37:39 +09005930 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5931 // because it depends on libbar which isn't available to platform
5932 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5933 if libfoo.NotAvailableForPlatform() != true {
5934 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5935 }
5936
5937 // libfoo2 however can be available to platform because it depends on libbaz which provides
5938 // stubs
5939 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5940 if libfoo2.NotAvailableForPlatform() == true {
5941 t.Errorf("%q should be available to platform", libfoo2.String())
5942 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005943}
Jiyong Parka90ca002019-10-07 15:47:24 +09005944
Paul Duffine52e66f2020-03-30 17:54:29 +01005945func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005946 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005947 apex {
5948 name: "myapex",
5949 key: "myapex.key",
5950 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005951 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +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: [],
5964 apex_available: ["myapex"],
5965 static: {
5966 apex_available: ["//apex_available:platform"],
5967 },
5968 }`)
5969
Jiyong Park89e850a2020-04-07 16:37:39 +09005970 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5971 if libfooShared.NotAvailableForPlatform() != true {
5972 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5973 }
5974 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5975 if libfooStatic.NotAvailableForPlatform() != false {
5976 t.Errorf("%q should be available to platform", libfooStatic.String())
5977 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005978}
5979
Jiyong Park5d790c32019-11-15 18:40:32 +09005980func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005981 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005982 apex {
5983 name: "myapex",
5984 key: "myapex.key",
5985 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08005986 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07005987 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005988 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005989 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09005990 }
5991
5992 override_apex {
5993 name: "override_myapex",
5994 base: "myapex",
5995 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08005996 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07005997 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005998 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005999 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006000 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006001 key: "mynewapex.key",
6002 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006003 }
6004
6005 apex_key {
6006 name: "myapex.key",
6007 public_key: "testkey.avbpubkey",
6008 private_key: "testkey.pem",
6009 }
6010
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006011 apex_key {
6012 name: "mynewapex.key",
6013 public_key: "testkey2.avbpubkey",
6014 private_key: "testkey2.pem",
6015 }
6016
6017 android_app_certificate {
6018 name: "myapex.certificate",
6019 certificate: "testkey",
6020 }
6021
Jiyong Park5d790c32019-11-15 18:40:32 +09006022 android_app {
6023 name: "app",
6024 srcs: ["foo/bar/MyClass.java"],
6025 package_name: "foo",
6026 sdk_version: "none",
6027 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006028 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006029 }
6030
6031 override_android_app {
6032 name: "override_app",
6033 base: "app",
6034 package_name: "bar",
6035 }
markchien7c803b82021-08-26 22:10:06 +08006036
6037 bpf {
6038 name: "bpf",
6039 srcs: ["bpf.c"],
6040 }
6041
6042 bpf {
6043 name: "override_bpf",
6044 srcs: ["override_bpf.c"],
6045 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006046
6047 prebuilt_etc {
6048 name: "myetc",
6049 src: "myprebuilt",
6050 }
6051
6052 prebuilt_etc {
6053 name: "override_myetc",
6054 src: "override_myprebuilt",
6055 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006056 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006057
Jiyong Park317645e2019-12-05 13:20:58 +09006058 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6059 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6060 if originalVariant.GetOverriddenBy() != "" {
6061 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6062 }
6063 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6064 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6065 }
6066
Jiyong Park5d790c32019-11-15 18:40:32 +09006067 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6068 apexRule := module.Rule("apexRule")
6069 copyCmds := apexRule.Args["copy_commands"]
6070
6071 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006072 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006073
markchien7c803b82021-08-26 22:10:06 +08006074 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6075 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6076
Daniel Norman5a3ce132021-08-26 15:44:43 -07006077 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6078 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6079
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006080 apexBundle := module.Module().(*apexBundle)
6081 name := apexBundle.Name()
6082 if name != "override_myapex" {
6083 t.Errorf("name should be \"override_myapex\", but was %q", name)
6084 }
6085
Baligh Uddin004d7172020-02-19 21:29:28 -08006086 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6087 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6088 }
6089
Jiyong Park20bacab2020-03-03 11:45:41 +09006090 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006091 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006092 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6093
6094 signApkRule := module.Rule("signapk")
6095 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006096
Colin Crossaa255532020-07-03 13:18:24 -07006097 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006098 var builder strings.Builder
6099 data.Custom(&builder, name, "TARGET_", "", data)
6100 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006101 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006102 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006103 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
6104 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006105 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006106 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006107 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006108 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006109 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6110 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006111}
6112
Jooyung Han214bf372019-11-12 13:03:50 +09006113func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006114 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006115 apex {
6116 name: "myapex",
6117 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006118 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006119 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006120 }
6121
6122 apex_key {
6123 name: "myapex.key",
6124 public_key: "testkey.avbpubkey",
6125 private_key: "testkey.pem",
6126 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006127
6128 cc_library {
6129 name: "mylib",
6130 srcs: ["mylib.cpp"],
6131 stl: "libc++",
6132 system_shared_libs: [],
6133 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006134 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006135 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006136 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006137
6138 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6139 args := module.Rule("apexRule").Args
6140 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006141 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006142
6143 // The copies of the libraries in the apex should have one more dependency than
6144 // the ones outside the apex, namely the unwinder. Ideally we should check
6145 // the dependency names directly here but for some reason the names are blank in
6146 // this test.
6147 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006148 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006149 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6150 if len(apexImplicits) != len(nonApexImplicits)+1 {
6151 t.Errorf("%q missing unwinder dep", lib)
6152 }
6153 }
Jooyung Han214bf372019-11-12 13:03:50 +09006154}
6155
Paul Duffine05480a2021-03-08 15:07:14 +00006156var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006157 "api/current.txt": nil,
6158 "api/removed.txt": nil,
6159 "api/system-current.txt": nil,
6160 "api/system-removed.txt": nil,
6161 "api/test-current.txt": nil,
6162 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006163
Anton Hanssondff2c782020-12-21 17:10:01 +00006164 "100/public/api/foo.txt": nil,
6165 "100/public/api/foo-removed.txt": nil,
6166 "100/system/api/foo.txt": nil,
6167 "100/system/api/foo-removed.txt": nil,
6168
Paul Duffineedc5d52020-06-12 17:46:39 +01006169 // For java_sdk_library_import
6170 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006171}
6172
Jooyung Han58f26ab2019-12-18 15:34:32 +09006173func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006174 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006175 apex {
6176 name: "myapex",
6177 key: "myapex.key",
6178 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006179 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006180 }
6181
6182 apex_key {
6183 name: "myapex.key",
6184 public_key: "testkey.avbpubkey",
6185 private_key: "testkey.pem",
6186 }
6187
6188 java_sdk_library {
6189 name: "foo",
6190 srcs: ["a.java"],
6191 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006192 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006193 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006194
6195 prebuilt_apis {
6196 name: "sdk",
6197 api_dirs: ["100"],
6198 }
Paul Duffin9b879592020-05-26 13:21:35 +01006199 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006200
6201 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006202 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006203 "javalib/foo.jar",
6204 "etc/permissions/foo.xml",
6205 })
6206 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006207 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006208 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 +09006209}
6210
Paul Duffin9b879592020-05-26 13:21:35 +01006211func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006212 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006213 apex {
6214 name: "myapex",
6215 key: "myapex.key",
6216 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006217 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006218 }
6219
6220 apex_key {
6221 name: "myapex.key",
6222 public_key: "testkey.avbpubkey",
6223 private_key: "testkey.pem",
6224 }
6225
6226 java_sdk_library {
6227 name: "foo",
6228 srcs: ["a.java"],
6229 api_packages: ["foo"],
6230 apex_available: ["myapex"],
6231 sdk_version: "none",
6232 system_modules: "none",
6233 }
6234
6235 java_library {
6236 name: "bar",
6237 srcs: ["a.java"],
6238 libs: ["foo"],
6239 apex_available: ["myapex"],
6240 sdk_version: "none",
6241 system_modules: "none",
6242 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006243
6244 prebuilt_apis {
6245 name: "sdk",
6246 api_dirs: ["100"],
6247 }
Paul Duffin9b879592020-05-26 13:21:35 +01006248 `, withFiles(filesForSdkLibrary))
6249
6250 // java_sdk_library installs both impl jar and permission XML
6251 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6252 "javalib/bar.jar",
6253 "javalib/foo.jar",
6254 "etc/permissions/foo.xml",
6255 })
6256
6257 // The bar library should depend on the implementation jar.
6258 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006259 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006260 t.Errorf("expected %q, found %#q", expected, actual)
6261 }
6262}
6263
6264func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006265 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006266 apex {
6267 name: "myapex",
6268 key: "myapex.key",
6269 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006270 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006271 }
6272
6273 apex_key {
6274 name: "myapex.key",
6275 public_key: "testkey.avbpubkey",
6276 private_key: "testkey.pem",
6277 }
6278
6279 java_sdk_library {
6280 name: "foo",
6281 srcs: ["a.java"],
6282 api_packages: ["foo"],
6283 apex_available: ["myapex"],
6284 sdk_version: "none",
6285 system_modules: "none",
6286 }
6287
6288 java_library {
6289 name: "bar",
6290 srcs: ["a.java"],
6291 libs: ["foo"],
6292 sdk_version: "none",
6293 system_modules: "none",
6294 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006295
6296 prebuilt_apis {
6297 name: "sdk",
6298 api_dirs: ["100"],
6299 }
Paul Duffin9b879592020-05-26 13:21:35 +01006300 `, withFiles(filesForSdkLibrary))
6301
6302 // java_sdk_library installs both impl jar and permission XML
6303 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6304 "javalib/foo.jar",
6305 "etc/permissions/foo.xml",
6306 })
6307
6308 // The bar library should depend on the stubs jar.
6309 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006310 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006311 t.Errorf("expected %q, found %#q", expected, actual)
6312 }
6313}
6314
Paul Duffineedc5d52020-06-12 17:46:39 +01006315func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006316 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006317 prebuilt_apis {
6318 name: "sdk",
6319 api_dirs: ["100"],
6320 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006321 withFiles(map[string][]byte{
6322 "apex/a.java": nil,
6323 "apex/apex_manifest.json": nil,
6324 "apex/Android.bp": []byte(`
6325 package {
6326 default_visibility: ["//visibility:private"],
6327 }
6328
6329 apex {
6330 name: "myapex",
6331 key: "myapex.key",
6332 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006333 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006334 }
6335
6336 apex_key {
6337 name: "myapex.key",
6338 public_key: "testkey.avbpubkey",
6339 private_key: "testkey.pem",
6340 }
6341
6342 java_library {
6343 name: "bar",
6344 srcs: ["a.java"],
6345 libs: ["foo"],
6346 apex_available: ["myapex"],
6347 sdk_version: "none",
6348 system_modules: "none",
6349 }
6350`),
6351 "source/a.java": nil,
6352 "source/api/current.txt": nil,
6353 "source/api/removed.txt": nil,
6354 "source/Android.bp": []byte(`
6355 package {
6356 default_visibility: ["//visibility:private"],
6357 }
6358
6359 java_sdk_library {
6360 name: "foo",
6361 visibility: ["//apex"],
6362 srcs: ["a.java"],
6363 api_packages: ["foo"],
6364 apex_available: ["myapex"],
6365 sdk_version: "none",
6366 system_modules: "none",
6367 public: {
6368 enabled: true,
6369 },
6370 }
6371`),
6372 "prebuilt/a.jar": nil,
6373 "prebuilt/Android.bp": []byte(`
6374 package {
6375 default_visibility: ["//visibility:private"],
6376 }
6377
6378 java_sdk_library_import {
6379 name: "foo",
6380 visibility: ["//apex", "//source"],
6381 apex_available: ["myapex"],
6382 prefer: true,
6383 public: {
6384 jars: ["a.jar"],
6385 },
6386 }
6387`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006388 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006389 )
6390
6391 // java_sdk_library installs both impl jar and permission XML
6392 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6393 "javalib/bar.jar",
6394 "javalib/foo.jar",
6395 "etc/permissions/foo.xml",
6396 })
6397
6398 // The bar library should depend on the implementation jar.
6399 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006400 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006401 t.Errorf("expected %q, found %#q", expected, actual)
6402 }
6403}
6404
6405func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6406 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6407 apex {
6408 name: "myapex",
6409 key: "myapex.key",
6410 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006411 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006412 }
6413
6414 apex_key {
6415 name: "myapex.key",
6416 public_key: "testkey.avbpubkey",
6417 private_key: "testkey.pem",
6418 }
6419
6420 java_sdk_library_import {
6421 name: "foo",
6422 apex_available: ["myapex"],
6423 prefer: true,
6424 public: {
6425 jars: ["a.jar"],
6426 },
6427 }
6428
6429 `, withFiles(filesForSdkLibrary))
6430}
6431
atrost6e126252020-01-27 17:01:16 +00006432func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006433 result := android.GroupFixturePreparers(
6434 prepareForApexTest,
6435 java.PrepareForTestWithPlatformCompatConfig,
6436 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006437 apex {
6438 name: "myapex",
6439 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006440 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006441 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006442 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006443 }
6444
6445 apex_key {
6446 name: "myapex.key",
6447 public_key: "testkey.avbpubkey",
6448 private_key: "testkey.pem",
6449 }
6450
6451 platform_compat_config {
6452 name: "myjar-platform-compat-config",
6453 src: ":myjar",
6454 }
6455
6456 java_library {
6457 name: "myjar",
6458 srcs: ["foo/bar/MyClass.java"],
6459 sdk_version: "none",
6460 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006461 apex_available: [ "myapex" ],
6462 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006463
6464 // Make sure that a preferred prebuilt does not affect the apex contents.
6465 prebuilt_platform_compat_config {
6466 name: "myjar-platform-compat-config",
6467 metadata: "compat-config/metadata.xml",
6468 prefer: true,
6469 }
atrost6e126252020-01-27 17:01:16 +00006470 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006471 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006472 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6473 "etc/compatconfig/myjar-platform-compat-config.xml",
6474 "javalib/myjar.jar",
6475 })
6476}
6477
Jiyong Park479321d2019-12-16 11:47:12 +09006478func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6479 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6480 apex {
6481 name: "myapex",
6482 key: "myapex.key",
6483 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006484 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006485 }
6486
6487 apex_key {
6488 name: "myapex.key",
6489 public_key: "testkey.avbpubkey",
6490 private_key: "testkey.pem",
6491 }
6492
6493 java_library {
6494 name: "myjar",
6495 srcs: ["foo/bar/MyClass.java"],
6496 sdk_version: "none",
6497 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006498 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006499 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006500 }
6501 `)
6502}
6503
Jiyong Park7afd1072019-12-30 16:56:33 +09006504func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006505 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006506 apex {
6507 name: "myapex",
6508 key: "myapex.key",
6509 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006510 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006511 }
6512
6513 apex_key {
6514 name: "myapex.key",
6515 public_key: "testkey.avbpubkey",
6516 private_key: "testkey.pem",
6517 }
6518
6519 cc_library {
6520 name: "mylib",
6521 srcs: ["mylib.cpp"],
6522 system_shared_libs: [],
6523 stl: "none",
6524 required: ["a", "b"],
6525 host_required: ["c", "d"],
6526 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006527 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006528 }
6529 `)
6530
6531 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006532 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006533 name := apexBundle.BaseModuleName()
6534 prefix := "TARGET_"
6535 var builder strings.Builder
6536 data.Custom(&builder, name, prefix, "", data)
6537 androidMk := builder.String()
6538 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6539 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6540 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6541}
6542
Jiyong Park7cd10e32020-01-14 09:22:18 +09006543func TestSymlinksFromApexToSystem(t *testing.T) {
6544 bp := `
6545 apex {
6546 name: "myapex",
6547 key: "myapex.key",
6548 native_shared_libs: ["mylib"],
6549 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006550 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006551 }
6552
Jiyong Park9d677202020-02-19 16:29:35 +09006553 apex {
6554 name: "myapex.updatable",
6555 key: "myapex.key",
6556 native_shared_libs: ["mylib"],
6557 java_libs: ["myjar"],
6558 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006559 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006560 }
6561
Jiyong Park7cd10e32020-01-14 09:22:18 +09006562 apex_key {
6563 name: "myapex.key",
6564 public_key: "testkey.avbpubkey",
6565 private_key: "testkey.pem",
6566 }
6567
6568 cc_library {
6569 name: "mylib",
6570 srcs: ["mylib.cpp"],
6571 shared_libs: ["myotherlib"],
6572 system_shared_libs: [],
6573 stl: "none",
6574 apex_available: [
6575 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006576 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006577 "//apex_available:platform",
6578 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006579 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006580 }
6581
6582 cc_library {
6583 name: "myotherlib",
6584 srcs: ["mylib.cpp"],
6585 system_shared_libs: [],
6586 stl: "none",
6587 apex_available: [
6588 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006589 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006590 "//apex_available:platform",
6591 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006592 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006593 }
6594
6595 java_library {
6596 name: "myjar",
6597 srcs: ["foo/bar/MyClass.java"],
6598 sdk_version: "none",
6599 system_modules: "none",
6600 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006601 apex_available: [
6602 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006603 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006604 "//apex_available:platform",
6605 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006606 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006607 }
6608
6609 java_library {
6610 name: "myotherjar",
6611 srcs: ["foo/bar/MyClass.java"],
6612 sdk_version: "none",
6613 system_modules: "none",
6614 apex_available: [
6615 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006616 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006617 "//apex_available:platform",
6618 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006619 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006620 }
6621 `
6622
6623 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6624 for _, f := range files {
6625 if f.path == file {
6626 if f.isLink {
6627 t.Errorf("%q is not a real file", file)
6628 }
6629 return
6630 }
6631 }
6632 t.Errorf("%q is not found", file)
6633 }
6634
6635 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6636 for _, f := range files {
6637 if f.path == file {
6638 if !f.isLink {
6639 t.Errorf("%q is not a symlink", file)
6640 }
6641 return
6642 }
6643 }
6644 t.Errorf("%q is not found", file)
6645 }
6646
Jiyong Park9d677202020-02-19 16:29:35 +09006647 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6648 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006649 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006650 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006651 ensureRealfileExists(t, files, "javalib/myjar.jar")
6652 ensureRealfileExists(t, files, "lib64/mylib.so")
6653 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6654
Jiyong Park9d677202020-02-19 16:29:35 +09006655 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6656 ensureRealfileExists(t, files, "javalib/myjar.jar")
6657 ensureRealfileExists(t, files, "lib64/mylib.so")
6658 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6659
6660 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006661 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006662 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006663 ensureRealfileExists(t, files, "javalib/myjar.jar")
6664 ensureRealfileExists(t, files, "lib64/mylib.so")
6665 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006666
6667 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6668 ensureRealfileExists(t, files, "javalib/myjar.jar")
6669 ensureRealfileExists(t, files, "lib64/mylib.so")
6670 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006671}
6672
Yo Chiange8128052020-07-23 20:09:18 +08006673func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006674 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006675 apex {
6676 name: "myapex",
6677 key: "myapex.key",
6678 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006679 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006680 }
6681
6682 apex_key {
6683 name: "myapex.key",
6684 public_key: "testkey.avbpubkey",
6685 private_key: "testkey.pem",
6686 }
6687
6688 cc_library_shared {
6689 name: "mylib",
6690 srcs: ["mylib.cpp"],
6691 shared_libs: ["myotherlib"],
6692 system_shared_libs: [],
6693 stl: "none",
6694 apex_available: [
6695 "myapex",
6696 "//apex_available:platform",
6697 ],
6698 }
6699
6700 cc_prebuilt_library_shared {
6701 name: "myotherlib",
6702 srcs: ["prebuilt.so"],
6703 system_shared_libs: [],
6704 stl: "none",
6705 apex_available: [
6706 "myapex",
6707 "//apex_available:platform",
6708 ],
6709 }
6710 `)
6711
6712 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006713 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006714 var builder strings.Builder
6715 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6716 androidMk := builder.String()
6717 // `myotherlib` is added to `myapex` as symlink
6718 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6719 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6720 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6721 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006722 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 +08006723}
6724
Jooyung Han643adc42020-02-27 13:50:06 +09006725func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006726 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006727 apex {
6728 name: "myapex",
6729 key: "myapex.key",
6730 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006731 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006732 }
6733
6734 apex_key {
6735 name: "myapex.key",
6736 public_key: "testkey.avbpubkey",
6737 private_key: "testkey.pem",
6738 }
6739
6740 cc_library {
6741 name: "mylib",
6742 srcs: ["mylib.cpp"],
6743 shared_libs: ["mylib2"],
6744 system_shared_libs: [],
6745 stl: "none",
6746 apex_available: [ "myapex" ],
6747 }
6748
6749 cc_library {
6750 name: "mylib2",
6751 srcs: ["mylib.cpp"],
6752 system_shared_libs: [],
6753 stl: "none",
6754 apex_available: [ "myapex" ],
6755 }
6756 `)
6757
6758 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6759 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6760 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6761 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6762 "lib64/mylib.so",
6763 "lib64/mylib2.so",
6764 })
6765}
6766
Jooyung Han49f67012020-04-17 13:43:10 +09006767func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006768 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006769 apex {
6770 name: "myapex",
6771 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006772 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006773 }
6774 apex_key {
6775 name: "myapex.key",
6776 public_key: "testkey.avbpubkey",
6777 private_key: "testkey.pem",
6778 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006779 `,
6780 android.FixtureModifyConfig(func(config android.Config) {
6781 delete(config.Targets, android.Android)
6782 config.AndroidCommonTarget = android.Target{}
6783 }),
6784 )
Jooyung Han49f67012020-04-17 13:43:10 +09006785
6786 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6787 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6788 }
6789}
6790
Jiyong Parkbd159612020-02-28 15:22:21 +09006791func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006792 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006793 apex {
6794 name: "myapex",
6795 key: "myapex.key",
6796 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006797 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006798 }
6799
6800 apex_key {
6801 name: "myapex.key",
6802 public_key: "testkey.avbpubkey",
6803 private_key: "testkey.pem",
6804 }
6805
6806 android_app {
6807 name: "AppFoo",
6808 srcs: ["foo/bar/MyClass.java"],
6809 sdk_version: "none",
6810 system_modules: "none",
6811 apex_available: [ "myapex" ],
6812 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006813 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006814
Colin Crosscf371cc2020-11-13 11:48:42 -08006815 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006816 content := bundleConfigRule.Args["content"]
6817
6818 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006819 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 +09006820}
6821
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006822func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006823 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006824 apex {
6825 name: "myapex",
6826 key: "myapex.key",
6827 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006828 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006829 }
6830
6831 apex_key {
6832 name: "myapex.key",
6833 public_key: "testkey.avbpubkey",
6834 private_key: "testkey.pem",
6835 }
6836
6837 android_app_set {
6838 name: "AppSet",
6839 set: "AppSet.apks",
6840 }`)
6841 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006842 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006843 content := bundleConfigRule.Args["content"]
6844 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6845 s := mod.Rule("apexRule").Args["copy_commands"]
6846 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6847 if len(copyCmds) != 3 {
6848 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6849 }
6850 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6851 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6852 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6853}
6854
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006855func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01006856 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006857 apex_set {
6858 name: "myapex",
6859 filename: "foo_v2.apex",
6860 sanitized: {
6861 none: { set: "myapex.apks", },
6862 hwaddress: { set: "myapex.hwasan.apks", },
6863 },
Paul Duffin24704672021-04-06 16:09:30 +01006864 }
6865 `
6866 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006867
Paul Duffin24704672021-04-06 16:09:30 +01006868 // Check that the extractor produces the correct output file from the correct input file.
6869 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006870
Paul Duffin24704672021-04-06 16:09:30 +01006871 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
6872 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006873
Paul Duffin24704672021-04-06 16:09:30 +01006874 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
6875
6876 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01006877 m = ctx.ModuleForTests("myapex", "android_common_myapex")
6878 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01006879
6880 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006881}
6882
Paul Duffin89f570a2021-06-16 01:42:33 +01006883func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006884 t.Helper()
6885
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006886 bp := `
6887 java_library {
6888 name: "some-updatable-apex-lib",
6889 srcs: ["a.java"],
6890 sdk_version: "current",
6891 apex_available: [
6892 "some-updatable-apex",
6893 ],
satayevabcd5972021-08-06 17:49:46 +01006894 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006895 }
6896
6897 java_library {
6898 name: "some-non-updatable-apex-lib",
6899 srcs: ["a.java"],
6900 apex_available: [
6901 "some-non-updatable-apex",
6902 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01006903 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01006904 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006905 }
6906
6907 bootclasspath_fragment {
6908 name: "some-non-updatable-fragment",
6909 contents: ["some-non-updatable-apex-lib"],
6910 apex_available: [
6911 "some-non-updatable-apex",
6912 ],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006913 }
6914
6915 java_library {
6916 name: "some-platform-lib",
6917 srcs: ["a.java"],
6918 sdk_version: "current",
6919 installable: true,
6920 }
6921
6922 java_library {
6923 name: "some-art-lib",
6924 srcs: ["a.java"],
6925 sdk_version: "current",
6926 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006927 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006928 ],
6929 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01006930 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006931 }
6932
6933 apex {
6934 name: "some-updatable-apex",
6935 key: "some-updatable-apex.key",
6936 java_libs: ["some-updatable-apex-lib"],
6937 updatable: true,
6938 min_sdk_version: "current",
6939 }
6940
6941 apex {
6942 name: "some-non-updatable-apex",
6943 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01006944 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006945 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006946 }
6947
6948 apex_key {
6949 name: "some-updatable-apex.key",
6950 }
6951
6952 apex_key {
6953 name: "some-non-updatable-apex.key",
6954 }
6955
6956 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006957 name: "com.android.art.debug",
6958 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01006959 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006960 updatable: true,
6961 min_sdk_version: "current",
6962 }
6963
Paul Duffinf23bc472021-04-27 12:42:20 +01006964 bootclasspath_fragment {
6965 name: "art-bootclasspath-fragment",
6966 image_name: "art",
6967 contents: ["some-art-lib"],
6968 apex_available: [
6969 "com.android.art.debug",
6970 ],
6971 }
6972
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006973 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006974 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006975 }
6976
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006977 filegroup {
6978 name: "some-updatable-apex-file_contexts",
6979 srcs: [
6980 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6981 ],
6982 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006983
6984 filegroup {
6985 name: "some-non-updatable-apex-file_contexts",
6986 srcs: [
6987 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6988 ],
6989 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006990 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006991
Paul Duffin89f570a2021-06-16 01:42:33 +01006992 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00006993}
6994
Paul Duffin89f570a2021-06-16 01:42:33 +01006995func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006996 t.Helper()
6997
Paul Duffin55607122021-03-30 23:32:51 +01006998 fs := android.MockFS{
6999 "a.java": nil,
7000 "a.jar": nil,
7001 "apex_manifest.json": nil,
7002 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007003 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007004 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7005 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7006 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007007 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007008 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007009
Paul Duffin55607122021-03-30 23:32:51 +01007010 errorHandler := android.FixtureExpectsNoErrors
7011 if errmsg != "" {
7012 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007013 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007014
Paul Duffin55607122021-03-30 23:32:51 +01007015 result := android.GroupFixturePreparers(
7016 cc.PrepareForTestWithCcDefaultModules,
7017 java.PrepareForTestWithHiddenApiBuildComponents,
7018 java.PrepareForTestWithJavaDefaultModules,
7019 java.PrepareForTestWithJavaSdkLibraryFiles,
7020 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007021 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007022 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007023 android.FixtureModifyMockFS(func(fs android.MockFS) {
7024 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7025 insert := ""
7026 for _, fragment := range fragments {
7027 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7028 }
7029 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7030 platform_bootclasspath {
7031 name: "platform-bootclasspath",
7032 fragments: [
7033 %s
7034 ],
7035 }
7036 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007037 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007038 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007039 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007040 ).
7041 ExtendWithErrorHandler(errorHandler).
7042 RunTestWithBp(t, bp)
7043
7044 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007045}
7046
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007047func TestDuplicateDeapexeresFromPrebuiltApexes(t *testing.T) {
7048 preparers := android.GroupFixturePreparers(
7049 java.PrepareForTestWithJavaDefaultModules,
7050 PrepareForTestWithApexBuildComponents,
7051 ).
7052 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7053 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7054
7055 bpBase := `
7056 apex_set {
7057 name: "com.android.myapex",
7058 installable: true,
7059 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7060 set: "myapex.apks",
7061 }
7062
7063 apex_set {
7064 name: "com.mycompany.android.myapex",
7065 apex_name: "com.android.myapex",
7066 installable: true,
7067 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7068 set: "company-myapex.apks",
7069 }
7070
7071 prebuilt_bootclasspath_fragment {
7072 name: "my-bootclasspath-fragment",
7073 apex_available: ["com.android.myapex"],
7074 %s
7075 }
7076 `
7077
7078 t.Run("java_import", func(t *testing.T) {
7079 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7080 java_import {
7081 name: "libfoo",
7082 jars: ["libfoo.jar"],
7083 apex_available: ["com.android.myapex"],
7084 }
7085 `)
7086 })
7087
7088 t.Run("java_sdk_library_import", func(t *testing.T) {
7089 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7090 java_sdk_library_import {
7091 name: "libfoo",
7092 public: {
7093 jars: ["libbar.jar"],
7094 },
7095 apex_available: ["com.android.myapex"],
7096 }
7097 `)
7098 })
7099
7100 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7101 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7102 image_name: "art",
7103 contents: ["libfoo"],
7104 `)+`
7105 java_sdk_library_import {
7106 name: "libfoo",
7107 public: {
7108 jars: ["libbar.jar"],
7109 },
7110 apex_available: ["com.android.myapex"],
7111 }
7112 `)
7113 })
7114}
7115
Jooyung Han548640b2020-04-27 12:10:30 +09007116func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7117 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7118 apex {
7119 name: "myapex",
7120 key: "myapex.key",
7121 updatable: true,
7122 }
7123
7124 apex_key {
7125 name: "myapex.key",
7126 public_key: "testkey.avbpubkey",
7127 private_key: "testkey.pem",
7128 }
7129 `)
7130}
7131
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007132func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7133 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7134 apex {
7135 name: "myapex",
7136 key: "myapex.key",
7137 }
7138
7139 apex_key {
7140 name: "myapex.key",
7141 public_key: "testkey.avbpubkey",
7142 private_key: "testkey.pem",
7143 }
7144 `)
7145}
7146
Daniel Norman69109112021-12-02 12:52:42 -08007147func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7148 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7149 apex {
7150 name: "myapex",
7151 key: "myapex.key",
7152 updatable: true,
7153 soc_specific: true,
7154 }
7155
7156 apex_key {
7157 name: "myapex.key",
7158 public_key: "testkey.avbpubkey",
7159 private_key: "testkey.pem",
7160 }
7161 `)
7162}
7163
satayevb98371c2021-06-15 16:49:50 +01007164func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7165 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7166 apex {
7167 name: "myapex",
7168 key: "myapex.key",
7169 systemserverclasspath_fragments: [
7170 "mysystemserverclasspathfragment",
7171 ],
7172 min_sdk_version: "29",
7173 updatable: true,
7174 }
7175
7176 apex_key {
7177 name: "myapex.key",
7178 public_key: "testkey.avbpubkey",
7179 private_key: "testkey.pem",
7180 }
7181
7182 java_library {
7183 name: "foo",
7184 srcs: ["b.java"],
7185 min_sdk_version: "29",
7186 installable: true,
7187 apex_available: [
7188 "myapex",
7189 ],
7190 }
7191
7192 systemserverclasspath_fragment {
7193 name: "mysystemserverclasspathfragment",
7194 generate_classpaths_proto: false,
7195 contents: [
7196 "foo",
7197 ],
7198 apex_available: [
7199 "myapex",
7200 ],
7201 }
satayevabcd5972021-08-06 17:49:46 +01007202 `,
7203 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7204 )
satayevb98371c2021-06-15 16:49:50 +01007205}
7206
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007207func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007208 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7209 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7210 // modules to be included in the BootJars.
7211 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7212 return android.GroupFixturePreparers(
7213 dexpreopt.FixtureSetBootJars(bootJars...),
7214 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7215 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7216 }),
7217 )
7218 }
7219
7220 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7221 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7222 // specified in the ArtApexJars configuration.
7223 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7224 return android.GroupFixturePreparers(
7225 dexpreopt.FixtureSetArtBootJars(bootJars...),
7226 dexpreopt.FixtureSetBootJars(bootJars...),
7227 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7228 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7229 }),
7230 )
7231 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007232
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007233 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007234 preparer := android.GroupFixturePreparers(
7235 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7236 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7237 )
7238 fragments := []java.ApexVariantReference{
7239 {
7240 Apex: proptools.StringPtr("com.android.art.debug"),
7241 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7242 },
7243 {
7244 Apex: proptools.StringPtr("some-non-updatable-apex"),
7245 Module: proptools.StringPtr("some-non-updatable-fragment"),
7246 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007247 }
satayevabcd5972021-08-06 17:49:46 +01007248 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007249 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007250
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007251 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007252 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7253 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007254 preparer := android.GroupFixturePreparers(
7255 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7256 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7257 )
Paul Duffin60264a02021-04-12 20:02:36 +01007258 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007259 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007260
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007261 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007262 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 +01007263 // Update the dexpreopt ArtApexJars directly.
7264 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7265 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007266 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007267
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007268 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 +01007269 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 +01007270 // Update the dexpreopt ArtApexJars directly.
7271 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7272 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007273 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007274
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007275 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 +01007276 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 +01007277 preparer := android.GroupFixturePreparers(
7278 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7279 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7280 )
Paul Duffin60264a02021-04-12 20:02:36 +01007281 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007282 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007283
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007284 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 +01007285 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007286 fragment := java.ApexVariantReference{
7287 Apex: proptools.StringPtr("some-non-updatable-apex"),
7288 Module: proptools.StringPtr("some-non-updatable-fragment"),
7289 }
7290 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007291 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007292
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007293 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007294 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007295 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7296 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007297 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007298
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007299 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007300 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007301 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7302 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007303 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007304
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007305 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007306 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007307 // Update the dexpreopt ArtApexJars directly.
7308 preparer := prepareSetArtJars("platform:some-platform-lib")
7309 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007310 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007311
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007312 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007313 preparer := android.GroupFixturePreparers(
7314 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7315 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7316 )
7317 fragments := []java.ApexVariantReference{
7318 {
7319 Apex: proptools.StringPtr("some-non-updatable-apex"),
7320 Module: proptools.StringPtr("some-non-updatable-fragment"),
7321 },
7322 }
7323 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007324 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007325}
7326
7327func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007328 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007329 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007330 fragment := java.ApexVariantReference{
7331 Apex: proptools.StringPtr("myapex"),
7332 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7333 }
7334
Paul Duffin064b70c2020-11-02 17:32:38 +00007335 testDexpreoptWithApexes(t, `
7336 prebuilt_apex {
7337 name: "myapex" ,
7338 arch: {
7339 arm64: {
7340 src: "myapex-arm64.apex",
7341 },
7342 arm: {
7343 src: "myapex-arm.apex",
7344 },
7345 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007346 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7347 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007348
Paul Duffin89f570a2021-06-16 01:42:33 +01007349 prebuilt_bootclasspath_fragment {
7350 name: "my-bootclasspath-fragment",
7351 contents: ["libfoo"],
7352 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007353 hidden_api: {
7354 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7355 metadata: "my-bootclasspath-fragment/metadata.csv",
7356 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007357 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7358 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7359 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007360 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007361 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007362
Paul Duffin89f570a2021-06-16 01:42:33 +01007363 java_import {
7364 name: "libfoo",
7365 jars: ["libfoo.jar"],
7366 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007367 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007368 }
7369 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007370 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007371}
7372
satayevd604b212021-07-21 14:23:52 +01007373func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007374 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007375 bp += `
7376 apex_key {
7377 name: "myapex.key",
7378 public_key: "testkey.avbpubkey",
7379 private_key: "testkey.pem",
7380 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007381 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007382 "lib1/src/A.java": nil,
7383 "lib2/src/B.java": nil,
7384 "system/sepolicy/apex/myapex-file_contexts": nil,
7385 }
7386
Paul Duffin45338f02021-03-30 23:07:52 +01007387 errorHandler := android.FixtureExpectsNoErrors
7388 if errmsg != "" {
7389 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007390 }
Colin Crossae8600b2020-10-29 17:09:13 -07007391
Paul Duffin45338f02021-03-30 23:07:52 +01007392 android.GroupFixturePreparers(
7393 android.PrepareForTestWithAndroidBuildComponents,
7394 java.PrepareForTestWithJavaBuildComponents,
7395 PrepareForTestWithApexBuildComponents,
7396 android.PrepareForTestWithNeverallowRules(rules),
7397 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007398 apexBootJars := make([]string, 0, len(bootJars))
7399 for _, apexBootJar := range bootJars {
7400 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007401 }
satayevd604b212021-07-21 14:23:52 +01007402 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007403 }),
7404 fs.AddToFixture(),
7405 ).
7406 ExtendWithErrorHandler(errorHandler).
7407 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007408}
7409
7410func TestApexPermittedPackagesRules(t *testing.T) {
7411 testcases := []struct {
7412 name string
7413 expectedError string
7414 bp string
7415 bootJars []string
7416 modulesPackages map[string][]string
7417 }{
7418
7419 {
7420 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7421 expectedError: "",
7422 bp: `
7423 java_library {
7424 name: "bcp_lib1",
7425 srcs: ["lib1/src/*.java"],
7426 permitted_packages: ["foo.bar"],
7427 apex_available: ["myapex"],
7428 sdk_version: "none",
7429 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007430 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007431 }
7432 java_library {
7433 name: "nonbcp_lib2",
7434 srcs: ["lib2/src/*.java"],
7435 apex_available: ["myapex"],
7436 permitted_packages: ["a.b"],
7437 sdk_version: "none",
7438 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007439 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007440 }
7441 apex {
7442 name: "myapex",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007443 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007444 key: "myapex.key",
7445 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007446 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007447 }`,
7448 bootJars: []string{"bcp_lib1"},
7449 modulesPackages: map[string][]string{
7450 "myapex": []string{
7451 "foo.bar",
7452 },
7453 },
7454 },
7455 {
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007456 name: "Bootclasspath apex jar not satisfying allowed module packages on Q.",
7457 expectedError: `module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only allow these packages: foo.bar with min_sdk < T. Please jarjar or move code around.`,
Andrei Onea115e7e72020-06-05 21:14:03 +01007458 bp: `
7459 java_library {
7460 name: "bcp_lib1",
7461 srcs: ["lib1/src/*.java"],
7462 apex_available: ["myapex"],
7463 permitted_packages: ["foo.bar"],
7464 sdk_version: "none",
7465 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007466 min_sdk_version: "29",
Andrei Onea115e7e72020-06-05 21:14:03 +01007467 }
7468 java_library {
7469 name: "bcp_lib2",
7470 srcs: ["lib2/src/*.java"],
7471 apex_available: ["myapex"],
7472 permitted_packages: ["foo.bar", "bar.baz"],
7473 sdk_version: "none",
7474 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007475 min_sdk_version: "29",
Andrei Onea115e7e72020-06-05 21:14:03 +01007476 }
7477 apex {
7478 name: "myapex",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007479 min_sdk_version: "29",
7480 key: "myapex.key",
7481 java_libs: ["bcp_lib1", "bcp_lib2"],
7482 updatable: false,
7483 }
7484 `,
7485 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7486 modulesPackages: map[string][]string{
7487 "myapex": []string{
7488 "foo.bar",
7489 },
7490 },
7491 },
7492 {
7493 name: "Bootclasspath apex jar not satisfying allowed module packages on R.",
7494 expectedError: `module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only allow these packages: foo.bar with min_sdk < T. Please jarjar or move code around.`,
7495 bp: `
7496 java_library {
7497 name: "bcp_lib1",
7498 srcs: ["lib1/src/*.java"],
7499 apex_available: ["myapex"],
7500 permitted_packages: ["foo.bar"],
7501 sdk_version: "none",
7502 system_modules: "none",
7503 min_sdk_version: "30",
7504 }
7505 java_library {
7506 name: "bcp_lib2",
7507 srcs: ["lib2/src/*.java"],
7508 apex_available: ["myapex"],
7509 permitted_packages: ["foo.bar", "bar.baz"],
7510 sdk_version: "none",
7511 system_modules: "none",
7512 min_sdk_version: "30",
7513 }
7514 apex {
7515 name: "myapex",
7516 min_sdk_version: "30",
7517 key: "myapex.key",
7518 java_libs: ["bcp_lib1", "bcp_lib2"],
7519 updatable: false,
7520 }
7521 `,
7522 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7523 modulesPackages: map[string][]string{
7524 "myapex": []string{
7525 "foo.bar",
7526 },
7527 },
7528 },
7529 {
7530 name: "Bootclasspath apex jar >= T not satisfying Q/R/S allowed module packages.",
7531 expectedError: "",
7532 bp: `
7533 java_library {
7534 name: "bcp_lib1",
7535 srcs: ["lib1/src/*.java"],
7536 apex_available: ["myapex"],
7537 permitted_packages: ["foo.bar"],
7538 sdk_version: "none",
7539 system_modules: "none",
7540 min_sdk_version: "current",
7541 }
7542 java_library {
7543 name: "bcp_lib2",
7544 srcs: ["lib2/src/*.java"],
7545 apex_available: ["myapex"],
7546 permitted_packages: ["foo.bar", "bar.baz"],
7547 sdk_version: "none",
7548 system_modules: "none",
7549 min_sdk_version: "current",
7550 }
7551 apex {
7552 name: "myapex",
7553 min_sdk_version: "current",
Andrei Onea115e7e72020-06-05 21:14:03 +01007554 key: "myapex.key",
7555 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007556 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007557 }
7558 `,
7559 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7560 modulesPackages: map[string][]string{
7561 "myapex": []string{
7562 "foo.bar",
7563 },
7564 },
7565 },
7566 }
7567 for _, tc := range testcases {
7568 t.Run(tc.name, func(t *testing.T) {
7569 rules := createApexPermittedPackagesRules(tc.modulesPackages)
7570 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
7571 })
7572 }
7573}
7574
Jiyong Park62304bb2020-04-13 16:19:48 +09007575func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007576 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09007577 apex {
7578 name: "myapex",
7579 key: "myapex.key",
7580 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007581 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09007582 }
7583
7584 apex_key {
7585 name: "myapex.key",
7586 public_key: "testkey.avbpubkey",
7587 private_key: "testkey.pem",
7588 }
7589
7590 cc_library {
7591 name: "mylib",
7592 srcs: ["mylib.cpp"],
7593 system_shared_libs: [],
7594 stl: "none",
7595 stubs: {
7596 versions: ["1"],
7597 },
7598 apex_available: ["myapex"],
7599 }
7600
7601 cc_library {
7602 name: "myprivlib",
7603 srcs: ["mylib.cpp"],
7604 system_shared_libs: [],
7605 stl: "none",
7606 apex_available: ["myapex"],
7607 }
7608
7609
7610 cc_test {
7611 name: "mytest",
7612 gtest: false,
7613 srcs: ["mylib.cpp"],
7614 system_shared_libs: [],
7615 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09007616 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09007617 test_for: ["myapex"]
7618 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007619
7620 cc_library {
7621 name: "mytestlib",
7622 srcs: ["mylib.cpp"],
7623 system_shared_libs: [],
7624 shared_libs: ["mylib", "myprivlib"],
7625 stl: "none",
7626 test_for: ["myapex"],
7627 }
7628
7629 cc_benchmark {
7630 name: "mybench",
7631 srcs: ["mylib.cpp"],
7632 system_shared_libs: [],
7633 shared_libs: ["mylib", "myprivlib"],
7634 stl: "none",
7635 test_for: ["myapex"],
7636 }
Jiyong Park62304bb2020-04-13 16:19:48 +09007637 `)
7638
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007639 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007640 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007641 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7642 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7643 }
7644
7645 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09007646 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007647 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7648 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7649 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7650}
Jiyong Park46a512f2020-12-04 18:02:13 +09007651
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007652func TestIndirectTestFor(t *testing.T) {
7653 ctx := testApex(t, `
7654 apex {
7655 name: "myapex",
7656 key: "myapex.key",
7657 native_shared_libs: ["mylib", "myprivlib"],
7658 updatable: false,
7659 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007660
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007661 apex_key {
7662 name: "myapex.key",
7663 public_key: "testkey.avbpubkey",
7664 private_key: "testkey.pem",
7665 }
7666
7667 cc_library {
7668 name: "mylib",
7669 srcs: ["mylib.cpp"],
7670 system_shared_libs: [],
7671 stl: "none",
7672 stubs: {
7673 versions: ["1"],
7674 },
7675 apex_available: ["myapex"],
7676 }
7677
7678 cc_library {
7679 name: "myprivlib",
7680 srcs: ["mylib.cpp"],
7681 system_shared_libs: [],
7682 stl: "none",
7683 shared_libs: ["mylib"],
7684 apex_available: ["myapex"],
7685 }
7686
7687 cc_library {
7688 name: "mytestlib",
7689 srcs: ["mylib.cpp"],
7690 system_shared_libs: [],
7691 shared_libs: ["myprivlib"],
7692 stl: "none",
7693 test_for: ["myapex"],
7694 }
7695 `)
7696
7697 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007698 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007699 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7700 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7701 }
7702
7703 // The platform variant of mytestlib links to the platform variant of the
7704 // internal myprivlib.
7705 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
7706
7707 // The platform variant of myprivlib links to the platform variant of mylib
7708 // and bypasses its stubs.
7709 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 +09007710}
7711
Martin Stjernholmec009002021-03-27 15:18:31 +00007712func TestTestForForLibInOtherApex(t *testing.T) {
7713 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
7714 _ = testApex(t, `
7715 apex {
7716 name: "com.android.art",
7717 key: "myapex.key",
7718 native_shared_libs: ["mylib"],
7719 updatable: false,
7720 }
7721
7722 apex {
7723 name: "com.android.art.debug",
7724 key: "myapex.key",
7725 native_shared_libs: ["mylib", "mytestlib"],
7726 updatable: false,
7727 }
7728
7729 apex_key {
7730 name: "myapex.key",
7731 public_key: "testkey.avbpubkey",
7732 private_key: "testkey.pem",
7733 }
7734
7735 cc_library {
7736 name: "mylib",
7737 srcs: ["mylib.cpp"],
7738 system_shared_libs: [],
7739 stl: "none",
7740 stubs: {
7741 versions: ["1"],
7742 },
7743 apex_available: ["com.android.art", "com.android.art.debug"],
7744 }
7745
7746 cc_library {
7747 name: "mytestlib",
7748 srcs: ["mylib.cpp"],
7749 system_shared_libs: [],
7750 shared_libs: ["mylib"],
7751 stl: "none",
7752 apex_available: ["com.android.art.debug"],
7753 test_for: ["com.android.art"],
7754 }
7755 `,
7756 android.MockFS{
7757 "system/sepolicy/apex/com.android.art-file_contexts": nil,
7758 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
7759 }.AddToFixture())
7760}
7761
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007762// TODO(jungjw): Move this to proptools
7763func intPtr(i int) *int {
7764 return &i
7765}
7766
7767func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007768 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007769 apex_set {
7770 name: "myapex",
7771 set: "myapex.apks",
7772 filename: "foo_v2.apex",
7773 overrides: ["foo"],
7774 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007775 `,
7776 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7777 variables.Platform_sdk_version = intPtr(30)
7778 }),
7779 android.FixtureModifyConfig(func(config android.Config) {
7780 config.Targets[android.Android] = []android.Target{
7781 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
7782 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
7783 }
7784 }),
7785 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007786
Paul Duffin24704672021-04-06 16:09:30 +01007787 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007788
7789 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01007790 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007791 actual := extractedApex.Args["abis"]
7792 expected := "ARMEABI_V7A,ARM64_V8A"
7793 if actual != expected {
7794 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7795 }
7796 actual = extractedApex.Args["sdk-version"]
7797 expected = "30"
7798 if actual != expected {
7799 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7800 }
7801
Paul Duffin6717d882021-06-15 19:09:41 +01007802 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007803 a := m.Module().(*ApexSet)
7804 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07007805 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007806 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
7807 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
7808 }
7809}
7810
Jiyong Park7d95a512020-05-10 15:16:24 +09007811func TestNoStaticLinkingToStubsLib(t *testing.T) {
7812 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
7813 apex {
7814 name: "myapex",
7815 key: "myapex.key",
7816 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007817 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09007818 }
7819
7820 apex_key {
7821 name: "myapex.key",
7822 public_key: "testkey.avbpubkey",
7823 private_key: "testkey.pem",
7824 }
7825
7826 cc_library {
7827 name: "mylib",
7828 srcs: ["mylib.cpp"],
7829 static_libs: ["otherlib"],
7830 system_shared_libs: [],
7831 stl: "none",
7832 apex_available: [ "myapex" ],
7833 }
7834
7835 cc_library {
7836 name: "otherlib",
7837 srcs: ["mylib.cpp"],
7838 system_shared_libs: [],
7839 stl: "none",
7840 stubs: {
7841 versions: ["1", "2", "3"],
7842 },
7843 apex_available: [ "myapex" ],
7844 }
7845 `)
7846}
7847
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007848func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007849 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007850 apex {
7851 name: "myapex",
7852 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007853 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09007854 custom_sign_tool: "sign_myapex",
7855 }
7856
7857 apex_key {
7858 name: "myapex.key",
7859 public_key: "testkey.avbpubkey",
7860 private_key: "testkey.pem",
7861 }
7862 `)
7863
7864 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7865 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7866 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"`)
7867}
7868
7869func TestApexKeysTxtOverrides(t *testing.T) {
7870 ctx := testApex(t, `
7871 apex {
7872 name: "myapex",
7873 key: "myapex.key",
7874 updatable: false,
7875 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007876 }
7877
7878 apex_key {
7879 name: "myapex.key",
7880 public_key: "testkey.avbpubkey",
7881 private_key: "testkey.pem",
7882 }
7883
7884 prebuilt_apex {
7885 name: "myapex",
7886 prefer: true,
7887 arch: {
7888 arm64: {
7889 src: "myapex-arm64.apex",
7890 },
7891 arm: {
7892 src: "myapex-arm.apex",
7893 },
7894 },
7895 }
7896
7897 apex_set {
7898 name: "myapex_set",
7899 set: "myapex.apks",
7900 filename: "myapex_set.apex",
7901 overrides: ["myapex"],
7902 }
7903 `)
7904
7905 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7906 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7907 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 +09007908 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 +09007909}
7910
Jooyung Han938b5932020-06-20 12:47:47 +09007911func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007912 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09007913 apex {
7914 name: "myapex",
7915 key: "myapex.key",
7916 apps: ["app"],
7917 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007918 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007919 }
7920
7921 apex_key {
7922 name: "myapex.key",
7923 public_key: "testkey.avbpubkey",
7924 private_key: "testkey.pem",
7925 }
7926
7927 android_app {
7928 name: "app",
7929 srcs: ["foo/bar/MyClass.java"],
7930 package_name: "foo",
7931 sdk_version: "none",
7932 system_modules: "none",
7933 apex_available: [ "myapex" ],
7934 }
7935 `, withFiles(map[string][]byte{
7936 "sub/Android.bp": []byte(`
7937 override_apex {
7938 name: "override_myapex",
7939 base: "myapex",
7940 apps: ["override_app"],
7941 allowed_files: ":allowed",
7942 }
7943 // Overridable "path" property should be referenced indirectly
7944 filegroup {
7945 name: "allowed",
7946 srcs: ["allowed.txt"],
7947 }
7948 override_android_app {
7949 name: "override_app",
7950 base: "app",
7951 package_name: "bar",
7952 }
7953 `),
7954 }))
7955
7956 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7957 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7958 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7959 }
7960
7961 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7962 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7963 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7964 }
7965}
7966
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007967func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007968 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007969 apex {
7970 name: "myapex",
7971 key: "myapex.key",
7972 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007973 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007974 }
7975
7976 apex_key {
7977 name: "myapex.key",
7978 public_key: "testkey.avbpubkey",
7979 private_key: "testkey.pem",
7980 }
7981
7982 cc_library {
7983 name: "mylib",
7984 srcs: ["mylib.cpp"],
7985 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007986 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007987 },
7988 apex_available: ["myapex"],
7989 }
7990
7991 cc_prebuilt_library_shared {
7992 name: "mylib",
7993 prefer: false,
7994 srcs: ["prebuilt.so"],
7995 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007996 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007997 },
7998 apex_available: ["myapex"],
7999 }
8000 `)
8001}
8002
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008003func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008004 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008005 apex {
8006 name: "myapex",
8007 key: "myapex.key",
8008 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008009 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008010 }
8011 apex_key {
8012 name: "myapex.key",
8013 public_key: "testkey.avbpubkey",
8014 private_key: "testkey.pem",
8015 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008016 `,
8017 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8018 variables.CompressedApex = proptools.BoolPtr(true)
8019 }),
8020 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008021
8022 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8023 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8024
8025 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8026 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8027
8028 // Make sure output of bundle is .capex
8029 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8030 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8031
8032 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008033 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008034 var builder strings.Builder
8035 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8036 androidMk := builder.String()
8037 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8038}
8039
Martin Stjernholm2856c662020-12-02 15:03:42 +00008040func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008041 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008042 apex {
8043 name: "myapex",
8044 key: "myapex.key",
8045 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008046 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008047 }
8048
8049 apex_key {
8050 name: "myapex.key",
8051 public_key: "testkey.avbpubkey",
8052 private_key: "testkey.pem",
8053 }
8054
8055 cc_library {
8056 name: "mylib",
8057 srcs: ["mylib.cpp"],
8058 apex_available: ["myapex"],
8059 shared_libs: ["otherlib"],
8060 system_shared_libs: [],
8061 }
8062
8063 cc_library {
8064 name: "otherlib",
8065 srcs: ["mylib.cpp"],
8066 stubs: {
8067 versions: ["current"],
8068 },
8069 }
8070
8071 cc_prebuilt_library_shared {
8072 name: "otherlib",
8073 prefer: true,
8074 srcs: ["prebuilt.so"],
8075 stubs: {
8076 versions: ["current"],
8077 },
8078 }
8079 `)
8080
8081 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008082 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008083 var builder strings.Builder
8084 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8085 androidMk := builder.String()
8086
8087 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8088 // a thing there.
8089 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8090}
8091
Jiyong Parke3867542020-12-03 17:28:25 +09008092func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008093 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008094 apex {
8095 name: "myapex",
8096 key: "myapex.key",
8097 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008098 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008099 }
8100
8101 apex_key {
8102 name: "myapex.key",
8103 public_key: "testkey.avbpubkey",
8104 private_key: "testkey.pem",
8105 }
8106
8107 cc_library {
8108 name: "mylib",
8109 srcs: ["mylib.cpp"],
8110 system_shared_libs: [],
8111 stl: "none",
8112 apex_available: ["myapex"],
8113 shared_libs: ["mylib2"],
8114 target: {
8115 apex: {
8116 exclude_shared_libs: ["mylib2"],
8117 },
8118 },
8119 }
8120
8121 cc_library {
8122 name: "mylib2",
8123 srcs: ["mylib.cpp"],
8124 system_shared_libs: [],
8125 stl: "none",
8126 }
8127 `)
8128
8129 // Check if mylib is linked to mylib2 for the non-apex target
8130 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8131 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8132
8133 // Make sure that the link doesn't occur for the apex target
8134 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8135 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8136
8137 // It shouldn't appear in the copy cmd as well.
8138 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8139 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8140}
8141
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008142func TestPrebuiltStubLibDep(t *testing.T) {
8143 bpBase := `
8144 apex {
8145 name: "myapex",
8146 key: "myapex.key",
8147 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008148 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008149 }
8150 apex_key {
8151 name: "myapex.key",
8152 public_key: "testkey.avbpubkey",
8153 private_key: "testkey.pem",
8154 }
8155 cc_library {
8156 name: "mylib",
8157 srcs: ["mylib.cpp"],
8158 apex_available: ["myapex"],
8159 shared_libs: ["stublib"],
8160 system_shared_libs: [],
8161 }
8162 apex {
8163 name: "otherapex",
8164 enabled: %s,
8165 key: "myapex.key",
8166 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008167 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008168 }
8169 `
8170
8171 stublibSourceBp := `
8172 cc_library {
8173 name: "stublib",
8174 srcs: ["mylib.cpp"],
8175 apex_available: ["otherapex"],
8176 system_shared_libs: [],
8177 stl: "none",
8178 stubs: {
8179 versions: ["1"],
8180 },
8181 }
8182 `
8183
8184 stublibPrebuiltBp := `
8185 cc_prebuilt_library_shared {
8186 name: "stublib",
8187 srcs: ["prebuilt.so"],
8188 apex_available: ["otherapex"],
8189 stubs: {
8190 versions: ["1"],
8191 },
8192 %s
8193 }
8194 `
8195
8196 tests := []struct {
8197 name string
8198 stublibBp string
8199 usePrebuilt bool
8200 modNames []string // Modules to collect AndroidMkEntries for
8201 otherApexEnabled []string
8202 }{
8203 {
8204 name: "only_source",
8205 stublibBp: stublibSourceBp,
8206 usePrebuilt: false,
8207 modNames: []string{"stublib"},
8208 otherApexEnabled: []string{"true", "false"},
8209 },
8210 {
8211 name: "source_preferred",
8212 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8213 usePrebuilt: false,
8214 modNames: []string{"stublib", "prebuilt_stublib"},
8215 otherApexEnabled: []string{"true", "false"},
8216 },
8217 {
8218 name: "prebuilt_preferred",
8219 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8220 usePrebuilt: true,
8221 modNames: []string{"stublib", "prebuilt_stublib"},
8222 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8223 },
8224 {
8225 name: "only_prebuilt",
8226 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8227 usePrebuilt: true,
8228 modNames: []string{"stublib"},
8229 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8230 },
8231 }
8232
8233 for _, test := range tests {
8234 t.Run(test.name, func(t *testing.T) {
8235 for _, otherApexEnabled := range test.otherApexEnabled {
8236 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008237 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008238
8239 type modAndMkEntries struct {
8240 mod *cc.Module
8241 mkEntries android.AndroidMkEntries
8242 }
8243 entries := []*modAndMkEntries{}
8244
8245 // Gather shared lib modules that are installable
8246 for _, modName := range test.modNames {
8247 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8248 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8249 continue
8250 }
8251 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008252 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008253 continue
8254 }
Colin Crossaa255532020-07-03 13:18:24 -07008255 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008256 if ent.Disabled {
8257 continue
8258 }
8259 entries = append(entries, &modAndMkEntries{
8260 mod: mod,
8261 mkEntries: ent,
8262 })
8263 }
8264 }
8265 }
8266
8267 var entry *modAndMkEntries = nil
8268 for _, ent := range entries {
8269 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8270 if entry != nil {
8271 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8272 } else {
8273 entry = ent
8274 }
8275 }
8276 }
8277
8278 if entry == nil {
8279 t.Errorf("AndroidMk entry for \"stublib\" missing")
8280 } else {
8281 isPrebuilt := entry.mod.Prebuilt() != nil
8282 if isPrebuilt != test.usePrebuilt {
8283 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8284 }
8285 if !entry.mod.IsStubs() {
8286 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8287 }
8288 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8289 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8290 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008291 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008292 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008293 if !android.InList(expected, cflags) {
8294 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8295 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008296 }
8297 })
8298 }
8299 })
8300 }
8301}
8302
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008303func TestHostApexInHostOnlyBuild(t *testing.T) {
8304 testApex(t, `
8305 apex {
8306 name: "myapex",
8307 host_supported: true,
8308 key: "myapex.key",
8309 updatable: false,
8310 payload_type: "zip",
8311 }
8312 apex_key {
8313 name: "myapex.key",
8314 public_key: "testkey.avbpubkey",
8315 private_key: "testkey.pem",
8316 }
8317 `,
8318 android.FixtureModifyConfig(func(config android.Config) {
8319 // We may not have device targets in all builds, e.g. in
8320 // prebuilts/build-tools/build-prebuilts.sh
8321 config.Targets[android.Android] = []android.Target{}
8322 }))
8323}
8324
Colin Crossc33e5212021-05-25 18:16:02 -07008325func TestApexJavaCoverage(t *testing.T) {
8326 bp := `
8327 apex {
8328 name: "myapex",
8329 key: "myapex.key",
8330 java_libs: ["mylib"],
8331 bootclasspath_fragments: ["mybootclasspathfragment"],
8332 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8333 updatable: false,
8334 }
8335
8336 apex_key {
8337 name: "myapex.key",
8338 public_key: "testkey.avbpubkey",
8339 private_key: "testkey.pem",
8340 }
8341
8342 java_library {
8343 name: "mylib",
8344 srcs: ["mylib.java"],
8345 apex_available: ["myapex"],
8346 compile_dex: true,
8347 }
8348
8349 bootclasspath_fragment {
8350 name: "mybootclasspathfragment",
8351 contents: ["mybootclasspathlib"],
8352 apex_available: ["myapex"],
8353 }
8354
8355 java_library {
8356 name: "mybootclasspathlib",
8357 srcs: ["mybootclasspathlib.java"],
8358 apex_available: ["myapex"],
8359 compile_dex: true,
8360 }
8361
8362 systemserverclasspath_fragment {
8363 name: "mysystemserverclasspathfragment",
8364 contents: ["mysystemserverclasspathlib"],
8365 apex_available: ["myapex"],
8366 }
8367
8368 java_library {
8369 name: "mysystemserverclasspathlib",
8370 srcs: ["mysystemserverclasspathlib.java"],
8371 apex_available: ["myapex"],
8372 compile_dex: true,
8373 }
8374 `
8375
8376 result := android.GroupFixturePreparers(
8377 PrepareForTestWithApexBuildComponents,
8378 prepareForTestWithMyapex,
8379 java.PrepareForTestWithJavaDefaultModules,
8380 android.PrepareForTestWithAndroidBuildComponents,
8381 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008382 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8383 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008384 android.FixtureMergeEnv(map[string]string{
8385 "EMMA_INSTRUMENT": "true",
8386 }),
8387 ).RunTest(t)
8388
8389 // Make sure jacoco ran on both mylib and mybootclasspathlib
8390 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8391 t.Errorf("Failed to find jacoco rule for mylib")
8392 }
8393 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8394 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8395 }
8396 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8397 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8398 }
8399}
8400
Jiyong Park192600a2021-08-03 07:52:17 +00008401func TestProhibitStaticExecutable(t *testing.T) {
8402 testApexError(t, `executable mybin is static`, `
8403 apex {
8404 name: "myapex",
8405 key: "myapex.key",
8406 binaries: ["mybin"],
8407 min_sdk_version: "29",
8408 }
8409
8410 apex_key {
8411 name: "myapex.key",
8412 public_key: "testkey.avbpubkey",
8413 private_key: "testkey.pem",
8414 }
8415
8416 cc_binary {
8417 name: "mybin",
8418 srcs: ["mylib.cpp"],
8419 relative_install_path: "foo/bar",
8420 static_executable: true,
8421 system_shared_libs: [],
8422 stl: "none",
8423 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008424 min_sdk_version: "29",
8425 }
8426 `)
8427
8428 testApexError(t, `executable mybin.rust is static`, `
8429 apex {
8430 name: "myapex",
8431 key: "myapex.key",
8432 binaries: ["mybin.rust"],
8433 min_sdk_version: "29",
8434 }
8435
8436 apex_key {
8437 name: "myapex.key",
8438 public_key: "testkey.avbpubkey",
8439 private_key: "testkey.pem",
8440 }
8441
8442 rust_binary {
8443 name: "mybin.rust",
8444 srcs: ["foo.rs"],
8445 static_executable: true,
8446 apex_available: ["myapex"],
8447 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008448 }
8449 `)
8450}
8451
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008452func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8453 ctx := testApex(t, `
8454 apex {
8455 name: "myapex",
8456 key: "myapex.key",
8457 updatable: false,
8458 java_libs: ["foo"],
8459 }
8460
8461 apex_key {
8462 name: "myapex.key",
8463 public_key: "testkey.avbpubkey",
8464 private_key: "testkey.pem",
8465 }
8466
8467 java_library {
8468 name: "foo",
8469 srcs: ["foo.java"],
8470 apex_available: ["myapex"],
8471 installable: true,
8472 }
8473 `,
8474 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8475 )
8476
8477 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8478 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8479 var builder strings.Builder
8480 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8481 androidMk := builder.String()
8482 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")
8483}
8484
8485func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8486 ctx := testApex(t, `
8487 prebuilt_apex {
8488 name: "myapex",
8489 arch: {
8490 arm64: {
8491 src: "myapex-arm64.apex",
8492 },
8493 arm: {
8494 src: "myapex-arm.apex",
8495 },
8496 },
8497 exported_java_libs: ["foo"],
8498 }
8499
8500 java_import {
8501 name: "foo",
8502 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008503 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008504 }
8505 `,
8506 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8507 )
8508
8509 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8510 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8511 mainModuleEntries := entriesList[0]
8512 android.AssertArrayString(t,
8513 "LOCAL_REQUIRED_MODULES",
8514 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8515 []string{
8516 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8517 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8518 })
8519}
8520
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008521func TestAndroidMk_RequiredModules(t *testing.T) {
8522 ctx := testApex(t, `
8523 apex {
8524 name: "myapex",
8525 key: "myapex.key",
8526 updatable: false,
8527 java_libs: ["foo"],
8528 required: ["otherapex"],
8529 }
8530
8531 apex {
8532 name: "otherapex",
8533 key: "myapex.key",
8534 updatable: false,
8535 java_libs: ["foo"],
8536 required: ["otherapex"],
8537 }
8538
8539 apex_key {
8540 name: "myapex.key",
8541 public_key: "testkey.avbpubkey",
8542 private_key: "testkey.pem",
8543 }
8544
8545 java_library {
8546 name: "foo",
8547 srcs: ["foo.java"],
8548 apex_available: ["myapex", "otherapex"],
8549 installable: true,
8550 }
8551 `)
8552
8553 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8554 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8555 var builder strings.Builder
8556 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8557 androidMk := builder.String()
8558 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
8559}
8560
satayev758968a2021-12-06 11:42:40 +00008561func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
8562 preparer := android.GroupFixturePreparers(
8563 PrepareForTestWithApexBuildComponents,
8564 prepareForTestWithMyapex,
8565 java.PrepareForTestWithJavaSdkLibraryFiles,
8566 java.PrepareForTestWithJavaDefaultModules,
8567 android.PrepareForTestWithAndroidBuildComponents,
8568 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8569 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
8570 )
8571
8572 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
8573 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8574 preparer.RunTestWithBp(t, `
8575 apex {
8576 name: "myapex",
8577 key: "myapex.key",
8578 bootclasspath_fragments: ["mybootclasspathfragment"],
8579 min_sdk_version: "30",
8580 updatable: false,
8581 }
8582
8583 apex_key {
8584 name: "myapex.key",
8585 public_key: "testkey.avbpubkey",
8586 private_key: "testkey.pem",
8587 }
8588
8589 bootclasspath_fragment {
8590 name: "mybootclasspathfragment",
8591 contents: ["mybootclasspathlib"],
8592 apex_available: ["myapex"],
8593 }
8594
8595 java_sdk_library {
8596 name: "mybootclasspathlib",
8597 srcs: ["mybootclasspathlib.java"],
8598 apex_available: ["myapex"],
8599 compile_dex: true,
8600 unsafe_ignore_missing_latest_api: true,
8601 min_sdk_version: "31",
8602 static_libs: ["util"],
8603 }
8604
8605 java_library {
8606 name: "util",
8607 srcs: ["a.java"],
8608 apex_available: ["myapex"],
8609 min_sdk_version: "31",
8610 static_libs: ["another_util"],
8611 }
8612
8613 java_library {
8614 name: "another_util",
8615 srcs: ["a.java"],
8616 min_sdk_version: "31",
8617 apex_available: ["myapex"],
8618 }
8619 `)
8620 })
8621
8622 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
8623 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8624 preparer.RunTestWithBp(t, `
8625 apex {
8626 name: "myapex",
8627 key: "myapex.key",
8628 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8629 min_sdk_version: "30",
8630 updatable: false,
8631 }
8632
8633 apex_key {
8634 name: "myapex.key",
8635 public_key: "testkey.avbpubkey",
8636 private_key: "testkey.pem",
8637 }
8638
8639 systemserverclasspath_fragment {
8640 name: "mysystemserverclasspathfragment",
8641 contents: ["mysystemserverclasspathlib"],
8642 apex_available: ["myapex"],
8643 }
8644
8645 java_sdk_library {
8646 name: "mysystemserverclasspathlib",
8647 srcs: ["mysystemserverclasspathlib.java"],
8648 apex_available: ["myapex"],
8649 compile_dex: true,
8650 min_sdk_version: "32",
8651 unsafe_ignore_missing_latest_api: true,
8652 static_libs: ["util"],
8653 }
8654
8655 java_library {
8656 name: "util",
8657 srcs: ["a.java"],
8658 apex_available: ["myapex"],
8659 min_sdk_version: "31",
8660 static_libs: ["another_util"],
8661 }
8662
8663 java_library {
8664 name: "another_util",
8665 srcs: ["a.java"],
8666 min_sdk_version: "31",
8667 apex_available: ["myapex"],
8668 }
8669 `)
8670 })
8671
8672 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8673 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
8674 RunTestWithBp(t, `
8675 apex {
8676 name: "myapex",
8677 key: "myapex.key",
8678 bootclasspath_fragments: ["mybootclasspathfragment"],
8679 min_sdk_version: "30",
8680 updatable: false,
8681 }
8682
8683 apex_key {
8684 name: "myapex.key",
8685 public_key: "testkey.avbpubkey",
8686 private_key: "testkey.pem",
8687 }
8688
8689 bootclasspath_fragment {
8690 name: "mybootclasspathfragment",
8691 contents: ["mybootclasspathlib"],
8692 apex_available: ["myapex"],
8693 }
8694
8695 java_sdk_library {
8696 name: "mybootclasspathlib",
8697 srcs: ["mybootclasspathlib.java"],
8698 apex_available: ["myapex"],
8699 compile_dex: true,
8700 unsafe_ignore_missing_latest_api: true,
8701 }
8702 `)
8703 })
8704
8705 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8706 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
8707 RunTestWithBp(t, `
8708 apex {
8709 name: "myapex",
8710 key: "myapex.key",
8711 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8712 min_sdk_version: "30",
8713 updatable: false,
8714 }
8715
8716 apex_key {
8717 name: "myapex.key",
8718 public_key: "testkey.avbpubkey",
8719 private_key: "testkey.pem",
8720 }
8721
8722 systemserverclasspath_fragment {
8723 name: "mysystemserverclasspathfragment",
8724 contents: ["mysystemserverclasspathlib"],
8725 apex_available: ["myapex"],
8726 }
8727
8728 java_sdk_library {
8729 name: "mysystemserverclasspathlib",
8730 srcs: ["mysystemserverclasspathlib.java"],
8731 apex_available: ["myapex"],
8732 compile_dex: true,
8733 unsafe_ignore_missing_latest_api: true,
8734 }
8735 `)
8736 })
8737}
8738
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07008739func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01008740 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07008741}