blob: a50bfda045869bc62042dfcd2c5b5dd6bac4cf5a [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jiyong Park25fc6a92018-11-18 18:02:45 +090019 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Paul Duffin37856732021-02-26 14:24:15 +000021 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070022 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010023 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
29 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Paul Duffin40b62572021-03-20 11:39:01 +000051func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090052 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010053 android.GroupFixturePreparers(
54 prepareForApexTest,
55 android.GroupFixturePreparers(preparers...),
56 ).
Paul Duffine05480a2021-03-08 15:07:14 +000057 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000058 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090059}
60
Paul Duffin40b62572021-03-20 11:39:01 +000061func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090062 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010063
64 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000065 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010066 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000067 }
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 result := android.GroupFixturePreparers(
70 prepareForApexTest,
71 android.GroupFixturePreparers(preparers...),
72 optionalBpPreparer,
73 ).RunTest(t)
74
Paul Duffine05480a2021-03-08 15:07:14 +000075 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Paul Duffin810f33d2021-03-09 14:12:32 +000078func withFiles(files android.MockFS) android.FixturePreparer {
79 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090080}
81
Paul Duffin810f33d2021-03-09 14:12:32 +000082func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
83 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090084 for k, v := range targets {
85 config.Targets[k] = v
86 }
Paul Duffin810f33d2021-03-09 14:12:32 +000087 })
Jooyung Han344d5432019-08-23 11:17:39 +090088}
89
Jooyung Han35155c42020-02-06 17:33:20 +090090// withNativeBridgeTargets sets configuration with targets including:
91// - X86_64 (primary)
92// - X86 (secondary)
93// - Arm64 on X86_64 (native bridge)
94// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000095var withNativeBridgeEnabled = android.FixtureModifyConfig(
96 func(config android.Config) {
97 config.Targets[android.Android] = []android.Target{
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
106 }
107 },
108)
109
110func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
111 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
112 variables.ManifestPackageNameOverrides = specs
113 })
Jooyung Han35155c42020-02-06 17:33:20 +0900114}
115
Paul Duffin810f33d2021-03-09 14:12:32 +0000116var withBinder32bit = android.FixtureModifyProductVariables(
117 func(variables android.FixtureProductVariables) {
118 variables.Binder32bit = proptools.BoolPtr(true)
119 },
120)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900121
Paul Duffin810f33d2021-03-09 14:12:32 +0000122var withUnbundledBuild = android.FixtureModifyProductVariables(
123 func(variables android.FixtureProductVariables) {
124 variables.Unbundled_build = proptools.BoolPtr(true)
125 },
126)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900127
Paul Duffin284165a2021-03-29 01:50:31 +0100128// Legacy preparer used for running tests within the apex package.
129//
130// This includes everything that was needed to run any test in the apex package prior to the
131// introduction of the test fixtures. Tests that are being converted to use fixtures directly
132// rather than through the testApex...() methods should avoid using this and instead use the
133// various preparers directly, using android.GroupFixturePreparers(...) to group them when
134// necessary.
135//
136// deprecated
137var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000138 // General preparers in alphabetical order as test infrastructure will enforce correct
139 // registration order.
140 android.PrepareForTestWithAndroidBuildComponents,
141 bpf.PrepareForTestWithBpf,
142 cc.PrepareForTestWithCcBuildComponents,
143 java.PrepareForTestWithJavaDefaultModules,
144 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
145 rust.PrepareForTestWithRustDefaultModules,
146 sh.PrepareForTestWithShBuildComponents,
147
148 PrepareForTestWithApexBuildComponents,
149
150 // Additional apex test specific preparers.
151 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
152 filegroup {
153 name: "myapex-file_contexts",
154 srcs: [
155 "apex/myapex-file_contexts",
156 ],
157 }
158 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000159 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000160 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000161 "a.java": nil,
162 "PrebuiltAppFoo.apk": nil,
163 "PrebuiltAppFooPriv.apk": nil,
164 "apex_manifest.json": nil,
165 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000166 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
167 "system/sepolicy/apex/myapex2-file_contexts": nil,
168 "system/sepolicy/apex/otherapex-file_contexts": nil,
169 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
170 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
171 "mylib.cpp": nil,
172 "mytest.cpp": nil,
173 "mytest1.cpp": nil,
174 "mytest2.cpp": nil,
175 "mytest3.cpp": nil,
176 "myprebuilt": nil,
177 "my_include": nil,
178 "foo/bar/MyClass.java": nil,
179 "prebuilt.jar": nil,
180 "prebuilt.so": nil,
181 "vendor/foo/devkeys/test.x509.pem": nil,
182 "vendor/foo/devkeys/test.pk8": nil,
183 "testkey.x509.pem": nil,
184 "testkey.pk8": nil,
185 "testkey.override.x509.pem": nil,
186 "testkey.override.pk8": nil,
187 "vendor/foo/devkeys/testkey.avbpubkey": nil,
188 "vendor/foo/devkeys/testkey.pem": nil,
189 "NOTICE": nil,
190 "custom_notice": nil,
191 "custom_notice_for_static_lib": nil,
192 "testkey2.avbpubkey": nil,
193 "testkey2.pem": nil,
194 "myapex-arm64.apex": nil,
195 "myapex-arm.apex": nil,
196 "myapex.apks": nil,
197 "frameworks/base/api/current.txt": nil,
198 "framework/aidl/a.aidl": nil,
199 "build/make/core/proguard.flags": nil,
200 "build/make/core/proguard_basic_keeps.flags": nil,
201 "dummy.txt": nil,
202 "baz": nil,
203 "bar/baz": nil,
204 "testdata/baz": nil,
205 "AppSet.apks": nil,
206 "foo.rs": nil,
207 "libfoo.jar": nil,
208 "libbar.jar": nil,
209 },
210 ),
211
212 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
213 variables.DeviceVndkVersion = proptools.StringPtr("current")
214 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
215 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
216 variables.Platform_sdk_codename = proptools.StringPtr("Q")
217 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000218 // "Tiramisu" needs to be in the next line for compatibility with soong code,
219 // not because of these tests specifically (it's not used by the tests)
220 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900221 variables.Platform_vndk_version = proptools.StringPtr("29")
Paul Duffin37aad602021-03-08 09:47:16 +0000222 }),
223)
224
Paul Duffin52bfaa42021-03-23 23:40:12 +0000225var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
226 "system/sepolicy/apex/myapex-file_contexts": nil,
227})
228
Jooyung Han643adc42020-02-27 13:50:06 +0900229// ensure that 'result' equals 'expected'
230func ensureEquals(t *testing.T, result string, expected string) {
231 t.Helper()
232 if result != expected {
233 t.Errorf("%q != %q", expected, result)
234 }
235}
236
Jiyong Park25fc6a92018-11-18 18:02:45 +0900237// ensure that 'result' contains 'expected'
238func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900239 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900240 if !strings.Contains(result, expected) {
241 t.Errorf("%q is not found in %q", expected, result)
242 }
243}
244
Liz Kammer5bd365f2020-05-27 15:15:11 -0700245// ensure that 'result' contains 'expected' exactly one time
246func ensureContainsOnce(t *testing.T, result string, expected string) {
247 t.Helper()
248 count := strings.Count(result, expected)
249 if count != 1 {
250 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
251 }
252}
253
Jiyong Park25fc6a92018-11-18 18:02:45 +0900254// ensures that 'result' does not contain 'notExpected'
255func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900256 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900257 if strings.Contains(result, notExpected) {
258 t.Errorf("%q is found in %q", notExpected, result)
259 }
260}
261
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700262func ensureMatches(t *testing.T, result string, expectedRex string) {
263 ok, err := regexp.MatchString(expectedRex, result)
264 if err != nil {
265 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
266 return
267 }
268 if !ok {
269 t.Errorf("%s does not match regular expession %s", result, expectedRex)
270 }
271}
272
Jiyong Park25fc6a92018-11-18 18:02:45 +0900273func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900274 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900275 if !android.InList(expected, result) {
276 t.Errorf("%q is not found in %v", expected, result)
277 }
278}
279
280func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900281 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282 if android.InList(notExpected, result) {
283 t.Errorf("%q is found in %v", notExpected, result)
284 }
285}
286
Jooyung Hane1633032019-08-01 17:41:43 +0900287func ensureListEmpty(t *testing.T, result []string) {
288 t.Helper()
289 if len(result) > 0 {
290 t.Errorf("%q is expected to be empty", result)
291 }
292}
293
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000294func ensureListNotEmpty(t *testing.T, result []string) {
295 t.Helper()
296 if len(result) == 0 {
297 t.Errorf("%q is expected to be not empty", result)
298 }
299}
300
Jiyong Park25fc6a92018-11-18 18:02:45 +0900301// Minimal test
302func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800303 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900304 apex_defaults {
305 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900306 manifest: ":myapex.manifest",
307 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900308 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900309 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900310 native_shared_libs: [
311 "mylib",
312 "libfoo.ffi",
313 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900314 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800315 multilib: {
316 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900317 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800318 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900319 },
Jiyong Park77acec62020-06-01 21:39:15 +0900320 java_libs: [
321 "myjar",
322 "myjar_dex",
323 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000324 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325 }
326
Jiyong Park30ca9372019-02-07 16:27:23 +0900327 apex {
328 name: "myapex",
329 defaults: ["myapex-defaults"],
330 }
331
Jiyong Park25fc6a92018-11-18 18:02:45 +0900332 apex_key {
333 name: "myapex.key",
334 public_key: "testkey.avbpubkey",
335 private_key: "testkey.pem",
336 }
337
Jiyong Park809bb722019-02-13 21:33:49 +0900338 filegroup {
339 name: "myapex.manifest",
340 srcs: ["apex_manifest.json"],
341 }
342
343 filegroup {
344 name: "myapex.androidmanifest",
345 srcs: ["AndroidManifest.xml"],
346 }
347
Jiyong Park25fc6a92018-11-18 18:02:45 +0900348 cc_library {
349 name: "mylib",
350 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900351 shared_libs: [
352 "mylib2",
353 "libbar.ffi",
354 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 system_shared_libs: [],
356 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000357 // TODO: remove //apex_available:platform
358 apex_available: [
359 "//apex_available:platform",
360 "myapex",
361 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900362 }
363
Alex Light3d673592019-01-18 14:37:31 -0800364 cc_binary {
365 name: "foo",
366 srcs: ["mylib.cpp"],
367 compile_multilib: "both",
368 multilib: {
369 lib32: {
370 suffix: "32",
371 },
372 lib64: {
373 suffix: "64",
374 },
375 },
376 symlinks: ["foo_link_"],
377 symlink_preferred_arch: true,
378 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800379 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700380 apex_available: [ "myapex", "com.android.gki.*" ],
381 }
382
Jiyong Park99644e92020-11-17 22:21:02 +0900383 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000384 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900385 srcs: ["foo.rs"],
386 rlibs: ["libfoo.rlib.rust"],
387 dylibs: ["libfoo.dylib.rust"],
388 apex_available: ["myapex"],
389 }
390
391 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000392 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900393 srcs: ["foo.rs"],
394 crate_name: "foo",
395 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900396 shared_libs: ["libfoo.shared_from_rust"],
397 }
398
399 cc_library_shared {
400 name: "libfoo.shared_from_rust",
401 srcs: ["mylib.cpp"],
402 system_shared_libs: [],
403 stl: "none",
404 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900405 }
406
407 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000408 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900409 srcs: ["foo.rs"],
410 crate_name: "foo",
411 apex_available: ["myapex"],
412 }
413
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900414 rust_ffi_shared {
415 name: "libfoo.ffi",
416 srcs: ["foo.rs"],
417 crate_name: "foo",
418 apex_available: ["myapex"],
419 }
420
421 rust_ffi_shared {
422 name: "libbar.ffi",
423 srcs: ["foo.rs"],
424 crate_name: "bar",
425 apex_available: ["myapex"],
426 }
427
Yifan Hongd22a84a2020-07-28 17:37:46 -0700428 apex {
429 name: "com.android.gki.fake",
430 binaries: ["foo"],
431 key: "myapex.key",
432 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000433 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800434 }
435
Paul Duffindddd5462020-04-07 15:25:44 +0100436 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900437 name: "mylib2",
438 srcs: ["mylib.cpp"],
439 system_shared_libs: [],
440 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900441 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900442 static_libs: ["libstatic"],
443 // TODO: remove //apex_available:platform
444 apex_available: [
445 "//apex_available:platform",
446 "myapex",
447 ],
448 }
449
Paul Duffindddd5462020-04-07 15:25:44 +0100450 cc_prebuilt_library_shared {
451 name: "mylib2",
452 srcs: ["prebuilt.so"],
453 // TODO: remove //apex_available:platform
454 apex_available: [
455 "//apex_available:platform",
456 "myapex",
457 ],
458 }
459
Jiyong Park9918e1a2020-03-17 19:16:40 +0900460 cc_library_static {
461 name: "libstatic",
462 srcs: ["mylib.cpp"],
463 system_shared_libs: [],
464 stl: "none",
465 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000466 // TODO: remove //apex_available:platform
467 apex_available: [
468 "//apex_available:platform",
469 "myapex",
470 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900471 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900472
473 java_library {
474 name: "myjar",
475 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900476 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477 sdk_version: "none",
478 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900480 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000481 // TODO: remove //apex_available:platform
482 apex_available: [
483 "//apex_available:platform",
484 "myapex",
485 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900486 }
487
Jiyong Park77acec62020-06-01 21:39:15 +0900488 dex_import {
489 name: "myjar_dex",
490 jars: ["prebuilt.jar"],
491 apex_available: [
492 "//apex_available:platform",
493 "myapex",
494 ],
495 }
496
Jiyong Park7f7766d2019-07-25 22:02:35 +0900497 java_library {
498 name: "myotherjar",
499 srcs: ["foo/bar/MyClass.java"],
500 sdk_version: "none",
501 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900502 // TODO: remove //apex_available:platform
503 apex_available: [
504 "//apex_available:platform",
505 "myapex",
506 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900507 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900508
509 java_library {
510 name: "mysharedjar",
511 srcs: ["foo/bar/MyClass.java"],
512 sdk_version: "none",
513 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900514 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900515 `)
516
Paul Duffina71a67a2021-03-29 00:42:57 +0100517 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900518
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900519 // Make sure that Android.mk is created
520 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700521 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900522 var builder strings.Builder
523 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
524
525 androidMk := builder.String()
526 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
527 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
528
Jiyong Park42cca6c2019-04-01 11:15:50 +0900529 optFlags := apexRule.Args["opt_flags"]
530 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700531 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100532 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533
Jiyong Park25fc6a92018-11-18 18:02:45 +0900534 copyCmds := apexRule.Args["copy_commands"]
535
536 // Ensure that main rule creates an output
537 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
538
539 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700540 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
542 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900543 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900544 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900545
546 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700547 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
550 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900552 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900553
554 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800555 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
556 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900557 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900558 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900559 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900560 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
561 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900562 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900563 // .. but not for java libs
564 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900565 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800566
Colin Cross7113d202019-11-20 16:39:12 -0800567 // Ensure that the platform variant ends with _shared or _common
568 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
569 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900570 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
571 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900572 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
573
574 // Ensure that dynamic dependency to java libs are not included
575 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800576
577 // Ensure that all symlinks are present.
578 found_foo_link_64 := false
579 found_foo := false
580 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900581 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800582 if strings.HasSuffix(cmd, "bin/foo") {
583 found_foo = true
584 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
585 found_foo_link_64 = true
586 }
587 }
588 }
589 good := found_foo && found_foo_link_64
590 if !good {
591 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
592 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900593
Sundong Ahnabb64432019-10-22 13:58:29 +0900594 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700595 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900596 if len(noticeInputs) != 3 {
597 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900598 }
599 ensureListContains(t, noticeInputs, "NOTICE")
600 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900601 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900602
Artur Satayeva8bd1132020-04-27 18:07:06 +0100603 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
606 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
607 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100608
609 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100611 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
612 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
613 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800614}
615
Jooyung Hanf21c7972019-12-16 22:32:06 +0900616func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800617 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900618 apex_defaults {
619 name: "myapex-defaults",
620 key: "myapex.key",
621 prebuilts: ["myetc"],
622 native_shared_libs: ["mylib"],
623 java_libs: ["myjar"],
624 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900625 rros: ["rro"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800626 bpfs: ["bpf", "netd_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000627 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900628 }
629
630 prebuilt_etc {
631 name: "myetc",
632 src: "myprebuilt",
633 }
634
635 apex {
636 name: "myapex",
637 defaults: ["myapex-defaults"],
638 }
639
640 apex_key {
641 name: "myapex.key",
642 public_key: "testkey.avbpubkey",
643 private_key: "testkey.pem",
644 }
645
646 cc_library {
647 name: "mylib",
648 system_shared_libs: [],
649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000650 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900651 }
652
653 java_library {
654 name: "myjar",
655 srcs: ["foo/bar/MyClass.java"],
656 sdk_version: "none",
657 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000658 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900659 }
660
661 android_app {
662 name: "AppFoo",
663 srcs: ["foo/bar/MyClass.java"],
664 sdk_version: "none",
665 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000666 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900667 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900668
669 runtime_resource_overlay {
670 name: "rro",
671 theme: "blue",
672 }
673
markchien2f59ec92020-09-02 16:23:38 +0800674 bpf {
675 name: "bpf",
676 srcs: ["bpf.c", "bpf2.c"],
677 }
678
Ken Chenfad7f9d2021-11-10 22:02:57 +0800679 bpf {
680 name: "netd_test",
681 srcs: ["netd_test.c"],
682 sub_dir: "netd",
683 }
684
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000686 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900687 "etc/myetc",
688 "javalib/myjar.jar",
689 "lib64/mylib.so",
690 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900691 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800692 "etc/bpf/bpf.o",
693 "etc/bpf/bpf2.o",
Ken Chenfad7f9d2021-11-10 22:02:57 +0800694 "etc/bpf/netd/netd_test.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 })
696}
697
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800699 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900700 apex {
701 name: "myapex",
702 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000703 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900704 }
705
706 apex_key {
707 name: "myapex.key",
708 public_key: "testkey.avbpubkey",
709 private_key: "testkey.pem",
710 }
711 `)
712
713 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900714 args := module.Rule("apexRule").Args
715 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
716 t.Error("manifest should be apex_manifest.pb, but " + manifest)
717 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900718}
719
Liz Kammer4854a7d2021-05-27 14:28:27 -0400720func TestApexManifestMinSdkVersion(t *testing.T) {
721 ctx := testApex(t, `
722 apex_defaults {
723 name: "my_defaults",
724 key: "myapex.key",
725 product_specific: true,
726 file_contexts: ":my-file-contexts",
727 updatable: false,
728 }
729 apex {
730 name: "myapex_30",
731 min_sdk_version: "30",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_current",
737 min_sdk_version: "current",
738 defaults: ["my_defaults"],
739 }
740
741 apex {
742 name: "myapex_none",
743 defaults: ["my_defaults"],
744 }
745
746 apex_key {
747 name: "myapex.key",
748 public_key: "testkey.avbpubkey",
749 private_key: "testkey.pem",
750 }
751
752 filegroup {
753 name: "my-file-contexts",
754 srcs: ["product_specific_file_contexts"],
755 }
756 `, withFiles(map[string][]byte{
757 "product_specific_file_contexts": nil,
758 }), android.FixtureModifyProductVariables(
759 func(variables android.FixtureProductVariables) {
760 variables.Unbundled_build = proptools.BoolPtr(true)
761 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
762 }), android.FixtureMergeEnv(map[string]string{
763 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
764 }))
765
766 testCases := []struct {
767 module string
768 minSdkVersion string
769 }{
770 {
771 module: "myapex_30",
772 minSdkVersion: "30",
773 },
774 {
775 module: "myapex_current",
776 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
777 },
778 {
779 module: "myapex_none",
780 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
781 },
782 }
783 for _, tc := range testCases {
784 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
785 args := module.Rule("apexRule").Args
786 optFlags := args["opt_flags"]
787 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
788 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
789 }
790 }
791}
792
Alex Light5098a612018-11-29 17:12:15 -0800793func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800794 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800795 apex {
796 name: "myapex",
797 key: "myapex.key",
798 payload_type: "zip",
799 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000800 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800801 }
802
803 apex_key {
804 name: "myapex.key",
805 public_key: "testkey.avbpubkey",
806 private_key: "testkey.pem",
807 }
808
809 cc_library {
810 name: "mylib",
811 srcs: ["mylib.cpp"],
812 shared_libs: ["mylib2"],
813 system_shared_libs: [],
814 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000815 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800816 }
817
818 cc_library {
819 name: "mylib2",
820 srcs: ["mylib.cpp"],
821 system_shared_libs: [],
822 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000823 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800824 }
825 `)
826
Sundong Ahnabb64432019-10-22 13:58:29 +0900827 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800828 copyCmds := zipApexRule.Args["copy_commands"]
829
830 // Ensure that main rule creates an output
831 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
832
833 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700834 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800835
836 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700837 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800838
839 // Ensure that both direct and indirect deps are copied into apex
840 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
841 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900842}
843
844func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800845 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900846 apex {
847 name: "myapex",
848 key: "myapex.key",
849 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900850 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000851 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900852 }
853
854 apex_key {
855 name: "myapex.key",
856 public_key: "testkey.avbpubkey",
857 private_key: "testkey.pem",
858 }
859
860 cc_library {
861 name: "mylib",
862 srcs: ["mylib.cpp"],
863 shared_libs: ["mylib2", "mylib3"],
864 system_shared_libs: [],
865 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000866 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 }
868
869 cc_library {
870 name: "mylib2",
871 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900872 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873 system_shared_libs: [],
874 stl: "none",
875 stubs: {
876 versions: ["1", "2", "3"],
877 },
878 }
879
880 cc_library {
881 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900882 srcs: ["mylib.cpp"],
883 shared_libs: ["mylib4"],
884 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900885 stl: "none",
886 stubs: {
887 versions: ["10", "11", "12"],
888 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000889 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900890 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900891
892 cc_library {
893 name: "mylib4",
894 srcs: ["mylib.cpp"],
895 system_shared_libs: [],
896 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000897 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900898 }
Jiyong Park105dc322021-06-11 17:22:09 +0900899
900 rust_binary {
901 name: "foo.rust",
902 srcs: ["foo.rs"],
903 shared_libs: ["libfoo.shared_from_rust"],
904 prefer_rlib: true,
905 apex_available: ["myapex"],
906 }
907
908 cc_library_shared {
909 name: "libfoo.shared_from_rust",
910 srcs: ["mylib.cpp"],
911 system_shared_libs: [],
912 stl: "none",
913 stubs: {
914 versions: ["10", "11", "12"],
915 },
916 }
917
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918 `)
919
Sundong Ahnabb64432019-10-22 13:58:29 +0900920 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 copyCmds := apexRule.Args["copy_commands"]
922
923 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800924 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900925
926 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800927 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928
929 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800930 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931
Colin Crossaede88c2020-08-11 12:17:01 -0700932 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900933
934 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900935 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900937 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900938
939 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700940 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900941 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700942 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900943
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700944 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
945 // is replaced by sharing of "cFlags" in cc/builder.go.
946 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
947 // module variable representing "cflags". So it was not detected by ensureNotContains.
948 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
949 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
950 // including the original cflags's "-include mylib.h".
951 //
Jiyong Park64379952018-12-13 18:37:29 +0900952 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700953 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
954 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900955
956 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700957 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900958
Jooyung Hana57af4a2020-01-23 05:36:59 +0000959 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900960 "lib64/mylib.so",
961 "lib64/mylib3.so",
962 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900963 "bin/foo.rust",
964 "lib64/libc++.so", // by the implicit dependency from foo.rust
965 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900966 })
Jiyong Park105dc322021-06-11 17:22:09 +0900967
968 // Ensure that stub dependency from a rust module is not included
969 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
970 // The rust module is linked to the stub cc library
971 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
972 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
973 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900974
975 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
976 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900977}
978
Jiyong Park1bc84122021-06-22 20:23:05 +0900979func TestApexCanUsePrivateApis(t *testing.T) {
980 ctx := testApex(t, `
981 apex {
982 name: "myapex",
983 key: "myapex.key",
984 native_shared_libs: ["mylib"],
985 binaries: ["foo.rust"],
986 updatable: false,
987 platform_apis: true,
988 }
989
990 apex_key {
991 name: "myapex.key",
992 public_key: "testkey.avbpubkey",
993 private_key: "testkey.pem",
994 }
995
996 cc_library {
997 name: "mylib",
998 srcs: ["mylib.cpp"],
999 shared_libs: ["mylib2"],
1000 system_shared_libs: [],
1001 stl: "none",
1002 apex_available: [ "myapex" ],
1003 }
1004
1005 cc_library {
1006 name: "mylib2",
1007 srcs: ["mylib.cpp"],
1008 cflags: ["-include mylib.h"],
1009 system_shared_libs: [],
1010 stl: "none",
1011 stubs: {
1012 versions: ["1", "2", "3"],
1013 },
1014 }
1015
1016 rust_binary {
1017 name: "foo.rust",
1018 srcs: ["foo.rs"],
1019 shared_libs: ["libfoo.shared_from_rust"],
1020 prefer_rlib: true,
1021 apex_available: ["myapex"],
1022 }
1023
1024 cc_library_shared {
1025 name: "libfoo.shared_from_rust",
1026 srcs: ["mylib.cpp"],
1027 system_shared_libs: [],
1028 stl: "none",
1029 stubs: {
1030 versions: ["10", "11", "12"],
1031 },
1032 }
1033 `)
1034
1035 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1036 copyCmds := apexRule.Args["copy_commands"]
1037
1038 // Ensure that indirect stubs dep is not included
1039 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1040 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1041
1042 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1043 // of the platform_apis: true)
1044 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000_private").Rule("ld").Args["libFlags"]
1045 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1046 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1047 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000_private").Rule("rustc").Args["linkFlags"]
1048 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1049 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1050}
1051
Colin Cross7812fd32020-09-25 12:35:10 -07001052func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1053 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001054 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001055 apex {
1056 name: "myapex",
1057 key: "myapex.key",
1058 native_shared_libs: ["mylib", "mylib3"],
1059 min_sdk_version: "29",
1060 }
1061
1062 apex_key {
1063 name: "myapex.key",
1064 public_key: "testkey.avbpubkey",
1065 private_key: "testkey.pem",
1066 }
1067
1068 cc_library {
1069 name: "mylib",
1070 srcs: ["mylib.cpp"],
1071 shared_libs: ["mylib2", "mylib3"],
1072 system_shared_libs: [],
1073 stl: "none",
1074 apex_available: [ "myapex" ],
1075 min_sdk_version: "28",
1076 }
1077
1078 cc_library {
1079 name: "mylib2",
1080 srcs: ["mylib.cpp"],
1081 cflags: ["-include mylib.h"],
1082 system_shared_libs: [],
1083 stl: "none",
1084 stubs: {
1085 versions: ["28", "29", "30", "current"],
1086 },
1087 min_sdk_version: "28",
1088 }
1089
1090 cc_library {
1091 name: "mylib3",
1092 srcs: ["mylib.cpp"],
1093 shared_libs: ["mylib4"],
1094 system_shared_libs: [],
1095 stl: "none",
1096 stubs: {
1097 versions: ["28", "29", "30", "current"],
1098 },
1099 apex_available: [ "myapex" ],
1100 min_sdk_version: "28",
1101 }
1102
1103 cc_library {
1104 name: "mylib4",
1105 srcs: ["mylib.cpp"],
1106 system_shared_libs: [],
1107 stl: "none",
1108 apex_available: [ "myapex" ],
1109 min_sdk_version: "28",
1110 }
1111 `)
1112
1113 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1114 copyCmds := apexRule.Args["copy_commands"]
1115
1116 // Ensure that direct non-stubs dep is always included
1117 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1118
1119 // Ensure that indirect stubs dep is not included
1120 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1121
1122 // Ensure that direct stubs dep is included
1123 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1124
1125 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1126
Jiyong Park55549df2021-02-26 23:57:23 +09001127 // Ensure that mylib is linking with the latest version of stub for mylib2
1128 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001129 // ... and not linking to the non-stub (impl) variant of mylib2
1130 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1131
1132 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1133 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1134 // .. and not linking to the stubs variant of mylib3
1135 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1136
1137 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001138 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001139 ensureNotContains(t, mylib2Cflags, "-include ")
1140
1141 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -07001142 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -07001143
1144 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1145 "lib64/mylib.so",
1146 "lib64/mylib3.so",
1147 "lib64/mylib4.so",
1148 })
1149}
1150
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001151func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1152 t.Parallel()
1153 // myapex (Z)
1154 // mylib -----------------.
1155 // |
1156 // otherapex (29) |
1157 // libstub's versions: 29 Z current
1158 // |
1159 // <platform> |
1160 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001161 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001162 apex {
1163 name: "myapex",
1164 key: "myapex.key",
1165 native_shared_libs: ["mylib"],
1166 min_sdk_version: "Z", // non-final
1167 }
1168
1169 cc_library {
1170 name: "mylib",
1171 srcs: ["mylib.cpp"],
1172 shared_libs: ["libstub"],
1173 apex_available: ["myapex"],
1174 min_sdk_version: "Z",
1175 }
1176
1177 apex_key {
1178 name: "myapex.key",
1179 public_key: "testkey.avbpubkey",
1180 private_key: "testkey.pem",
1181 }
1182
1183 apex {
1184 name: "otherapex",
1185 key: "myapex.key",
1186 native_shared_libs: ["libstub"],
1187 min_sdk_version: "29",
1188 }
1189
1190 cc_library {
1191 name: "libstub",
1192 srcs: ["mylib.cpp"],
1193 stubs: {
1194 versions: ["29", "Z", "current"],
1195 },
1196 apex_available: ["otherapex"],
1197 min_sdk_version: "29",
1198 }
1199
1200 // platform module depending on libstub from otherapex should use the latest stub("current")
1201 cc_library {
1202 name: "libplatform",
1203 srcs: ["mylib.cpp"],
1204 shared_libs: ["libstub"],
1205 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001206 `,
1207 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1208 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1209 variables.Platform_sdk_final = proptools.BoolPtr(false)
1210 variables.Platform_version_active_codenames = []string{"Z"}
1211 }),
1212 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001213
Jiyong Park55549df2021-02-26 23:57:23 +09001214 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001215 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001216 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001217 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001218 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001219
1220 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1221 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1222 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1223 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1224 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1225}
1226
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001227func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001228 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001230 name: "myapex2",
1231 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001232 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001233 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234 }
1235
1236 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001237 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001238 public_key: "testkey.avbpubkey",
1239 private_key: "testkey.pem",
1240 }
1241
1242 cc_library {
1243 name: "mylib",
1244 srcs: ["mylib.cpp"],
1245 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001246 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001247 system_shared_libs: [],
1248 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001249 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001250 }
1251
1252 cc_library {
1253 name: "libfoo",
1254 srcs: ["mylib.cpp"],
1255 shared_libs: ["libbar"],
1256 system_shared_libs: [],
1257 stl: "none",
1258 stubs: {
1259 versions: ["10", "20", "30"],
1260 },
1261 }
1262
1263 cc_library {
1264 name: "libbar",
1265 srcs: ["mylib.cpp"],
1266 system_shared_libs: [],
1267 stl: "none",
1268 }
1269
Jiyong Park678c8812020-02-07 17:25:49 +09001270 cc_library_static {
1271 name: "libbaz",
1272 srcs: ["mylib.cpp"],
1273 system_shared_libs: [],
1274 stl: "none",
1275 apex_available: [ "myapex2" ],
1276 }
1277
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278 `)
1279
Jiyong Park83dc74b2020-01-14 18:38:44 +09001280 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001281 copyCmds := apexRule.Args["copy_commands"]
1282
1283 // Ensure that direct non-stubs dep is always included
1284 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1285
1286 // Ensure that indirect stubs dep is not included
1287 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1288
1289 // Ensure that dependency of stubs is not included
1290 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1291
Colin Crossaede88c2020-08-11 12:17:01 -07001292 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001293
1294 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001295 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001296 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001297 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001298
Jiyong Park3ff16992019-12-27 14:11:47 +09001299 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001300
1301 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1302 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001303
Artur Satayeva8bd1132020-04-27 18:07:06 +01001304 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001305 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001306
Artur Satayeva8bd1132020-04-27 18:07:06 +01001307 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001308 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001309}
1310
Jooyung Hand3639552019-08-09 12:57:43 +09001311func TestApexWithRuntimeLibsDependency(t *testing.T) {
1312 /*
1313 myapex
1314 |
1315 v (runtime_libs)
1316 mylib ------+------> libfoo [provides stub]
1317 |
1318 `------> libbar
1319 */
Colin Cross1c460562021-02-16 17:55:47 -08001320 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001321 apex {
1322 name: "myapex",
1323 key: "myapex.key",
1324 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001325 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001326 }
1327
1328 apex_key {
1329 name: "myapex.key",
1330 public_key: "testkey.avbpubkey",
1331 private_key: "testkey.pem",
1332 }
1333
1334 cc_library {
1335 name: "mylib",
1336 srcs: ["mylib.cpp"],
1337 runtime_libs: ["libfoo", "libbar"],
1338 system_shared_libs: [],
1339 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001340 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001341 }
1342
1343 cc_library {
1344 name: "libfoo",
1345 srcs: ["mylib.cpp"],
1346 system_shared_libs: [],
1347 stl: "none",
1348 stubs: {
1349 versions: ["10", "20", "30"],
1350 },
1351 }
1352
1353 cc_library {
1354 name: "libbar",
1355 srcs: ["mylib.cpp"],
1356 system_shared_libs: [],
1357 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001358 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001359 }
1360
1361 `)
1362
Sundong Ahnabb64432019-10-22 13:58:29 +09001363 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001364 copyCmds := apexRule.Args["copy_commands"]
1365
1366 // Ensure that direct non-stubs dep is always included
1367 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1368
1369 // Ensure that indirect stubs dep is not included
1370 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1371
1372 // Ensure that runtime_libs dep in included
1373 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1374
Sundong Ahnabb64432019-10-22 13:58:29 +09001375 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001376 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1377 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001378
1379}
1380
Paul Duffina02cae32021-03-09 01:44:06 +00001381var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1382 cc.PrepareForTestWithCcBuildComponents,
1383 PrepareForTestWithApexBuildComponents,
1384 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001385 apex {
1386 name: "com.android.runtime",
1387 key: "com.android.runtime.key",
1388 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001389 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001390 }
1391
1392 apex_key {
1393 name: "com.android.runtime.key",
1394 public_key: "testkey.avbpubkey",
1395 private_key: "testkey.pem",
1396 }
Paul Duffina02cae32021-03-09 01:44:06 +00001397 `),
1398 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1399)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001400
Paul Duffina02cae32021-03-09 01:44:06 +00001401func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001402 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001403 cc_library {
1404 name: "libc",
1405 no_libcrt: true,
1406 nocrt: true,
1407 stl: "none",
1408 system_shared_libs: [],
1409 stubs: { versions: ["1"] },
1410 apex_available: ["com.android.runtime"],
1411
1412 sanitize: {
1413 hwaddress: true,
1414 }
1415 }
1416
1417 cc_prebuilt_library_shared {
1418 name: "libclang_rt.hwasan-aarch64-android",
1419 no_libcrt: true,
1420 nocrt: true,
1421 stl: "none",
1422 system_shared_libs: [],
1423 srcs: [""],
1424 stubs: { versions: ["1"] },
1425
1426 sanitize: {
1427 never: true,
1428 },
Paul Duffina02cae32021-03-09 01:44:06 +00001429 } `)
1430 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001431
1432 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1433 "lib64/bionic/libc.so",
1434 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1435 })
1436
1437 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1438
1439 installed := hwasan.Description("install libclang_rt.hwasan")
1440 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1441
1442 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1443 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1444 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1445}
1446
1447func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001448 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001449 prepareForTestOfRuntimeApexWithHwasan,
1450 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1451 variables.SanitizeDevice = []string{"hwaddress"}
1452 }),
1453 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001454 cc_library {
1455 name: "libc",
1456 no_libcrt: true,
1457 nocrt: true,
1458 stl: "none",
1459 system_shared_libs: [],
1460 stubs: { versions: ["1"] },
1461 apex_available: ["com.android.runtime"],
1462 }
1463
1464 cc_prebuilt_library_shared {
1465 name: "libclang_rt.hwasan-aarch64-android",
1466 no_libcrt: true,
1467 nocrt: true,
1468 stl: "none",
1469 system_shared_libs: [],
1470 srcs: [""],
1471 stubs: { versions: ["1"] },
1472
1473 sanitize: {
1474 never: true,
1475 },
1476 }
Paul Duffina02cae32021-03-09 01:44:06 +00001477 `)
1478 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001479
1480 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1481 "lib64/bionic/libc.so",
1482 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1483 })
1484
1485 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1486
1487 installed := hwasan.Description("install libclang_rt.hwasan")
1488 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1489
1490 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1491 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1492 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1493}
1494
Jooyung Han61b66e92020-03-21 14:21:46 +00001495func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1496 testcases := []struct {
1497 name string
1498 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001499 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001500 shouldLink string
1501 shouldNotLink []string
1502 }{
1503 {
Jiyong Park55549df2021-02-26 23:57:23 +09001504 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001505 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001506 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001507 shouldLink: "current",
1508 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001509 },
1510 {
Jiyong Park55549df2021-02-26 23:57:23 +09001511 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001512 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001513 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001514 shouldLink: "current",
1515 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001516 },
1517 }
1518 for _, tc := range testcases {
1519 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001520 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001521 apex {
1522 name: "myapex",
1523 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001524 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001525 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001526 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001527 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001528
Jooyung Han61b66e92020-03-21 14:21:46 +00001529 apex_key {
1530 name: "myapex.key",
1531 public_key: "testkey.avbpubkey",
1532 private_key: "testkey.pem",
1533 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001534
Jooyung Han61b66e92020-03-21 14:21:46 +00001535 cc_library {
1536 name: "mylib",
1537 srcs: ["mylib.cpp"],
1538 vendor_available: true,
1539 shared_libs: ["libbar"],
1540 system_shared_libs: [],
1541 stl: "none",
1542 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001543 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001545
Jooyung Han61b66e92020-03-21 14:21:46 +00001546 cc_library {
1547 name: "libbar",
1548 srcs: ["mylib.cpp"],
1549 system_shared_libs: [],
1550 stl: "none",
1551 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001552 llndk: {
1553 symbol_file: "libbar.map.txt",
1554 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001555 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001556 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001557 withUnbundledBuild,
1558 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001559
Jooyung Han61b66e92020-03-21 14:21:46 +00001560 // Ensure that LLNDK dep is not included
1561 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1562 "lib64/mylib.so",
1563 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001564
Jooyung Han61b66e92020-03-21 14:21:46 +00001565 // Ensure that LLNDK dep is required
1566 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1567 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1568 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001569
Steven Moreland2c4000c2021-04-27 02:08:49 +00001570 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1571 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001573 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001574 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001575
Steven Moreland2c4000c2021-04-27 02:08:49 +00001576 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001577 ver := tc.shouldLink
1578 if tc.shouldLink == "current" {
1579 ver = strconv.Itoa(android.FutureApiLevelInt)
1580 }
1581 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001582 })
1583 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001584}
1585
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001587 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001588 apex {
1589 name: "myapex",
1590 key: "myapex.key",
1591 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001592 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001593 }
1594
1595 apex_key {
1596 name: "myapex.key",
1597 public_key: "testkey.avbpubkey",
1598 private_key: "testkey.pem",
1599 }
1600
1601 cc_library {
1602 name: "mylib",
1603 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001604 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001605 shared_libs: ["libdl#27"],
1606 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001607 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001608 }
1609
1610 cc_library_shared {
1611 name: "mylib_shared",
1612 srcs: ["mylib.cpp"],
1613 shared_libs: ["libdl#27"],
1614 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001615 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001616 }
1617
1618 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001619 name: "libBootstrap",
1620 srcs: ["mylib.cpp"],
1621 stl: "none",
1622 bootstrap: true,
1623 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001624 `)
1625
Sundong Ahnabb64432019-10-22 13:58:29 +09001626 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001627 copyCmds := apexRule.Args["copy_commands"]
1628
1629 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001630 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001631 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1632 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001633
1634 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001635 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001636
Colin Crossaede88c2020-08-11 12:17:01 -07001637 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1638 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1639 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001640
1641 // For dependency to libc
1642 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001643 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001645 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001646 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001647 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1648 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001649
1650 // For dependency to libm
1651 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001652 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001653 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001654 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001655 // ... and is not compiling with the stub
1656 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1657 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1658
1659 // For dependency to libdl
1660 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001661 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001662 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001663 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1664 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001665 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001666 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001667 // ... Cflags from stub is correctly exported to mylib
1668 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1669 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001670
1671 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001672 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1673 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1674 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1675 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001676}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001677
Jooyung Han749dc692020-04-15 11:03:39 +09001678func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001679 // there are three links between liba --> libz.
1680 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001681 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001682 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001683 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001684 apex {
1685 name: "myapex",
1686 key: "myapex.key",
1687 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001688 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001689 }
1690
1691 apex {
1692 name: "otherapex",
1693 key: "myapex.key",
1694 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001695 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001696 }
1697
1698 apex_key {
1699 name: "myapex.key",
1700 public_key: "testkey.avbpubkey",
1701 private_key: "testkey.pem",
1702 }
1703
1704 cc_library {
1705 name: "libx",
1706 shared_libs: ["liba"],
1707 system_shared_libs: [],
1708 stl: "none",
1709 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001710 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001711 }
1712
1713 cc_library {
1714 name: "liby",
1715 shared_libs: ["liba"],
1716 system_shared_libs: [],
1717 stl: "none",
1718 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001719 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001720 }
1721
1722 cc_library {
1723 name: "liba",
1724 shared_libs: ["libz"],
1725 system_shared_libs: [],
1726 stl: "none",
1727 apex_available: [
1728 "//apex_available:anyapex",
1729 "//apex_available:platform",
1730 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001731 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001732 }
1733
1734 cc_library {
1735 name: "libz",
1736 system_shared_libs: [],
1737 stl: "none",
1738 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001739 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001740 },
1741 }
Jooyung Han749dc692020-04-15 11:03:39 +09001742 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001743
1744 expectLink := func(from, from_variant, to, to_variant string) {
1745 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1746 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1747 }
1748 expectNoLink := func(from, from_variant, to, to_variant string) {
1749 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1750 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1751 }
1752 // platform liba is linked to non-stub version
1753 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001754 // liba in myapex is linked to current
1755 expectLink("liba", "shared_apex29", "libz", "shared_current")
1756 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001757 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001758 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001759 // liba in otherapex is linked to current
1760 expectLink("liba", "shared_apex30", "libz", "shared_current")
1761 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001762 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1763 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001764}
1765
Jooyung Hanaed150d2020-04-02 01:41:41 +09001766func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001767 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001768 apex {
1769 name: "myapex",
1770 key: "myapex.key",
1771 native_shared_libs: ["libx"],
1772 min_sdk_version: "R",
1773 }
1774
1775 apex_key {
1776 name: "myapex.key",
1777 public_key: "testkey.avbpubkey",
1778 private_key: "testkey.pem",
1779 }
1780
1781 cc_library {
1782 name: "libx",
1783 shared_libs: ["libz"],
1784 system_shared_libs: [],
1785 stl: "none",
1786 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001787 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001788 }
1789
1790 cc_library {
1791 name: "libz",
1792 system_shared_libs: [],
1793 stl: "none",
1794 stubs: {
1795 versions: ["29", "R"],
1796 },
1797 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001798 `,
1799 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1800 variables.Platform_version_active_codenames = []string{"R"}
1801 }),
1802 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001803
1804 expectLink := func(from, from_variant, to, to_variant string) {
1805 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1806 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1807 }
1808 expectNoLink := func(from, from_variant, to, to_variant string) {
1809 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1810 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1811 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001812 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1813 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001814 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1815 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001816}
1817
Jooyung Han4c4da062021-06-23 10:23:16 +09001818func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1819 testApex(t, `
1820 apex {
1821 name: "myapex",
1822 key: "myapex.key",
1823 java_libs: ["libx"],
1824 min_sdk_version: "S",
1825 }
1826
1827 apex_key {
1828 name: "myapex.key",
1829 public_key: "testkey.avbpubkey",
1830 private_key: "testkey.pem",
1831 }
1832
1833 java_library {
1834 name: "libx",
1835 srcs: ["a.java"],
1836 apex_available: [ "myapex" ],
1837 sdk_version: "current",
1838 min_sdk_version: "S", // should be okay
1839 }
1840 `,
1841 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1842 variables.Platform_version_active_codenames = []string{"S"}
1843 variables.Platform_sdk_codename = proptools.StringPtr("S")
1844 }),
1845 )
1846}
1847
Jooyung Han749dc692020-04-15 11:03:39 +09001848func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001849 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001850 apex {
1851 name: "myapex",
1852 key: "myapex.key",
1853 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001854 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001855 }
1856
1857 apex_key {
1858 name: "myapex.key",
1859 public_key: "testkey.avbpubkey",
1860 private_key: "testkey.pem",
1861 }
1862
1863 cc_library {
1864 name: "libx",
1865 shared_libs: ["libz"],
1866 system_shared_libs: [],
1867 stl: "none",
1868 apex_available: [ "myapex" ],
1869 }
1870
1871 cc_library {
1872 name: "libz",
1873 system_shared_libs: [],
1874 stl: "none",
1875 stubs: {
1876 versions: ["1", "2"],
1877 },
1878 }
1879 `)
1880
1881 expectLink := func(from, from_variant, to, to_variant string) {
1882 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1883 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1884 }
1885 expectNoLink := func(from, from_variant, to, to_variant string) {
1886 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1887 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1888 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001889 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001890 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001891 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001892 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001893}
1894
Jiyong Park5df7bd32021-08-25 16:18:46 +09001895func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1896 ctx := testApex(t, `
1897 apex {
1898 name: "myapex",
1899 key: "myapex.key",
1900 native_shared_libs: ["mylib"],
1901 updatable: false,
1902 vendor: true,
1903 min_sdk_version: "29",
1904 }
1905
1906 apex_key {
1907 name: "myapex.key",
1908 public_key: "testkey.avbpubkey",
1909 private_key: "testkey.pem",
1910 }
1911
1912 cc_library {
1913 name: "mylib",
1914 vendor_available: true,
1915 system_shared_libs: [],
1916 stl: "none",
1917 apex_available: [ "myapex" ],
1918 min_sdk_version: "29",
1919 }
1920 `)
1921
1922 vendorVariant := "android_vendor.29_arm64_armv8-a"
1923
1924 // First check that the correct variant of crtbegin_so is used.
1925 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1926 crtBegin := names(ldRule.Args["crtBegin"])
1927 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1928
1929 // Ensure that the crtbegin_so used by the APEX is targeting 29
1930 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1931 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1932}
1933
Jooyung Han03b51852020-02-26 22:45:42 +09001934func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001935 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001936 apex {
1937 name: "myapex",
1938 key: "myapex.key",
1939 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001940 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001941 }
1942
1943 apex_key {
1944 name: "myapex.key",
1945 public_key: "testkey.avbpubkey",
1946 private_key: "testkey.pem",
1947 }
1948
1949 cc_library {
1950 name: "libx",
1951 system_shared_libs: [],
1952 stl: "none",
1953 apex_available: [ "myapex" ],
1954 stubs: {
1955 versions: ["1", "2"],
1956 },
1957 }
1958
1959 cc_library {
1960 name: "libz",
1961 shared_libs: ["libx"],
1962 system_shared_libs: [],
1963 stl: "none",
1964 }
1965 `)
1966
1967 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001968 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001969 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1970 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1971 }
1972 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001973 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001974 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1975 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1976 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001977 expectLink("libz", "shared", "libx", "shared_current")
1978 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001979 expectNoLink("libz", "shared", "libz", "shared_1")
1980 expectNoLink("libz", "shared", "libz", "shared")
1981}
1982
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001983var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1984 func(variables android.FixtureProductVariables) {
1985 variables.SanitizeDevice = []string{"hwaddress"}
1986 },
1987)
1988
Jooyung Han75568392020-03-20 04:29:24 +09001989func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001990 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001991 apex {
1992 name: "myapex",
1993 key: "myapex.key",
1994 native_shared_libs: ["libx"],
1995 min_sdk_version: "29",
1996 }
1997
1998 apex_key {
1999 name: "myapex.key",
2000 public_key: "testkey.avbpubkey",
2001 private_key: "testkey.pem",
2002 }
2003
2004 cc_library {
2005 name: "libx",
2006 shared_libs: ["libbar"],
2007 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002008 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002009 }
2010
2011 cc_library {
2012 name: "libbar",
2013 stubs: {
2014 versions: ["29", "30"],
2015 },
2016 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002017 `,
2018 prepareForTestWithSantitizeHwaddress,
2019 )
Jooyung Han03b51852020-02-26 22:45:42 +09002020 expectLink := func(from, from_variant, to, to_variant string) {
2021 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2022 libFlags := ld.Args["libFlags"]
2023 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2024 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002025 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002026}
2027
Jooyung Han75568392020-03-20 04:29:24 +09002028func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002029 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002030 apex {
2031 name: "myapex",
2032 key: "myapex.key",
2033 native_shared_libs: ["libx"],
2034 min_sdk_version: "29",
2035 }
2036
2037 apex_key {
2038 name: "myapex.key",
2039 public_key: "testkey.avbpubkey",
2040 private_key: "testkey.pem",
2041 }
2042
2043 cc_library {
2044 name: "libx",
2045 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002046 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002047 }
Jooyung Han75568392020-03-20 04:29:24 +09002048 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002049
2050 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002051 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002052 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002053 // note that platform variant is not.
2054 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002055 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002056}
2057
Jooyung Han749dc692020-04-15 11:03:39 +09002058func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2059 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002060 apex {
2061 name: "myapex",
2062 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002063 native_shared_libs: ["mylib"],
2064 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002065 }
2066
2067 apex_key {
2068 name: "myapex.key",
2069 public_key: "testkey.avbpubkey",
2070 private_key: "testkey.pem",
2071 }
Jooyung Han749dc692020-04-15 11:03:39 +09002072
2073 cc_library {
2074 name: "mylib",
2075 srcs: ["mylib.cpp"],
2076 system_shared_libs: [],
2077 stl: "none",
2078 apex_available: [
2079 "myapex",
2080 ],
2081 min_sdk_version: "30",
2082 }
2083 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002084
2085 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2086 apex {
2087 name: "myapex",
2088 key: "myapex.key",
2089 native_shared_libs: ["libfoo.ffi"],
2090 min_sdk_version: "29",
2091 }
2092
2093 apex_key {
2094 name: "myapex.key",
2095 public_key: "testkey.avbpubkey",
2096 private_key: "testkey.pem",
2097 }
2098
2099 rust_ffi_shared {
2100 name: "libfoo.ffi",
2101 srcs: ["foo.rs"],
2102 crate_name: "foo",
2103 apex_available: [
2104 "myapex",
2105 ],
2106 min_sdk_version: "30",
2107 }
2108 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002109
2110 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2111 apex {
2112 name: "myapex",
2113 key: "myapex.key",
2114 java_libs: ["libfoo"],
2115 min_sdk_version: "29",
2116 }
2117
2118 apex_key {
2119 name: "myapex.key",
2120 public_key: "testkey.avbpubkey",
2121 private_key: "testkey.pem",
2122 }
2123
2124 java_import {
2125 name: "libfoo",
2126 jars: ["libfoo.jar"],
2127 apex_available: [
2128 "myapex",
2129 ],
2130 min_sdk_version: "30",
2131 }
2132 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002133}
2134
2135func TestApexMinSdkVersion_Okay(t *testing.T) {
2136 testApex(t, `
2137 apex {
2138 name: "myapex",
2139 key: "myapex.key",
2140 native_shared_libs: ["libfoo"],
2141 java_libs: ["libbar"],
2142 min_sdk_version: "29",
2143 }
2144
2145 apex_key {
2146 name: "myapex.key",
2147 public_key: "testkey.avbpubkey",
2148 private_key: "testkey.pem",
2149 }
2150
2151 cc_library {
2152 name: "libfoo",
2153 srcs: ["mylib.cpp"],
2154 shared_libs: ["libfoo_dep"],
2155 apex_available: ["myapex"],
2156 min_sdk_version: "29",
2157 }
2158
2159 cc_library {
2160 name: "libfoo_dep",
2161 srcs: ["mylib.cpp"],
2162 apex_available: ["myapex"],
2163 min_sdk_version: "29",
2164 }
2165
2166 java_library {
2167 name: "libbar",
2168 sdk_version: "current",
2169 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002170 static_libs: [
2171 "libbar_dep",
2172 "libbar_import_dep",
2173 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002174 apex_available: ["myapex"],
2175 min_sdk_version: "29",
2176 }
2177
2178 java_library {
2179 name: "libbar_dep",
2180 sdk_version: "current",
2181 srcs: ["a.java"],
2182 apex_available: ["myapex"],
2183 min_sdk_version: "29",
2184 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002185
2186 java_import {
2187 name: "libbar_import_dep",
2188 jars: ["libbar.jar"],
2189 apex_available: ["myapex"],
2190 min_sdk_version: "29",
2191 }
Jooyung Han03b51852020-02-26 22:45:42 +09002192 `)
2193}
2194
Artur Satayev8cf899a2020-04-15 17:29:42 +01002195func TestJavaStableSdkVersion(t *testing.T) {
2196 testCases := []struct {
2197 name string
2198 expectedError string
2199 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002200 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002201 }{
2202 {
2203 name: "Non-updatable apex with non-stable dep",
2204 bp: `
2205 apex {
2206 name: "myapex",
2207 java_libs: ["myjar"],
2208 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002209 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002210 }
2211 apex_key {
2212 name: "myapex.key",
2213 public_key: "testkey.avbpubkey",
2214 private_key: "testkey.pem",
2215 }
2216 java_library {
2217 name: "myjar",
2218 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002219 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002220 apex_available: ["myapex"],
2221 }
2222 `,
2223 },
2224 {
2225 name: "Updatable apex with stable dep",
2226 bp: `
2227 apex {
2228 name: "myapex",
2229 java_libs: ["myjar"],
2230 key: "myapex.key",
2231 updatable: true,
2232 min_sdk_version: "29",
2233 }
2234 apex_key {
2235 name: "myapex.key",
2236 public_key: "testkey.avbpubkey",
2237 private_key: "testkey.pem",
2238 }
2239 java_library {
2240 name: "myjar",
2241 srcs: ["foo/bar/MyClass.java"],
2242 sdk_version: "current",
2243 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002244 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002245 }
2246 `,
2247 },
2248 {
2249 name: "Updatable apex with non-stable dep",
2250 expectedError: "cannot depend on \"myjar\"",
2251 bp: `
2252 apex {
2253 name: "myapex",
2254 java_libs: ["myjar"],
2255 key: "myapex.key",
2256 updatable: true,
2257 }
2258 apex_key {
2259 name: "myapex.key",
2260 public_key: "testkey.avbpubkey",
2261 private_key: "testkey.pem",
2262 }
2263 java_library {
2264 name: "myjar",
2265 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002266 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002267 apex_available: ["myapex"],
2268 }
2269 `,
2270 },
2271 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002272 name: "Updatable apex with non-stable legacy core platform dep",
2273 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2274 bp: `
2275 apex {
2276 name: "myapex",
2277 java_libs: ["myjar-uses-legacy"],
2278 key: "myapex.key",
2279 updatable: true,
2280 }
2281 apex_key {
2282 name: "myapex.key",
2283 public_key: "testkey.avbpubkey",
2284 private_key: "testkey.pem",
2285 }
2286 java_library {
2287 name: "myjar-uses-legacy",
2288 srcs: ["foo/bar/MyClass.java"],
2289 sdk_version: "core_platform",
2290 apex_available: ["myapex"],
2291 }
2292 `,
2293 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2294 },
2295 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002296 name: "Updatable apex with non-stable transitive dep",
2297 // This is not actually detecting that the transitive dependency is unstable, rather it is
2298 // detecting that the transitive dependency is building against a wider API surface than the
2299 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002300 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002301 bp: `
2302 apex {
2303 name: "myapex",
2304 java_libs: ["myjar"],
2305 key: "myapex.key",
2306 updatable: true,
2307 }
2308 apex_key {
2309 name: "myapex.key",
2310 public_key: "testkey.avbpubkey",
2311 private_key: "testkey.pem",
2312 }
2313 java_library {
2314 name: "myjar",
2315 srcs: ["foo/bar/MyClass.java"],
2316 sdk_version: "current",
2317 apex_available: ["myapex"],
2318 static_libs: ["transitive-jar"],
2319 }
2320 java_library {
2321 name: "transitive-jar",
2322 srcs: ["foo/bar/MyClass.java"],
2323 sdk_version: "core_platform",
2324 apex_available: ["myapex"],
2325 }
2326 `,
2327 },
2328 }
2329
2330 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002331 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2332 continue
2333 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002334 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002335 errorHandler := android.FixtureExpectsNoErrors
2336 if test.expectedError != "" {
2337 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002338 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002339 android.GroupFixturePreparers(
2340 java.PrepareForTestWithJavaDefaultModules,
2341 PrepareForTestWithApexBuildComponents,
2342 prepareForTestWithMyapex,
2343 android.OptionalFixturePreparer(test.preparer),
2344 ).
2345 ExtendWithErrorHandler(errorHandler).
2346 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002347 })
2348 }
2349}
2350
Jooyung Han749dc692020-04-15 11:03:39 +09002351func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2352 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2353 apex {
2354 name: "myapex",
2355 key: "myapex.key",
2356 native_shared_libs: ["mylib"],
2357 min_sdk_version: "29",
2358 }
2359
2360 apex_key {
2361 name: "myapex.key",
2362 public_key: "testkey.avbpubkey",
2363 private_key: "testkey.pem",
2364 }
2365
2366 cc_library {
2367 name: "mylib",
2368 srcs: ["mylib.cpp"],
2369 shared_libs: ["mylib2"],
2370 system_shared_libs: [],
2371 stl: "none",
2372 apex_available: [
2373 "myapex",
2374 ],
2375 min_sdk_version: "29",
2376 }
2377
2378 // indirect part of the apex
2379 cc_library {
2380 name: "mylib2",
2381 srcs: ["mylib.cpp"],
2382 system_shared_libs: [],
2383 stl: "none",
2384 apex_available: [
2385 "myapex",
2386 ],
2387 min_sdk_version: "30",
2388 }
2389 `)
2390}
2391
2392func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2393 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2394 apex {
2395 name: "myapex",
2396 key: "myapex.key",
2397 apps: ["AppFoo"],
2398 min_sdk_version: "29",
2399 }
2400
2401 apex_key {
2402 name: "myapex.key",
2403 public_key: "testkey.avbpubkey",
2404 private_key: "testkey.pem",
2405 }
2406
2407 android_app {
2408 name: "AppFoo",
2409 srcs: ["foo/bar/MyClass.java"],
2410 sdk_version: "current",
2411 min_sdk_version: "29",
2412 system_modules: "none",
2413 stl: "none",
2414 static_libs: ["bar"],
2415 apex_available: [ "myapex" ],
2416 }
2417
2418 java_library {
2419 name: "bar",
2420 sdk_version: "current",
2421 srcs: ["a.java"],
2422 apex_available: [ "myapex" ],
2423 }
2424 `)
2425}
2426
2427func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002428 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002429 apex {
2430 name: "myapex",
2431 key: "myapex.key",
2432 native_shared_libs: ["mylib"],
2433 min_sdk_version: "29",
2434 }
2435
2436 apex_key {
2437 name: "myapex.key",
2438 public_key: "testkey.avbpubkey",
2439 private_key: "testkey.pem",
2440 }
2441
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002442 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002443 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2444 cc_library {
2445 name: "mylib",
2446 srcs: ["mylib.cpp"],
2447 shared_libs: ["mylib2"],
2448 system_shared_libs: [],
2449 stl: "none",
2450 apex_available: ["myapex", "otherapex"],
2451 min_sdk_version: "29",
2452 }
2453
2454 cc_library {
2455 name: "mylib2",
2456 srcs: ["mylib.cpp"],
2457 system_shared_libs: [],
2458 stl: "none",
2459 apex_available: ["otherapex"],
2460 stubs: { versions: ["29", "30"] },
2461 min_sdk_version: "30",
2462 }
2463
2464 apex {
2465 name: "otherapex",
2466 key: "myapex.key",
2467 native_shared_libs: ["mylib", "mylib2"],
2468 min_sdk_version: "30",
2469 }
2470 `)
2471 expectLink := func(from, from_variant, to, to_variant string) {
2472 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2473 libFlags := ld.Args["libFlags"]
2474 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2475 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002476 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002477 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002478}
2479
Jooyung Haned124c32021-01-26 11:43:46 +09002480func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002481 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2482 func(variables android.FixtureProductVariables) {
2483 variables.Platform_sdk_codename = proptools.StringPtr("S")
2484 variables.Platform_version_active_codenames = []string{"S"}
2485 },
2486 )
Jooyung Haned124c32021-01-26 11:43:46 +09002487 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2488 apex {
2489 name: "myapex",
2490 key: "myapex.key",
2491 native_shared_libs: ["libfoo"],
2492 min_sdk_version: "S",
2493 }
2494 apex_key {
2495 name: "myapex.key",
2496 public_key: "testkey.avbpubkey",
2497 private_key: "testkey.pem",
2498 }
2499 cc_library {
2500 name: "libfoo",
2501 shared_libs: ["libbar"],
2502 apex_available: ["myapex"],
2503 min_sdk_version: "29",
2504 }
2505 cc_library {
2506 name: "libbar",
2507 apex_available: ["myapex"],
2508 }
2509 `, withSAsActiveCodeNames)
2510}
2511
2512func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002513 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2514 variables.Platform_sdk_codename = proptools.StringPtr("S")
2515 variables.Platform_version_active_codenames = []string{"S", "T"}
2516 })
Colin Cross1c460562021-02-16 17:55:47 -08002517 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002518 apex {
2519 name: "myapex",
2520 key: "myapex.key",
2521 native_shared_libs: ["libfoo"],
2522 min_sdk_version: "S",
2523 }
2524 apex_key {
2525 name: "myapex.key",
2526 public_key: "testkey.avbpubkey",
2527 private_key: "testkey.pem",
2528 }
2529 cc_library {
2530 name: "libfoo",
2531 shared_libs: ["libbar"],
2532 apex_available: ["myapex"],
2533 min_sdk_version: "S",
2534 }
2535 cc_library {
2536 name: "libbar",
2537 stubs: {
2538 symbol_file: "libbar.map.txt",
2539 versions: ["30", "S", "T"],
2540 },
2541 }
2542 `, withSAsActiveCodeNames)
2543
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002544 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002545 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2546 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002547 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002548}
2549
Jiyong Park7c2ee712018-12-07 00:42:25 +09002550func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002551 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002552 apex {
2553 name: "myapex",
2554 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002555 native_shared_libs: ["mylib"],
2556 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002557 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002558 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002559 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002560 }
2561
2562 apex_key {
2563 name: "myapex.key",
2564 public_key: "testkey.avbpubkey",
2565 private_key: "testkey.pem",
2566 }
2567
2568 prebuilt_etc {
2569 name: "myetc",
2570 src: "myprebuilt",
2571 sub_dir: "foo/bar",
2572 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002573
2574 cc_library {
2575 name: "mylib",
2576 srcs: ["mylib.cpp"],
2577 relative_install_path: "foo/bar",
2578 system_shared_libs: [],
2579 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002580 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002581 }
2582
2583 cc_binary {
2584 name: "mybin",
2585 srcs: ["mylib.cpp"],
2586 relative_install_path: "foo/bar",
2587 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002588 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002589 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002590 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002591 `)
2592
Sundong Ahnabb64432019-10-22 13:58:29 +09002593 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002594 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002595
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002596 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002597 ensureContains(t, cmd, "/etc ")
2598 ensureContains(t, cmd, "/etc/foo ")
2599 ensureContains(t, cmd, "/etc/foo/bar ")
2600 ensureContains(t, cmd, "/lib64 ")
2601 ensureContains(t, cmd, "/lib64/foo ")
2602 ensureContains(t, cmd, "/lib64/foo/bar ")
2603 ensureContains(t, cmd, "/lib ")
2604 ensureContains(t, cmd, "/lib/foo ")
2605 ensureContains(t, cmd, "/lib/foo/bar ")
2606 ensureContains(t, cmd, "/bin ")
2607 ensureContains(t, cmd, "/bin/foo ")
2608 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002609}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002610
Jooyung Han35155c42020-02-06 17:33:20 +09002611func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002612 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002613 apex {
2614 name: "myapex",
2615 key: "myapex.key",
2616 multilib: {
2617 both: {
2618 native_shared_libs: ["mylib"],
2619 binaries: ["mybin"],
2620 },
2621 },
2622 compile_multilib: "both",
2623 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002624 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002625 }
2626
2627 apex_key {
2628 name: "myapex.key",
2629 public_key: "testkey.avbpubkey",
2630 private_key: "testkey.pem",
2631 }
2632
2633 cc_library {
2634 name: "mylib",
2635 relative_install_path: "foo/bar",
2636 system_shared_libs: [],
2637 stl: "none",
2638 apex_available: [ "myapex" ],
2639 native_bridge_supported: true,
2640 }
2641
2642 cc_binary {
2643 name: "mybin",
2644 relative_install_path: "foo/bar",
2645 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002646 stl: "none",
2647 apex_available: [ "myapex" ],
2648 native_bridge_supported: true,
2649 compile_multilib: "both", // default is "first" for binary
2650 multilib: {
2651 lib64: {
2652 suffix: "64",
2653 },
2654 },
2655 }
2656 `, withNativeBridgeEnabled)
2657 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2658 "bin/foo/bar/mybin",
2659 "bin/foo/bar/mybin64",
2660 "bin/arm/foo/bar/mybin",
2661 "bin/arm64/foo/bar/mybin64",
2662 "lib/foo/bar/mylib.so",
2663 "lib/arm/foo/bar/mylib.so",
2664 "lib64/foo/bar/mylib.so",
2665 "lib64/arm64/foo/bar/mylib.so",
2666 })
2667}
2668
Jooyung Han85d61762020-06-24 23:50:26 +09002669func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002670 result := android.GroupFixturePreparers(
2671 prepareForApexTest,
2672 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2673 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002674 apex {
2675 name: "myapex",
2676 key: "myapex.key",
2677 binaries: ["mybin"],
2678 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002679 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002680 }
2681 apex_key {
2682 name: "myapex.key",
2683 public_key: "testkey.avbpubkey",
2684 private_key: "testkey.pem",
2685 }
2686 cc_binary {
2687 name: "mybin",
2688 vendor: true,
2689 shared_libs: ["libfoo"],
2690 }
2691 cc_library {
2692 name: "libfoo",
2693 proprietary: true,
2694 }
2695 `)
2696
Colin Crossc68db4b2021-11-11 18:59:15 -08002697 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002698 "bin/mybin",
2699 "lib64/libfoo.so",
2700 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2701 "lib64/libc++.so",
2702 })
2703
Colin Crossc68db4b2021-11-11 18:59:15 -08002704 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2705 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002706 name := apexBundle.BaseModuleName()
2707 prefix := "TARGET_"
2708 var builder strings.Builder
2709 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002710 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002711 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002712 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002713
Colin Crossc68db4b2021-11-11 18:59:15 -08002714 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002715 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2716 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002717}
2718
Jooyung Hanc5a96762022-02-04 11:54:50 +09002719func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2720 testApexError(t, `Trying to include a VNDK library`, `
2721 apex {
2722 name: "myapex",
2723 key: "myapex.key",
2724 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2725 vendor: true,
2726 use_vndk_as_stable: true,
2727 updatable: false,
2728 }
2729 apex_key {
2730 name: "myapex.key",
2731 public_key: "testkey.avbpubkey",
2732 private_key: "testkey.pem",
2733 }`)
2734}
2735
Jooyung Handf78e212020-07-22 15:54:47 +09002736func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002737 // myapex myapex2
2738 // | |
2739 // mybin ------. mybin2
2740 // \ \ / |
2741 // (stable) .---\--------` |
2742 // \ / \ |
2743 // \ / \ /
2744 // libvndk libvendor
2745 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002746 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002747 apex {
2748 name: "myapex",
2749 key: "myapex.key",
2750 binaries: ["mybin"],
2751 vendor: true,
2752 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002753 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002754 }
2755 apex_key {
2756 name: "myapex.key",
2757 public_key: "testkey.avbpubkey",
2758 private_key: "testkey.pem",
2759 }
2760 cc_binary {
2761 name: "mybin",
2762 vendor: true,
2763 shared_libs: ["libvndk", "libvendor"],
2764 }
2765 cc_library {
2766 name: "libvndk",
2767 vndk: {
2768 enabled: true,
2769 },
2770 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002771 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002772 }
2773 cc_library {
2774 name: "libvendor",
2775 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002776 stl: "none",
2777 }
2778 apex {
2779 name: "myapex2",
2780 key: "myapex.key",
2781 binaries: ["mybin2"],
2782 vendor: true,
2783 use_vndk_as_stable: false,
2784 updatable: false,
2785 }
2786 cc_binary {
2787 name: "mybin2",
2788 vendor: true,
2789 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002790 }
2791 `)
2792
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002793 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002794
Jooyung Han91f92032022-02-04 12:36:33 +09002795 for _, tc := range []struct {
2796 name string
2797 apexName string
2798 moduleName string
2799 moduleVariant string
2800 libs []string
2801 contents []string
2802 requireVndkNamespace bool
2803 }{
2804 {
2805 name: "use_vndk_as_stable",
2806 apexName: "myapex",
2807 moduleName: "mybin",
2808 moduleVariant: vendorVariant + "_apex10000",
2809 libs: []string{
2810 // should link with vendor variants of VNDK libs(libvndk/libc++)
2811 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2812 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2813 // unstable Vendor libs as APEX variant
2814 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2815 },
2816 contents: []string{
2817 "bin/mybin",
2818 "lib64/libvendor.so",
2819 // VNDK libs (libvndk/libc++) are not included
2820 },
2821 requireVndkNamespace: true,
2822 },
2823 {
2824 name: "!use_vndk_as_stable",
2825 apexName: "myapex2",
2826 moduleName: "mybin2",
2827 moduleVariant: vendorVariant + "_myapex2",
2828 libs: []string{
2829 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2830 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2831 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2832 // unstable vendor libs have "merged" APEX variants
2833 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2834 },
2835 contents: []string{
2836 "bin/mybin2",
2837 "lib64/libvendor.so",
2838 // VNDK libs are included as well
2839 "lib64/libvndk.so",
2840 "lib64/libc++.so",
2841 },
2842 requireVndkNamespace: false,
2843 },
2844 } {
2845 t.Run(tc.name, func(t *testing.T) {
2846 // Check linked libs
2847 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2848 libs := names(ldRule.Args["libFlags"])
2849 for _, lib := range tc.libs {
2850 ensureListContains(t, libs, lib)
2851 }
2852 // Check apex contents
2853 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002854
Jooyung Han91f92032022-02-04 12:36:33 +09002855 // Check "requireNativeLibs"
2856 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2857 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2858 if tc.requireVndkNamespace {
2859 ensureListContains(t, requireNativeLibs, ":vndk")
2860 } else {
2861 ensureListNotContains(t, requireNativeLibs, ":vndk")
2862 }
2863 })
2864 }
Jooyung Handf78e212020-07-22 15:54:47 +09002865}
2866
Justin Yun13decfb2021-03-08 19:25:55 +09002867func TestProductVariant(t *testing.T) {
2868 ctx := testApex(t, `
2869 apex {
2870 name: "myapex",
2871 key: "myapex.key",
2872 updatable: false,
2873 product_specific: true,
2874 binaries: ["foo"],
2875 }
2876
2877 apex_key {
2878 name: "myapex.key",
2879 public_key: "testkey.avbpubkey",
2880 private_key: "testkey.pem",
2881 }
2882
2883 cc_binary {
2884 name: "foo",
2885 product_available: true,
2886 apex_available: ["myapex"],
2887 srcs: ["foo.cpp"],
2888 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002889 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2890 variables.ProductVndkVersion = proptools.StringPtr("current")
2891 }),
2892 )
Justin Yun13decfb2021-03-08 19:25:55 +09002893
2894 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002895 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002896 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2897 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2898 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2899 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2900}
2901
Jooyung Han8e5685d2020-09-21 11:02:57 +09002902func TestApex_withPrebuiltFirmware(t *testing.T) {
2903 testCases := []struct {
2904 name string
2905 additionalProp string
2906 }{
2907 {"system apex with prebuilt_firmware", ""},
2908 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2909 }
2910 for _, tc := range testCases {
2911 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002912 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002913 apex {
2914 name: "myapex",
2915 key: "myapex.key",
2916 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002917 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002918 `+tc.additionalProp+`
2919 }
2920 apex_key {
2921 name: "myapex.key",
2922 public_key: "testkey.avbpubkey",
2923 private_key: "testkey.pem",
2924 }
2925 prebuilt_firmware {
2926 name: "myfirmware",
2927 src: "myfirmware.bin",
2928 filename_from_src: true,
2929 `+tc.additionalProp+`
2930 }
2931 `)
2932 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2933 "etc/firmware/myfirmware.bin",
2934 })
2935 })
2936 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002937}
2938
Jooyung Hanefb184e2020-06-25 17:14:25 +09002939func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002940 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002941 apex {
2942 name: "myapex",
2943 key: "myapex.key",
2944 vendor: true,
2945 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002946 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002947 }
2948
2949 apex_key {
2950 name: "myapex.key",
2951 public_key: "testkey.avbpubkey",
2952 private_key: "testkey.pem",
2953 }
2954
2955 cc_library {
2956 name: "mylib",
2957 vendor_available: true,
2958 }
2959 `)
2960
2961 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002962 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002963 name := apexBundle.BaseModuleName()
2964 prefix := "TARGET_"
2965 var builder strings.Builder
2966 data.Custom(&builder, name, prefix, "", data)
2967 androidMk := builder.String()
2968 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2969}
2970
Jooyung Han2ed99d02020-06-24 23:26:26 +09002971func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002972 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002973 apex {
2974 name: "myapex",
2975 key: "myapex.key",
2976 vintf_fragments: ["fragment.xml"],
2977 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002978 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002979 }
2980 apex_key {
2981 name: "myapex.key",
2982 public_key: "testkey.avbpubkey",
2983 private_key: "testkey.pem",
2984 }
2985 cc_binary {
2986 name: "mybin",
2987 }
2988 `)
2989
2990 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002991 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002992 name := apexBundle.BaseModuleName()
2993 prefix := "TARGET_"
2994 var builder strings.Builder
2995 data.Custom(&builder, name, prefix, "", data)
2996 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002997 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002998 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002999}
3000
Jiyong Park16e91a02018-12-20 18:18:08 +09003001func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003002 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003003 apex {
3004 name: "myapex",
3005 key: "myapex.key",
3006 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003007 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003008 }
3009
3010 apex_key {
3011 name: "myapex.key",
3012 public_key: "testkey.avbpubkey",
3013 private_key: "testkey.pem",
3014 }
3015
3016 cc_library {
3017 name: "mylib",
3018 srcs: ["mylib.cpp"],
3019 system_shared_libs: [],
3020 stl: "none",
3021 stubs: {
3022 versions: ["1", "2", "3"],
3023 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003024 apex_available: [
3025 "//apex_available:platform",
3026 "myapex",
3027 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003028 }
3029
3030 cc_binary {
3031 name: "not_in_apex",
3032 srcs: ["mylib.cpp"],
3033 static_libs: ["mylib"],
3034 static_executable: true,
3035 system_shared_libs: [],
3036 stl: "none",
3037 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003038 `)
3039
Colin Cross7113d202019-11-20 16:39:12 -08003040 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003041
3042 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003043 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003044}
Jiyong Park9335a262018-12-24 11:31:58 +09003045
3046func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003047 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003048 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003049 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003050 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003051 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003052 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003053 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003054 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003055 }
3056
3057 cc_library {
3058 name: "mylib",
3059 srcs: ["mylib.cpp"],
3060 system_shared_libs: [],
3061 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003062 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003063 }
3064
3065 apex_key {
3066 name: "myapex.key",
3067 public_key: "testkey.avbpubkey",
3068 private_key: "testkey.pem",
3069 }
3070
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003071 android_app_certificate {
3072 name: "myapex.certificate",
3073 certificate: "testkey",
3074 }
3075
3076 android_app_certificate {
3077 name: "myapex.certificate.override",
3078 certificate: "testkey.override",
3079 }
3080
Jiyong Park9335a262018-12-24 11:31:58 +09003081 `)
3082
3083 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003084 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003085
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003086 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3087 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003088 "vendor/foo/devkeys/testkey.avbpubkey")
3089 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003090 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3091 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003092 "vendor/foo/devkeys/testkey.pem")
3093 }
3094
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003095 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003096 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003097 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003098 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003099 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003100 }
3101}
Jiyong Park58e364a2019-01-19 19:24:06 +09003102
Jooyung Hanf121a652019-12-17 14:30:11 +09003103func TestCertificate(t *testing.T) {
3104 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003105 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003106 apex {
3107 name: "myapex",
3108 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003109 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003110 }
3111 apex_key {
3112 name: "myapex.key",
3113 public_key: "testkey.avbpubkey",
3114 private_key: "testkey.pem",
3115 }`)
3116 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3117 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3118 if actual := rule.Args["certificates"]; actual != expected {
3119 t.Errorf("certificates should be %q, not %q", expected, actual)
3120 }
3121 })
3122 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003123 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003124 apex {
3125 name: "myapex_keytest",
3126 key: "myapex.key",
3127 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003128 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003129 }
3130 apex_key {
3131 name: "myapex.key",
3132 public_key: "testkey.avbpubkey",
3133 private_key: "testkey.pem",
3134 }
3135 android_app_certificate {
3136 name: "myapex.certificate.override",
3137 certificate: "testkey.override",
3138 }`)
3139 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3140 expected := "testkey.override.x509.pem testkey.override.pk8"
3141 if actual := rule.Args["certificates"]; actual != expected {
3142 t.Errorf("certificates should be %q, not %q", expected, actual)
3143 }
3144 })
3145 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003146 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003147 apex {
3148 name: "myapex",
3149 key: "myapex.key",
3150 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003151 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003152 }
3153 apex_key {
3154 name: "myapex.key",
3155 public_key: "testkey.avbpubkey",
3156 private_key: "testkey.pem",
3157 }
3158 android_app_certificate {
3159 name: "myapex.certificate",
3160 certificate: "testkey",
3161 }`)
3162 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3163 expected := "testkey.x509.pem testkey.pk8"
3164 if actual := rule.Args["certificates"]; actual != expected {
3165 t.Errorf("certificates should be %q, not %q", expected, actual)
3166 }
3167 })
3168 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003169 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003170 apex {
3171 name: "myapex_keytest",
3172 key: "myapex.key",
3173 file_contexts: ":myapex-file_contexts",
3174 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003175 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003176 }
3177 apex_key {
3178 name: "myapex.key",
3179 public_key: "testkey.avbpubkey",
3180 private_key: "testkey.pem",
3181 }
3182 android_app_certificate {
3183 name: "myapex.certificate.override",
3184 certificate: "testkey.override",
3185 }`)
3186 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3187 expected := "testkey.override.x509.pem testkey.override.pk8"
3188 if actual := rule.Args["certificates"]; actual != expected {
3189 t.Errorf("certificates should be %q, not %q", expected, actual)
3190 }
3191 })
3192 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003193 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003194 apex {
3195 name: "myapex",
3196 key: "myapex.key",
3197 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003198 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003199 }
3200 apex_key {
3201 name: "myapex.key",
3202 public_key: "testkey.avbpubkey",
3203 private_key: "testkey.pem",
3204 }`)
3205 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3206 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3207 if actual := rule.Args["certificates"]; actual != expected {
3208 t.Errorf("certificates should be %q, not %q", expected, actual)
3209 }
3210 })
3211 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003212 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003213 apex {
3214 name: "myapex_keytest",
3215 key: "myapex.key",
3216 file_contexts: ":myapex-file_contexts",
3217 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003218 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003219 }
3220 apex_key {
3221 name: "myapex.key",
3222 public_key: "testkey.avbpubkey",
3223 private_key: "testkey.pem",
3224 }
3225 android_app_certificate {
3226 name: "myapex.certificate.override",
3227 certificate: "testkey.override",
3228 }`)
3229 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3230 expected := "testkey.override.x509.pem testkey.override.pk8"
3231 if actual := rule.Args["certificates"]; actual != expected {
3232 t.Errorf("certificates should be %q, not %q", expected, actual)
3233 }
3234 })
3235}
3236
Jiyong Park58e364a2019-01-19 19:24:06 +09003237func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003238 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003239 apex {
3240 name: "myapex",
3241 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003242 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003243 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003244 }
3245
3246 apex {
3247 name: "otherapex",
3248 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003249 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003250 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003251 }
3252
3253 apex_key {
3254 name: "myapex.key",
3255 public_key: "testkey.avbpubkey",
3256 private_key: "testkey.pem",
3257 }
3258
3259 cc_library {
3260 name: "mylib",
3261 srcs: ["mylib.cpp"],
3262 system_shared_libs: [],
3263 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003264 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003265 "myapex",
3266 "otherapex",
3267 ],
Jooyung Han24282772020-03-21 23:20:55 +09003268 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003269 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003270 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003271 cc_library {
3272 name: "mylib2",
3273 srcs: ["mylib.cpp"],
3274 system_shared_libs: [],
3275 stl: "none",
3276 apex_available: [
3277 "myapex",
3278 "otherapex",
3279 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003280 static_libs: ["mylib3"],
3281 recovery_available: true,
3282 min_sdk_version: "29",
3283 }
3284 cc_library {
3285 name: "mylib3",
3286 srcs: ["mylib.cpp"],
3287 system_shared_libs: [],
3288 stl: "none",
3289 apex_available: [
3290 "myapex",
3291 "otherapex",
3292 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003293 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003294 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003295 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003296 `)
3297
Jooyung Hanc87a0592020-03-02 17:44:33 +09003298 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003299 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003300 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003301 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003302
Jooyung Hanccce2f22020-03-07 03:45:53 +09003303 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003304 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003305 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003306 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003307
Jooyung Hanccce2f22020-03-07 03:45:53 +09003308 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003309 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003310 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003311 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003312
Colin Crossaede88c2020-08-11 12:17:01 -07003313 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3314 // each variant defines additional macros to distinguish which apex variant it is built for
3315
3316 // non-APEX variant does not have __ANDROID_APEX__ defined
3317 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3318 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3319
Dan Albertb19953d2020-11-17 15:29:36 -08003320 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003321 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3322 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003323 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003324
Jooyung Hanc87a0592020-03-02 17:44:33 +09003325 // non-APEX variant does not have __ANDROID_APEX__ defined
3326 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3327 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3328
Dan Albertb19953d2020-11-17 15:29:36 -08003329 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003330 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003331 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003332 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003333}
Jiyong Park7e636d02019-01-28 16:16:54 +09003334
3335func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003336 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003337 apex {
3338 name: "myapex",
3339 key: "myapex.key",
3340 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003341 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003342 }
3343
3344 apex_key {
3345 name: "myapex.key",
3346 public_key: "testkey.avbpubkey",
3347 private_key: "testkey.pem",
3348 }
3349
3350 cc_library_headers {
3351 name: "mylib_headers",
3352 export_include_dirs: ["my_include"],
3353 system_shared_libs: [],
3354 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003355 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003356 }
3357
3358 cc_library {
3359 name: "mylib",
3360 srcs: ["mylib.cpp"],
3361 system_shared_libs: [],
3362 stl: "none",
3363 header_libs: ["mylib_headers"],
3364 export_header_lib_headers: ["mylib_headers"],
3365 stubs: {
3366 versions: ["1", "2", "3"],
3367 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003368 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003369 }
3370
3371 cc_library {
3372 name: "otherlib",
3373 srcs: ["mylib.cpp"],
3374 system_shared_libs: [],
3375 stl: "none",
3376 shared_libs: ["mylib"],
3377 }
3378 `)
3379
Colin Cross7113d202019-11-20 16:39:12 -08003380 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003381
3382 // Ensure that the include path of the header lib is exported to 'otherlib'
3383 ensureContains(t, cFlags, "-Imy_include")
3384}
Alex Light9670d332019-01-29 18:07:33 -08003385
Jiyong Park7cd10e32020-01-14 09:22:18 +09003386type fileInApex struct {
3387 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003388 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003389 isLink bool
3390}
3391
Jooyung Hana57af4a2020-01-23 05:36:59 +00003392func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003393 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003394 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003395 copyCmds := apexRule.Args["copy_commands"]
3396 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003397 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003398 for _, cmd := range strings.Split(copyCmds, "&&") {
3399 cmd = strings.TrimSpace(cmd)
3400 if cmd == "" {
3401 continue
3402 }
3403 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003404 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003405 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003406 switch terms[0] {
3407 case "mkdir":
3408 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003409 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003410 t.Fatal("copyCmds contains invalid cp command", cmd)
3411 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003412 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003413 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003414 isLink = false
3415 case "ln":
3416 if len(terms) != 3 && len(terms) != 4 {
3417 // ln LINK TARGET or ln -s LINK TARGET
3418 t.Fatal("copyCmds contains invalid ln command", cmd)
3419 }
3420 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003421 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003422 isLink = true
3423 default:
3424 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3425 }
3426 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003427 index := strings.Index(dst, imageApexDir)
3428 if index == -1 {
3429 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3430 }
3431 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003432 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003433 }
3434 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003435 return ret
3436}
3437
Jooyung Hana57af4a2020-01-23 05:36:59 +00003438func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3439 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003440 var failed bool
3441 var surplus []string
3442 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003443 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003444 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003445 for _, expected := range files {
3446 if matched, _ := path.Match(expected, file.path); matched {
3447 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003448 mactchFound = true
3449 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003450 }
3451 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003452 if !mactchFound {
3453 surplus = append(surplus, file.path)
3454 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003455 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003456
Jooyung Han31c470b2019-10-18 16:26:59 +09003457 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003458 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003459 t.Log("surplus files", surplus)
3460 failed = true
3461 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003462
3463 if len(files) > len(filesMatched) {
3464 var missing []string
3465 for _, expected := range files {
3466 if !filesMatched[expected] {
3467 missing = append(missing, expected)
3468 }
3469 }
3470 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003471 t.Log("missing files", missing)
3472 failed = true
3473 }
3474 if failed {
3475 t.Fail()
3476 }
3477}
3478
Jooyung Han344d5432019-08-23 11:17:39 +09003479func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003480 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003481 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003482 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003483 "etc/llndk.libraries.29.txt",
3484 "etc/vndkcore.libraries.29.txt",
3485 "etc/vndksp.libraries.29.txt",
3486 "etc/vndkprivate.libraries.29.txt",
3487 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003488 }
3489 testCases := []struct {
3490 vndkVersion string
3491 expectedFiles []string
3492 }{
3493 {
3494 vndkVersion: "current",
3495 expectedFiles: append(commonFiles,
3496 "lib/libvndk.so",
3497 "lib/libvndksp.so",
3498 "lib64/libvndk.so",
3499 "lib64/libvndksp.so"),
3500 },
3501 {
3502 vndkVersion: "",
3503 expectedFiles: append(commonFiles,
3504 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3505 "lib/libvndksp.so",
3506 "lib64/libvndksp.so"),
3507 },
3508 }
3509 for _, tc := range testCases {
3510 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3511 ctx := testApex(t, `
3512 apex_vndk {
3513 name: "com.android.vndk.current",
3514 key: "com.android.vndk.current.key",
3515 updatable: false,
3516 }
3517
3518 apex_key {
3519 name: "com.android.vndk.current.key",
3520 public_key: "testkey.avbpubkey",
3521 private_key: "testkey.pem",
3522 }
3523
3524 cc_library {
3525 name: "libvndk",
3526 srcs: ["mylib.cpp"],
3527 vendor_available: true,
3528 product_available: true,
3529 vndk: {
3530 enabled: true,
3531 },
3532 system_shared_libs: [],
3533 stl: "none",
3534 apex_available: [ "com.android.vndk.current" ],
3535 }
3536
3537 cc_library {
3538 name: "libvndksp",
3539 srcs: ["mylib.cpp"],
3540 vendor_available: true,
3541 product_available: true,
3542 vndk: {
3543 enabled: true,
3544 support_system_process: true,
3545 },
3546 system_shared_libs: [],
3547 stl: "none",
3548 apex_available: [ "com.android.vndk.current" ],
3549 }
3550
3551 // VNDK-Ext should not cause any problems
3552
3553 cc_library {
3554 name: "libvndk.ext",
3555 srcs: ["mylib2.cpp"],
3556 vendor: true,
3557 vndk: {
3558 enabled: true,
3559 extends: "libvndk",
3560 },
3561 system_shared_libs: [],
3562 stl: "none",
3563 }
3564
3565 cc_library {
3566 name: "libvndksp.ext",
3567 srcs: ["mylib2.cpp"],
3568 vendor: true,
3569 vndk: {
3570 enabled: true,
3571 support_system_process: true,
3572 extends: "libvndksp",
3573 },
3574 system_shared_libs: [],
3575 stl: "none",
3576 }
3577 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3578 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3579 }))
3580 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3581 })
3582 }
Jooyung Han344d5432019-08-23 11:17:39 +09003583}
3584
3585func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003586 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003587 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003588 name: "com.android.vndk.current",
3589 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003590 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003591 }
3592
3593 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003594 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003595 public_key: "testkey.avbpubkey",
3596 private_key: "testkey.pem",
3597 }
3598
3599 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003600 name: "libvndk",
3601 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003602 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 },
3607 system_shared_libs: [],
3608 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003609 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003610 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003611
3612 cc_prebuilt_library_shared {
3613 name: "libvndk.arm",
3614 srcs: ["libvndk.arm.so"],
3615 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003616 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003617 vndk: {
3618 enabled: true,
3619 },
3620 enabled: false,
3621 arch: {
3622 arm: {
3623 enabled: true,
3624 },
3625 },
3626 system_shared_libs: [],
3627 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003628 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003629 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003630 `+vndkLibrariesTxtFiles("current"),
3631 withFiles(map[string][]byte{
3632 "libvndk.so": nil,
3633 "libvndk.arm.so": nil,
3634 }))
Colin Cross2807f002021-03-02 10:15:29 -08003635 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003636 "lib/libvndk.so",
3637 "lib/libvndk.arm.so",
3638 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003639 "lib/libc++.so",
3640 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003641 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003642 })
Jooyung Han344d5432019-08-23 11:17:39 +09003643}
3644
Jooyung Han39edb6c2019-11-06 16:53:07 +09003645func vndkLibrariesTxtFiles(vers ...string) (result string) {
3646 for _, v := range vers {
3647 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003648 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003649 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003650 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003651 name: "` + txt + `.libraries.txt",
3652 }
3653 `
3654 }
3655 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003656 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003657 result += `
3658 prebuilt_etc {
3659 name: "` + txt + `.libraries.` + v + `.txt",
3660 src: "dummy.txt",
3661 }
3662 `
3663 }
3664 }
3665 }
3666 return
3667}
3668
Jooyung Han344d5432019-08-23 11:17:39 +09003669func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003670 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003671 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003672 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003673 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003674 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003675 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003676 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003677 }
3678
3679 apex_key {
3680 name: "myapex.key",
3681 public_key: "testkey.avbpubkey",
3682 private_key: "testkey.pem",
3683 }
3684
Jooyung Han31c470b2019-10-18 16:26:59 +09003685 vndk_prebuilt_shared {
3686 name: "libvndk27",
3687 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003688 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003689 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003690 vndk: {
3691 enabled: true,
3692 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003693 target_arch: "arm64",
3694 arch: {
3695 arm: {
3696 srcs: ["libvndk27_arm.so"],
3697 },
3698 arm64: {
3699 srcs: ["libvndk27_arm64.so"],
3700 },
3701 },
Colin Cross2807f002021-03-02 10:15:29 -08003702 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003703 }
3704
3705 vndk_prebuilt_shared {
3706 name: "libvndk27",
3707 version: "27",
3708 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003709 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003710 vndk: {
3711 enabled: true,
3712 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003713 target_arch: "x86_64",
3714 arch: {
3715 x86: {
3716 srcs: ["libvndk27_x86.so"],
3717 },
3718 x86_64: {
3719 srcs: ["libvndk27_x86_64.so"],
3720 },
3721 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003722 }
3723 `+vndkLibrariesTxtFiles("27"),
3724 withFiles(map[string][]byte{
3725 "libvndk27_arm.so": nil,
3726 "libvndk27_arm64.so": nil,
3727 "libvndk27_x86.so": nil,
3728 "libvndk27_x86_64.so": nil,
3729 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003730
Colin Cross2807f002021-03-02 10:15:29 -08003731 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003732 "lib/libvndk27_arm.so",
3733 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003734 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003735 })
Jooyung Han344d5432019-08-23 11:17:39 +09003736}
3737
Jooyung Han90eee022019-10-01 20:02:42 +09003738func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003739 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003740 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003741 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003742 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003743 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003744 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003745 }
3746 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003747 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003748 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003749 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003750 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003751 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003752 }
3753 apex_key {
3754 name: "myapex.key",
3755 public_key: "testkey.avbpubkey",
3756 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003757 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003758
3759 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003760 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003761 actual := proptools.String(bundle.properties.Apex_name)
3762 if !reflect.DeepEqual(actual, expected) {
3763 t.Errorf("Got '%v', expected '%v'", actual, expected)
3764 }
3765 }
3766
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003767 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003768 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003769}
3770
Jooyung Han344d5432019-08-23 11:17:39 +09003771func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003772 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003773 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003774 name: "com.android.vndk.current",
3775 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003776 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003777 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003778 }
3779
3780 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003781 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003782 public_key: "testkey.avbpubkey",
3783 private_key: "testkey.pem",
3784 }
3785
3786 cc_library {
3787 name: "libvndk",
3788 srcs: ["mylib.cpp"],
3789 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003790 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003791 native_bridge_supported: true,
3792 host_supported: true,
3793 vndk: {
3794 enabled: true,
3795 },
3796 system_shared_libs: [],
3797 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003798 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003799 }
Colin Cross2807f002021-03-02 10:15:29 -08003800 `+vndkLibrariesTxtFiles("current"),
3801 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003802
Colin Cross2807f002021-03-02 10:15:29 -08003803 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003804 "lib/libvndk.so",
3805 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003806 "lib/libc++.so",
3807 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003808 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003809 })
Jooyung Han344d5432019-08-23 11:17:39 +09003810}
3811
3812func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003813 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003814 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003815 name: "com.android.vndk.current",
3816 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003817 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003818 native_bridge_supported: true,
3819 }
3820
3821 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003822 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003823 public_key: "testkey.avbpubkey",
3824 private_key: "testkey.pem",
3825 }
3826
3827 cc_library {
3828 name: "libvndk",
3829 srcs: ["mylib.cpp"],
3830 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003831 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003832 native_bridge_supported: true,
3833 host_supported: true,
3834 vndk: {
3835 enabled: true,
3836 },
3837 system_shared_libs: [],
3838 stl: "none",
3839 }
3840 `)
3841}
3842
Jooyung Han31c470b2019-10-18 16:26:59 +09003843func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003844 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003845 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003846 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003847 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003848 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003849 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003850 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003851 }
3852
3853 apex_key {
3854 name: "myapex.key",
3855 public_key: "testkey.avbpubkey",
3856 private_key: "testkey.pem",
3857 }
3858
3859 vndk_prebuilt_shared {
3860 name: "libvndk27",
3861 version: "27",
3862 target_arch: "arm",
3863 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003864 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003865 vndk: {
3866 enabled: true,
3867 },
3868 arch: {
3869 arm: {
3870 srcs: ["libvndk27.so"],
3871 }
3872 },
3873 }
3874
3875 vndk_prebuilt_shared {
3876 name: "libvndk27",
3877 version: "27",
3878 target_arch: "arm",
3879 binder32bit: true,
3880 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003881 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003882 vndk: {
3883 enabled: true,
3884 },
3885 arch: {
3886 arm: {
3887 srcs: ["libvndk27binder32.so"],
3888 }
3889 },
Colin Cross2807f002021-03-02 10:15:29 -08003890 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003891 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003892 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003893 withFiles(map[string][]byte{
3894 "libvndk27.so": nil,
3895 "libvndk27binder32.so": nil,
3896 }),
3897 withBinder32bit,
3898 withTargets(map[android.OsType][]android.Target{
3899 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003900 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3901 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003902 },
3903 }),
3904 )
3905
Colin Cross2807f002021-03-02 10:15:29 -08003906 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003907 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003908 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003909 })
3910}
3911
Jooyung Han45a96772020-06-15 14:59:42 +09003912func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003913 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003914 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003915 name: "com.android.vndk.current",
3916 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003917 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003918 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003919 }
3920
3921 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003922 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003923 public_key: "testkey.avbpubkey",
3924 private_key: "testkey.pem",
3925 }
3926
3927 cc_library {
3928 name: "libz",
3929 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003930 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003931 vndk: {
3932 enabled: true,
3933 },
3934 stubs: {
3935 symbol_file: "libz.map.txt",
3936 versions: ["30"],
3937 }
3938 }
3939 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3940 "libz.map.txt": nil,
3941 }))
3942
Colin Cross2807f002021-03-02 10:15:29 -08003943 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003944 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3945 ensureListEmpty(t, provideNativeLibs)
3946}
3947
Jooyung Hane1633032019-08-01 17:41:43 +09003948func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003949 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003950 apex {
3951 name: "myapex_nodep",
3952 key: "myapex.key",
3953 native_shared_libs: ["lib_nodep"],
3954 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003955 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003956 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003957 }
3958
3959 apex {
3960 name: "myapex_dep",
3961 key: "myapex.key",
3962 native_shared_libs: ["lib_dep"],
3963 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003964 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003965 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003966 }
3967
3968 apex {
3969 name: "myapex_provider",
3970 key: "myapex.key",
3971 native_shared_libs: ["libfoo"],
3972 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003973 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003974 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003975 }
3976
3977 apex {
3978 name: "myapex_selfcontained",
3979 key: "myapex.key",
3980 native_shared_libs: ["lib_dep", "libfoo"],
3981 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003982 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003983 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003984 }
3985
3986 apex_key {
3987 name: "myapex.key",
3988 public_key: "testkey.avbpubkey",
3989 private_key: "testkey.pem",
3990 }
3991
3992 cc_library {
3993 name: "lib_nodep",
3994 srcs: ["mylib.cpp"],
3995 system_shared_libs: [],
3996 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003997 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003998 }
3999
4000 cc_library {
4001 name: "lib_dep",
4002 srcs: ["mylib.cpp"],
4003 shared_libs: ["libfoo"],
4004 system_shared_libs: [],
4005 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004006 apex_available: [
4007 "myapex_dep",
4008 "myapex_provider",
4009 "myapex_selfcontained",
4010 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004011 }
4012
4013 cc_library {
4014 name: "libfoo",
4015 srcs: ["mytest.cpp"],
4016 stubs: {
4017 versions: ["1"],
4018 },
4019 system_shared_libs: [],
4020 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004021 apex_available: [
4022 "myapex_provider",
4023 "myapex_selfcontained",
4024 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004025 }
4026 `)
4027
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004028 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004029 var provideNativeLibs, requireNativeLibs []string
4030
Sundong Ahnabb64432019-10-22 13:58:29 +09004031 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004032 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4033 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004034 ensureListEmpty(t, provideNativeLibs)
4035 ensureListEmpty(t, requireNativeLibs)
4036
Sundong Ahnabb64432019-10-22 13:58:29 +09004037 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004038 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4039 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004040 ensureListEmpty(t, provideNativeLibs)
4041 ensureListContains(t, requireNativeLibs, "libfoo.so")
4042
Sundong Ahnabb64432019-10-22 13:58:29 +09004043 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004044 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4045 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004046 ensureListContains(t, provideNativeLibs, "libfoo.so")
4047 ensureListEmpty(t, requireNativeLibs)
4048
Sundong Ahnabb64432019-10-22 13:58:29 +09004049 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004050 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4051 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004052 ensureListContains(t, provideNativeLibs, "libfoo.so")
4053 ensureListEmpty(t, requireNativeLibs)
4054}
4055
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004056func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004057 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004058 apex {
4059 name: "myapex",
4060 key: "myapex.key",
4061 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004062 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004063 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004064 }
4065
4066 apex_key {
4067 name: "myapex.key",
4068 public_key: "testkey.avbpubkey",
4069 private_key: "testkey.pem",
4070 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004071
4072 cc_library {
4073 name: "mylib",
4074 srcs: ["mylib.cpp"],
4075 system_shared_libs: [],
4076 stl: "none",
4077 apex_available: [
4078 "//apex_available:platform",
4079 "myapex",
4080 ],
4081 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004082 `)
4083
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004084 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004085 apexManifestRule := module.Rule("apexManifestRule")
4086 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4087 apexRule := module.Rule("apexRule")
4088 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004089
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004090 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004091 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004092 name := apexBundle.BaseModuleName()
4093 prefix := "TARGET_"
4094 var builder strings.Builder
4095 data.Custom(&builder, name, prefix, "", data)
4096 androidMk := builder.String()
4097 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4098 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004099}
4100
Alex Light0851b882019-02-07 13:20:53 -08004101func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004102 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004103 apex {
4104 name: "myapex",
4105 key: "myapex.key",
4106 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004107 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004108 }
4109
4110 apex_key {
4111 name: "myapex.key",
4112 public_key: "testkey.avbpubkey",
4113 private_key: "testkey.pem",
4114 }
4115
4116 cc_library {
4117 name: "mylib_common",
4118 srcs: ["mylib.cpp"],
4119 system_shared_libs: [],
4120 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004121 apex_available: [
4122 "//apex_available:platform",
4123 "myapex",
4124 ],
Alex Light0851b882019-02-07 13:20:53 -08004125 }
4126 `)
4127
Sundong Ahnabb64432019-10-22 13:58:29 +09004128 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004129 apexRule := module.Rule("apexRule")
4130 copyCmds := apexRule.Args["copy_commands"]
4131
4132 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4133 t.Log("Apex was a test apex!")
4134 t.Fail()
4135 }
4136 // Ensure that main rule creates an output
4137 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4138
4139 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004140 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004141
4142 // Ensure that both direct and indirect deps are copied into apex
4143 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4144
Colin Cross7113d202019-11-20 16:39:12 -08004145 // Ensure that the platform variant ends with _shared
4146 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004147
Colin Cross56a83212020-09-15 18:30:11 -07004148 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004149 t.Log("Found mylib_common not in any apex!")
4150 t.Fail()
4151 }
4152}
4153
4154func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004155 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004156 apex_test {
4157 name: "myapex",
4158 key: "myapex.key",
4159 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004160 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004161 }
4162
4163 apex_key {
4164 name: "myapex.key",
4165 public_key: "testkey.avbpubkey",
4166 private_key: "testkey.pem",
4167 }
4168
4169 cc_library {
4170 name: "mylib_common_test",
4171 srcs: ["mylib.cpp"],
4172 system_shared_libs: [],
4173 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004174 // TODO: remove //apex_available:platform
4175 apex_available: [
4176 "//apex_available:platform",
4177 "myapex",
4178 ],
Alex Light0851b882019-02-07 13:20:53 -08004179 }
4180 `)
4181
Sundong Ahnabb64432019-10-22 13:58:29 +09004182 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004183 apexRule := module.Rule("apexRule")
4184 copyCmds := apexRule.Args["copy_commands"]
4185
4186 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4187 t.Log("Apex was not a test apex!")
4188 t.Fail()
4189 }
4190 // Ensure that main rule creates an output
4191 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4192
4193 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004194 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004195
4196 // Ensure that both direct and indirect deps are copied into apex
4197 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4198
Colin Cross7113d202019-11-20 16:39:12 -08004199 // Ensure that the platform variant ends with _shared
4200 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004201}
4202
Alex Light9670d332019-01-29 18:07:33 -08004203func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004204 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004205 apex {
4206 name: "myapex",
4207 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004208 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004209 multilib: {
4210 first: {
4211 native_shared_libs: ["mylib_common"],
4212 }
4213 },
4214 target: {
4215 android: {
4216 multilib: {
4217 first: {
4218 native_shared_libs: ["mylib"],
4219 }
4220 }
4221 },
4222 host: {
4223 multilib: {
4224 first: {
4225 native_shared_libs: ["mylib2"],
4226 }
4227 }
4228 }
4229 }
4230 }
4231
4232 apex_key {
4233 name: "myapex.key",
4234 public_key: "testkey.avbpubkey",
4235 private_key: "testkey.pem",
4236 }
4237
4238 cc_library {
4239 name: "mylib",
4240 srcs: ["mylib.cpp"],
4241 system_shared_libs: [],
4242 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004243 // TODO: remove //apex_available:platform
4244 apex_available: [
4245 "//apex_available:platform",
4246 "myapex",
4247 ],
Alex Light9670d332019-01-29 18:07:33 -08004248 }
4249
4250 cc_library {
4251 name: "mylib_common",
4252 srcs: ["mylib.cpp"],
4253 system_shared_libs: [],
4254 stl: "none",
4255 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004256 // TODO: remove //apex_available:platform
4257 apex_available: [
4258 "//apex_available:platform",
4259 "myapex",
4260 ],
Alex Light9670d332019-01-29 18:07:33 -08004261 }
4262
4263 cc_library {
4264 name: "mylib2",
4265 srcs: ["mylib.cpp"],
4266 system_shared_libs: [],
4267 stl: "none",
4268 compile_multilib: "first",
4269 }
4270 `)
4271
Sundong Ahnabb64432019-10-22 13:58:29 +09004272 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004273 copyCmds := apexRule.Args["copy_commands"]
4274
4275 // Ensure that main rule creates an output
4276 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4277
4278 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004279 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4280 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4281 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004282
4283 // Ensure that both direct and indirect deps are copied into apex
4284 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4285 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4286 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4287
Colin Cross7113d202019-11-20 16:39:12 -08004288 // Ensure that the platform variant ends with _shared
4289 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4290 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4291 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004292}
Jiyong Park04480cf2019-02-06 00:16:29 +09004293
Jiyong Park59140302020-12-14 18:44:04 +09004294func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004295 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004296 apex {
4297 name: "myapex",
4298 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004299 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004300 arch: {
4301 arm64: {
4302 native_shared_libs: ["mylib.arm64"],
4303 },
4304 x86_64: {
4305 native_shared_libs: ["mylib.x64"],
4306 },
4307 }
4308 }
4309
4310 apex_key {
4311 name: "myapex.key",
4312 public_key: "testkey.avbpubkey",
4313 private_key: "testkey.pem",
4314 }
4315
4316 cc_library {
4317 name: "mylib.arm64",
4318 srcs: ["mylib.cpp"],
4319 system_shared_libs: [],
4320 stl: "none",
4321 // TODO: remove //apex_available:platform
4322 apex_available: [
4323 "//apex_available:platform",
4324 "myapex",
4325 ],
4326 }
4327
4328 cc_library {
4329 name: "mylib.x64",
4330 srcs: ["mylib.cpp"],
4331 system_shared_libs: [],
4332 stl: "none",
4333 // TODO: remove //apex_available:platform
4334 apex_available: [
4335 "//apex_available:platform",
4336 "myapex",
4337 ],
4338 }
4339 `)
4340
4341 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4342 copyCmds := apexRule.Args["copy_commands"]
4343
4344 // Ensure that apex variant is created for the direct dep
4345 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4346 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4347
4348 // Ensure that both direct and indirect deps are copied into apex
4349 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4350 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4351}
4352
Jiyong Park04480cf2019-02-06 00:16:29 +09004353func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004354 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004355 apex {
4356 name: "myapex",
4357 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004358 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004359 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004360 }
4361
4362 apex_key {
4363 name: "myapex.key",
4364 public_key: "testkey.avbpubkey",
4365 private_key: "testkey.pem",
4366 }
4367
4368 sh_binary {
4369 name: "myscript",
4370 src: "mylib.cpp",
4371 filename: "myscript.sh",
4372 sub_dir: "script",
4373 }
4374 `)
4375
Sundong Ahnabb64432019-10-22 13:58:29 +09004376 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004377 copyCmds := apexRule.Args["copy_commands"]
4378
4379 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4380}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004381
Jooyung Han91df2082019-11-20 01:49:42 +09004382func TestApexInVariousPartition(t *testing.T) {
4383 testcases := []struct {
4384 propName, parition, flattenedPartition string
4385 }{
4386 {"", "system", "system_ext"},
4387 {"product_specific: true", "product", "product"},
4388 {"soc_specific: true", "vendor", "vendor"},
4389 {"proprietary: true", "vendor", "vendor"},
4390 {"vendor: true", "vendor", "vendor"},
4391 {"system_ext_specific: true", "system_ext", "system_ext"},
4392 }
4393 for _, tc := range testcases {
4394 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004395 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004396 apex {
4397 name: "myapex",
4398 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004399 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004400 `+tc.propName+`
4401 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004402
Jooyung Han91df2082019-11-20 01:49:42 +09004403 apex_key {
4404 name: "myapex.key",
4405 public_key: "testkey.avbpubkey",
4406 private_key: "testkey.pem",
4407 }
4408 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004409
Jooyung Han91df2082019-11-20 01:49:42 +09004410 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004411 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4412 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004413 if actual != expected {
4414 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4415 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004416
Jooyung Han91df2082019-11-20 01:49:42 +09004417 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004418 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4419 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004420 if actual != expected {
4421 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4422 }
4423 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004424 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004425}
Jiyong Park67882562019-03-21 01:11:21 +09004426
Jooyung Han580eb4f2020-06-24 19:33:06 +09004427func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004428 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004429 apex {
4430 name: "myapex",
4431 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004432 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004433 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004434
Jooyung Han580eb4f2020-06-24 19:33:06 +09004435 apex_key {
4436 name: "myapex.key",
4437 public_key: "testkey.avbpubkey",
4438 private_key: "testkey.pem",
4439 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004440 `)
4441 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004442 rule := module.Output("file_contexts")
4443 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4444}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004445
Jooyung Han580eb4f2020-06-24 19:33:06 +09004446func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004447 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004448 apex {
4449 name: "myapex",
4450 key: "myapex.key",
4451 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004452 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004453 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004454
Jooyung Han580eb4f2020-06-24 19:33:06 +09004455 apex_key {
4456 name: "myapex.key",
4457 public_key: "testkey.avbpubkey",
4458 private_key: "testkey.pem",
4459 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004460 `, withFiles(map[string][]byte{
4461 "my_own_file_contexts": nil,
4462 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004463}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004464
Jooyung Han580eb4f2020-06-24 19:33:06 +09004465func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004466 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004467 apex {
4468 name: "myapex",
4469 key: "myapex.key",
4470 product_specific: true,
4471 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004472 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004473 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004474
Jooyung Han580eb4f2020-06-24 19:33:06 +09004475 apex_key {
4476 name: "myapex.key",
4477 public_key: "testkey.avbpubkey",
4478 private_key: "testkey.pem",
4479 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004480 `)
4481
Colin Cross1c460562021-02-16 17:55:47 -08004482 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004483 apex {
4484 name: "myapex",
4485 key: "myapex.key",
4486 product_specific: true,
4487 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004488 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004489 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004490
Jooyung Han580eb4f2020-06-24 19:33:06 +09004491 apex_key {
4492 name: "myapex.key",
4493 public_key: "testkey.avbpubkey",
4494 private_key: "testkey.pem",
4495 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004496 `, withFiles(map[string][]byte{
4497 "product_specific_file_contexts": nil,
4498 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004499 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4500 rule := module.Output("file_contexts")
4501 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4502}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004503
Jooyung Han580eb4f2020-06-24 19:33:06 +09004504func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004505 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004506 apex {
4507 name: "myapex",
4508 key: "myapex.key",
4509 product_specific: true,
4510 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004511 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004512 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004513
Jooyung Han580eb4f2020-06-24 19:33:06 +09004514 apex_key {
4515 name: "myapex.key",
4516 public_key: "testkey.avbpubkey",
4517 private_key: "testkey.pem",
4518 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004519
Jooyung Han580eb4f2020-06-24 19:33:06 +09004520 filegroup {
4521 name: "my-file-contexts",
4522 srcs: ["product_specific_file_contexts"],
4523 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004524 `, withFiles(map[string][]byte{
4525 "product_specific_file_contexts": nil,
4526 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004527 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4528 rule := module.Output("file_contexts")
4529 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004530}
4531
Jiyong Park67882562019-03-21 01:11:21 +09004532func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004533 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004534 apex_key {
4535 name: "myapex.key",
4536 public_key: ":my.avbpubkey",
4537 private_key: ":my.pem",
4538 product_specific: true,
4539 }
4540
4541 filegroup {
4542 name: "my.avbpubkey",
4543 srcs: ["testkey2.avbpubkey"],
4544 }
4545
4546 filegroup {
4547 name: "my.pem",
4548 srcs: ["testkey2.pem"],
4549 }
4550 `)
4551
4552 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4553 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004554 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004555 if actual_pubkey != expected_pubkey {
4556 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4557 }
4558 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004559 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004560 if actual_privkey != expected_privkey {
4561 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4562 }
4563}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004564
4565func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004566 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004567 prebuilt_apex {
4568 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004569 arch: {
4570 arm64: {
4571 src: "myapex-arm64.apex",
4572 },
4573 arm: {
4574 src: "myapex-arm.apex",
4575 },
4576 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004577 }
4578 `)
4579
Paul Duffin6717d882021-06-15 19:09:41 +01004580 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004581
Jiyong Parkc95714e2019-03-29 14:23:10 +09004582 expectedInput := "myapex-arm64.apex"
4583 if prebuilt.inputApex.String() != expectedInput {
4584 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4585 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004586}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004587
Paul Duffinc0609c62021-03-01 17:27:16 +00004588func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004589 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004590 prebuilt_apex {
4591 name: "myapex",
4592 }
4593 `)
4594}
4595
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004596func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004597 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004598 prebuilt_apex {
4599 name: "myapex",
4600 src: "myapex-arm.apex",
4601 filename: "notmyapex.apex",
4602 }
4603 `)
4604
Paul Duffin6717d882021-06-15 19:09:41 +01004605 p := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004606
4607 expected := "notmyapex.apex"
4608 if p.installFilename != expected {
4609 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4610 }
4611}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004612
Samiul Islam7c02e262021-09-08 17:48:28 +01004613func TestApexSetFilenameOverride(t *testing.T) {
4614 testApex(t, `
4615 apex_set {
4616 name: "com.company.android.myapex",
4617 apex_name: "com.android.myapex",
4618 set: "company-myapex.apks",
4619 filename: "com.company.android.myapex.apex"
4620 }
4621 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4622
4623 testApex(t, `
4624 apex_set {
4625 name: "com.company.android.myapex",
4626 apex_name: "com.android.myapex",
4627 set: "company-myapex.apks",
4628 filename: "com.company.android.myapex.capex"
4629 }
4630 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4631
4632 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4633 apex_set {
4634 name: "com.company.android.myapex",
4635 apex_name: "com.android.myapex",
4636 set: "company-myapex.apks",
4637 filename: "some-random-suffix"
4638 }
4639 `)
4640}
4641
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004642func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004643 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004644 prebuilt_apex {
4645 name: "myapex.prebuilt",
4646 src: "myapex-arm.apex",
4647 overrides: [
4648 "myapex",
4649 ],
4650 }
4651 `)
4652
Paul Duffin6717d882021-06-15 19:09:41 +01004653 p := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt").Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004654
4655 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004656 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004657 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004658 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004659 }
4660}
4661
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004662func TestPrebuiltApexName(t *testing.T) {
4663 testApex(t, `
4664 prebuilt_apex {
4665 name: "com.company.android.myapex",
4666 apex_name: "com.android.myapex",
4667 src: "company-myapex-arm.apex",
4668 }
4669 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4670
4671 testApex(t, `
4672 apex_set {
4673 name: "com.company.android.myapex",
4674 apex_name: "com.android.myapex",
4675 set: "company-myapex.apks",
4676 }
4677 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4678}
4679
4680func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4681 _ = android.GroupFixturePreparers(
4682 java.PrepareForTestWithJavaDefaultModules,
4683 PrepareForTestWithApexBuildComponents,
4684 android.FixtureWithRootAndroidBp(`
4685 platform_bootclasspath {
4686 name: "platform-bootclasspath",
4687 fragments: [
4688 {
4689 apex: "com.android.art",
4690 module: "art-bootclasspath-fragment",
4691 },
4692 ],
4693 }
4694
4695 prebuilt_apex {
4696 name: "com.company.android.art",
4697 apex_name: "com.android.art",
4698 src: "com.company.android.art-arm.apex",
4699 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4700 }
4701
4702 prebuilt_bootclasspath_fragment {
4703 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004704 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004705 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004706 hidden_api: {
4707 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4708 metadata: "my-bootclasspath-fragment/metadata.csv",
4709 index: "my-bootclasspath-fragment/index.csv",
4710 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4711 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4712 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004713 }
4714
4715 java_import {
4716 name: "core-oj",
4717 jars: ["prebuilt.jar"],
4718 }
4719 `),
4720 ).RunTest(t)
4721}
4722
Paul Duffin092153d2021-01-26 11:42:39 +00004723// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4724// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004725func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004726 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004727
Paul Duffin89886cb2021-02-05 16:44:03 +00004728 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004729 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004730 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004731 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004732 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004733 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004734 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4735 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4736 android.NormalizePathForTesting(dexJarBuildPath))
4737 }
4738
4739 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004740 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004741 // Make sure the import has been given the correct path to the dex jar.
4742 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4743 dexJarBuildPath := p.DexJarInstallPath()
4744 stem := android.RemoveOptionalPrebuiltPrefix(name)
4745 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4746 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4747 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004748 }
4749
Paul Duffin39853512021-02-26 11:09:39 +00004750 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004751 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004752 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004753 android.AssertArrayString(t, "Check if there is no source variant",
4754 []string{"android_common"},
4755 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004756 }
4757
4758 t.Run("prebuilt only", func(t *testing.T) {
4759 bp := `
4760 prebuilt_apex {
4761 name: "myapex",
4762 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",
4775 jars: ["libfoo.jar"],
4776 }
Paul Duffin39853512021-02-26 11:09:39 +00004777
4778 java_sdk_library_import {
4779 name: "libbar",
4780 public: {
4781 jars: ["libbar.jar"],
4782 },
4783 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004784 `
4785
4786 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4787 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4788
Martin Stjernholm44825602021-09-17 01:44:12 +01004789 deapexerName := deapexerModuleName("myapex")
4790 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4791
Paul Duffinf6932af2021-02-26 18:21:56 +00004792 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004793 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004794 rule := deapexer.Rule("deapexer")
4795 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4796 t.Errorf("expected: %q, found: %q", expected, actual)
4797 }
4798
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004799 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004800 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004801 rule = prebuiltApex.Rule("android/soong/android.Cp")
4802 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4803 t.Errorf("expected: %q, found: %q", expected, actual)
4804 }
4805
Paul Duffin89886cb2021-02-05 16:44:03 +00004806 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004807 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004808
4809 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004810 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004811 })
4812
4813 t.Run("prebuilt with source preferred", func(t *testing.T) {
4814
4815 bp := `
4816 prebuilt_apex {
4817 name: "myapex",
4818 arch: {
4819 arm64: {
4820 src: "myapex-arm64.apex",
4821 },
4822 arm: {
4823 src: "myapex-arm.apex",
4824 },
4825 },
Paul Duffin39853512021-02-26 11:09:39 +00004826 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004827 }
4828
4829 java_import {
4830 name: "libfoo",
4831 jars: ["libfoo.jar"],
4832 }
4833
4834 java_library {
4835 name: "libfoo",
4836 }
Paul Duffin39853512021-02-26 11:09:39 +00004837
4838 java_sdk_library_import {
4839 name: "libbar",
4840 public: {
4841 jars: ["libbar.jar"],
4842 },
4843 }
4844
4845 java_sdk_library {
4846 name: "libbar",
4847 srcs: ["foo/bar/MyClass.java"],
4848 unsafe_ignore_missing_latest_api: true,
4849 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004850 `
4851
4852 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4853 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4854
Paul Duffin89886cb2021-02-05 16:44:03 +00004855 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004856 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004857 ensureNoSourceVariant(t, ctx, "libfoo")
4858
4859 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004860 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004861 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004862 })
4863
4864 t.Run("prebuilt preferred with source", func(t *testing.T) {
4865 bp := `
4866 prebuilt_apex {
4867 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004868 arch: {
4869 arm64: {
4870 src: "myapex-arm64.apex",
4871 },
4872 arm: {
4873 src: "myapex-arm.apex",
4874 },
4875 },
Paul Duffin39853512021-02-26 11:09:39 +00004876 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004877 }
4878
4879 java_import {
4880 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004881 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004882 jars: ["libfoo.jar"],
4883 }
4884
4885 java_library {
4886 name: "libfoo",
4887 }
Paul Duffin39853512021-02-26 11:09:39 +00004888
4889 java_sdk_library_import {
4890 name: "libbar",
4891 prefer: true,
4892 public: {
4893 jars: ["libbar.jar"],
4894 },
4895 }
4896
4897 java_sdk_library {
4898 name: "libbar",
4899 srcs: ["foo/bar/MyClass.java"],
4900 unsafe_ignore_missing_latest_api: true,
4901 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004902 `
4903
4904 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4905 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4906
Paul Duffin89886cb2021-02-05 16:44:03 +00004907 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004908 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004909 ensureNoSourceVariant(t, ctx, "libfoo")
4910
4911 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004912 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004913 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004914 })
4915}
4916
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004917func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004918 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004919 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004920 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4921 // is disabled.
4922 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4923 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004924
Paul Duffin37856732021-02-26 14:24:15 +00004925 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4926 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004927 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004928 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004929 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004930 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004931 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004932 foundLibfooJar = true
4933 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004934 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004935 }
4936 }
4937 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004938 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 +00004939 }
4940 }
4941
Paul Duffin40a3f652021-07-19 13:11:24 +01004942 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004943 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004944 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004945 var rule android.TestingBuildParams
4946
4947 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4948 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004949 }
4950
Paul Duffin40a3f652021-07-19 13:11:24 +01004951 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4952 t.Helper()
4953 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4954 var rule android.TestingBuildParams
4955
4956 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4957 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4958 }
4959
Paul Duffin89f570a2021-06-16 01:42:33 +01004960 fragment := java.ApexVariantReference{
4961 Apex: proptools.StringPtr("myapex"),
4962 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4963 }
4964
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004965 t.Run("prebuilt only", func(t *testing.T) {
4966 bp := `
4967 prebuilt_apex {
4968 name: "myapex",
4969 arch: {
4970 arm64: {
4971 src: "myapex-arm64.apex",
4972 },
4973 arm: {
4974 src: "myapex-arm.apex",
4975 },
4976 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004977 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4978 }
4979
4980 prebuilt_bootclasspath_fragment {
4981 name: "my-bootclasspath-fragment",
4982 contents: ["libfoo", "libbar"],
4983 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004984 hidden_api: {
4985 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4986 metadata: "my-bootclasspath-fragment/metadata.csv",
4987 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004988 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4989 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4990 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004991 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004992 }
4993
4994 java_import {
4995 name: "libfoo",
4996 jars: ["libfoo.jar"],
4997 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004998 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004999 }
Paul Duffin37856732021-02-26 14:24:15 +00005000
5001 java_sdk_library_import {
5002 name: "libbar",
5003 public: {
5004 jars: ["libbar.jar"],
5005 },
5006 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005007 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005008 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005009 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005010 `
5011
Paul Duffin89f570a2021-06-16 01:42:33 +01005012 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005013 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5014 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005015
Paul Duffin537ea3d2021-05-14 10:38:00 +01005016 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005017 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005018 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005019 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005020 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5021 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005022 })
5023
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005024 t.Run("apex_set only", func(t *testing.T) {
5025 bp := `
5026 apex_set {
5027 name: "myapex",
5028 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005029 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5030 }
5031
5032 prebuilt_bootclasspath_fragment {
5033 name: "my-bootclasspath-fragment",
5034 contents: ["libfoo", "libbar"],
5035 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005036 hidden_api: {
5037 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5038 metadata: "my-bootclasspath-fragment/metadata.csv",
5039 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005040 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5041 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5042 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005043 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005044 }
5045
5046 java_import {
5047 name: "libfoo",
5048 jars: ["libfoo.jar"],
5049 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005050 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005051 }
5052
5053 java_sdk_library_import {
5054 name: "libbar",
5055 public: {
5056 jars: ["libbar.jar"],
5057 },
5058 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005059 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005060 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005061 }
5062 `
5063
Paul Duffin89f570a2021-06-16 01:42:33 +01005064 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005065 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5066 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5067
Paul Duffin537ea3d2021-05-14 10:38:00 +01005068 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005069 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005070 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005071 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005072 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5073 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005074 })
5075
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005076 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5077 bp := `
5078 prebuilt_apex {
5079 name: "myapex",
5080 arch: {
5081 arm64: {
5082 src: "myapex-arm64.apex",
5083 },
5084 arm: {
5085 src: "myapex-arm.apex",
5086 },
5087 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005088 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5089 }
5090
5091 prebuilt_bootclasspath_fragment {
5092 name: "my-bootclasspath-fragment",
5093 contents: ["libfoo", "libbar"],
5094 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005095 hidden_api: {
5096 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5097 metadata: "my-bootclasspath-fragment/metadata.csv",
5098 index: "my-bootclasspath-fragment/index.csv",
5099 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5100 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5101 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005102 }
5103
5104 java_import {
5105 name: "libfoo",
5106 jars: ["libfoo.jar"],
5107 apex_available: ["myapex"],
5108 }
5109
5110 java_library {
5111 name: "libfoo",
5112 srcs: ["foo/bar/MyClass.java"],
5113 apex_available: ["myapex"],
5114 }
Paul Duffin37856732021-02-26 14:24:15 +00005115
5116 java_sdk_library_import {
5117 name: "libbar",
5118 public: {
5119 jars: ["libbar.jar"],
5120 },
5121 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005122 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005123 }
5124
5125 java_sdk_library {
5126 name: "libbar",
5127 srcs: ["foo/bar/MyClass.java"],
5128 unsafe_ignore_missing_latest_api: true,
5129 apex_available: ["myapex"],
5130 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005131 `
5132
5133 // In this test the source (java_library) libfoo is active since the
5134 // prebuilt (java_import) defaults to prefer:false. However the
5135 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5136 // find the dex boot jar in it. We either need to disable the source libfoo
5137 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005138 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005139 // dexbootjar check is skipped if AllowMissingDependencies is true
5140 preparerAllowMissingDeps := android.GroupFixturePreparers(
5141 preparer,
5142 android.PrepareForTestWithAllowMissingDependencies,
5143 )
5144 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005145 })
5146
5147 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5148 bp := `
5149 prebuilt_apex {
5150 name: "myapex",
5151 arch: {
5152 arm64: {
5153 src: "myapex-arm64.apex",
5154 },
5155 arm: {
5156 src: "myapex-arm.apex",
5157 },
5158 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005159 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5160 }
5161
5162 prebuilt_bootclasspath_fragment {
5163 name: "my-bootclasspath-fragment",
5164 contents: ["libfoo", "libbar"],
5165 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005166 hidden_api: {
5167 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5168 metadata: "my-bootclasspath-fragment/metadata.csv",
5169 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005170 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5171 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5172 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005173 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005174 }
5175
5176 java_import {
5177 name: "libfoo",
5178 prefer: true,
5179 jars: ["libfoo.jar"],
5180 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005181 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005182 }
5183
5184 java_library {
5185 name: "libfoo",
5186 srcs: ["foo/bar/MyClass.java"],
5187 apex_available: ["myapex"],
5188 }
Paul Duffin37856732021-02-26 14:24:15 +00005189
5190 java_sdk_library_import {
5191 name: "libbar",
5192 prefer: true,
5193 public: {
5194 jars: ["libbar.jar"],
5195 },
5196 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005197 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005198 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005199 }
5200
5201 java_sdk_library {
5202 name: "libbar",
5203 srcs: ["foo/bar/MyClass.java"],
5204 unsafe_ignore_missing_latest_api: true,
5205 apex_available: ["myapex"],
5206 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005207 `
5208
Paul Duffin89f570a2021-06-16 01:42:33 +01005209 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005210 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5211 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005212
Paul Duffin537ea3d2021-05-14 10:38:00 +01005213 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005214 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005215 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005216 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005217 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5218 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005219 })
5220
5221 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5222 bp := `
5223 apex {
5224 name: "myapex",
5225 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005226 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005227 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005228 }
5229
5230 apex_key {
5231 name: "myapex.key",
5232 public_key: "testkey.avbpubkey",
5233 private_key: "testkey.pem",
5234 }
5235
5236 prebuilt_apex {
5237 name: "myapex",
5238 arch: {
5239 arm64: {
5240 src: "myapex-arm64.apex",
5241 },
5242 arm: {
5243 src: "myapex-arm.apex",
5244 },
5245 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005246 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5247 }
5248
5249 prebuilt_bootclasspath_fragment {
5250 name: "my-bootclasspath-fragment",
5251 contents: ["libfoo", "libbar"],
5252 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005253 hidden_api: {
5254 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5255 metadata: "my-bootclasspath-fragment/metadata.csv",
5256 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005257 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5258 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5259 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005260 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005261 }
5262
5263 java_import {
5264 name: "libfoo",
5265 jars: ["libfoo.jar"],
5266 apex_available: ["myapex"],
5267 }
5268
5269 java_library {
5270 name: "libfoo",
5271 srcs: ["foo/bar/MyClass.java"],
5272 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005273 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005274 }
Paul Duffin37856732021-02-26 14:24:15 +00005275
5276 java_sdk_library_import {
5277 name: "libbar",
5278 public: {
5279 jars: ["libbar.jar"],
5280 },
5281 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005282 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005283 }
5284
5285 java_sdk_library {
5286 name: "libbar",
5287 srcs: ["foo/bar/MyClass.java"],
5288 unsafe_ignore_missing_latest_api: true,
5289 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005290 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005291 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005292 `
5293
Paul Duffin89f570a2021-06-16 01:42:33 +01005294 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005295 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5296 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005297
Paul Duffin537ea3d2021-05-14 10:38:00 +01005298 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005299 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005300 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005301 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005302 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5303 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005304 })
5305
5306 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5307 bp := `
5308 apex {
5309 name: "myapex",
5310 enabled: false,
5311 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005312 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005313 }
5314
5315 apex_key {
5316 name: "myapex.key",
5317 public_key: "testkey.avbpubkey",
5318 private_key: "testkey.pem",
5319 }
5320
5321 prebuilt_apex {
5322 name: "myapex",
5323 arch: {
5324 arm64: {
5325 src: "myapex-arm64.apex",
5326 },
5327 arm: {
5328 src: "myapex-arm.apex",
5329 },
5330 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005331 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5332 }
5333
5334 prebuilt_bootclasspath_fragment {
5335 name: "my-bootclasspath-fragment",
5336 contents: ["libfoo", "libbar"],
5337 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005338 hidden_api: {
5339 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5340 metadata: "my-bootclasspath-fragment/metadata.csv",
5341 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005342 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5343 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5344 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005345 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005346 }
5347
5348 java_import {
5349 name: "libfoo",
5350 prefer: true,
5351 jars: ["libfoo.jar"],
5352 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005353 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005354 }
5355
5356 java_library {
5357 name: "libfoo",
5358 srcs: ["foo/bar/MyClass.java"],
5359 apex_available: ["myapex"],
5360 }
Paul Duffin37856732021-02-26 14:24:15 +00005361
5362 java_sdk_library_import {
5363 name: "libbar",
5364 prefer: true,
5365 public: {
5366 jars: ["libbar.jar"],
5367 },
5368 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005369 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005370 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005371 }
5372
5373 java_sdk_library {
5374 name: "libbar",
5375 srcs: ["foo/bar/MyClass.java"],
5376 unsafe_ignore_missing_latest_api: true,
5377 apex_available: ["myapex"],
5378 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005379 `
5380
Paul Duffin89f570a2021-06-16 01:42:33 +01005381 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005382 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5383 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005384
Paul Duffin537ea3d2021-05-14 10:38:00 +01005385 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005386 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005387 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005388 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005389 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5390 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005391 })
5392}
5393
Roland Levillain630846d2019-06-26 12:48:34 +01005394func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005395 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005396 apex_test {
5397 name: "myapex",
5398 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005399 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005400 tests: [
5401 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005402 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005403 ],
5404 }
5405
5406 apex_key {
5407 name: "myapex.key",
5408 public_key: "testkey.avbpubkey",
5409 private_key: "testkey.pem",
5410 }
5411
Liz Kammer1c14a212020-05-12 15:26:55 -07005412 filegroup {
5413 name: "fg",
5414 srcs: [
5415 "baz",
5416 "bar/baz"
5417 ],
5418 }
5419
Roland Levillain630846d2019-06-26 12:48:34 +01005420 cc_test {
5421 name: "mytest",
5422 gtest: false,
5423 srcs: ["mytest.cpp"],
5424 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005425 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005426 system_shared_libs: [],
5427 static_executable: true,
5428 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005429 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005430 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005431
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005432 cc_library {
5433 name: "mylib",
5434 srcs: ["mylib.cpp"],
5435 system_shared_libs: [],
5436 stl: "none",
5437 }
5438
Liz Kammer5bd365f2020-05-27 15:15:11 -07005439 filegroup {
5440 name: "fg2",
5441 srcs: [
5442 "testdata/baz"
5443 ],
5444 }
5445
Roland Levillain9b5fde92019-06-28 15:41:19 +01005446 cc_test {
5447 name: "mytests",
5448 gtest: false,
5449 srcs: [
5450 "mytest1.cpp",
5451 "mytest2.cpp",
5452 "mytest3.cpp",
5453 ],
5454 test_per_src: true,
5455 relative_install_path: "test",
5456 system_shared_libs: [],
5457 static_executable: true,
5458 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005459 data: [
5460 ":fg",
5461 ":fg2",
5462 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005463 }
Roland Levillain630846d2019-06-26 12:48:34 +01005464 `)
5465
Sundong Ahnabb64432019-10-22 13:58:29 +09005466 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005467 copyCmds := apexRule.Args["copy_commands"]
5468
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005469 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005470 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005471 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005472
Liz Kammer1c14a212020-05-12 15:26:55 -07005473 //Ensure that test data are copied into apex.
5474 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5475 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5476
Roland Levillain9b5fde92019-06-28 15:41:19 +01005477 // Ensure that test deps built with `test_per_src` are copied into apex.
5478 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5479 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5480 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005481
5482 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005483 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005484 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005485 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005486 prefix := "TARGET_"
5487 var builder strings.Builder
5488 data.Custom(&builder, name, prefix, "", data)
5489 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005490 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5491 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5492 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5493 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005494 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005495 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005496 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005497
5498 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005499 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005500 data.Custom(&builder, name, prefix, "", data)
5501 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005502 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5503 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005504}
5505
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005506func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005507 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005508 apex {
5509 name: "myapex",
5510 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005511 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005512 }
5513 apex_key {
5514 name: "myapex.key",
5515 public_key: "testkey.avbpubkey",
5516 private_key: "testkey.pem",
5517 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005518 `,
5519 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5520 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5521 }),
5522 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005523 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005524 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005525 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005526 var builder strings.Builder
5527 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5528 androidMk := builder.String()
5529 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5530}
5531
Jooyung Hand48f3c32019-08-23 11:18:57 +09005532func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5533 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5534 apex {
5535 name: "myapex",
5536 key: "myapex.key",
5537 native_shared_libs: ["libfoo"],
5538 }
5539
5540 apex_key {
5541 name: "myapex.key",
5542 public_key: "testkey.avbpubkey",
5543 private_key: "testkey.pem",
5544 }
5545
5546 cc_library {
5547 name: "libfoo",
5548 stl: "none",
5549 system_shared_libs: [],
5550 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005551 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005552 }
5553 `)
5554 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5555 apex {
5556 name: "myapex",
5557 key: "myapex.key",
5558 java_libs: ["myjar"],
5559 }
5560
5561 apex_key {
5562 name: "myapex.key",
5563 public_key: "testkey.avbpubkey",
5564 private_key: "testkey.pem",
5565 }
5566
5567 java_library {
5568 name: "myjar",
5569 srcs: ["foo/bar/MyClass.java"],
5570 sdk_version: "none",
5571 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005572 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005573 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005574 }
5575 `)
5576}
5577
Bill Peckhama41a6962021-01-11 10:58:54 -08005578func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005579 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005580 apex {
5581 name: "myapex",
5582 key: "myapex.key",
5583 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005584 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005585 }
5586
5587 apex_key {
5588 name: "myapex.key",
5589 public_key: "testkey.avbpubkey",
5590 private_key: "testkey.pem",
5591 }
5592
5593 java_import {
5594 name: "myjavaimport",
5595 apex_available: ["myapex"],
5596 jars: ["my.jar"],
5597 compile_dex: true,
5598 }
5599 `)
5600
5601 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5602 apexRule := module.Rule("apexRule")
5603 copyCmds := apexRule.Args["copy_commands"]
5604 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5605}
5606
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005607func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005608 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005609 apex {
5610 name: "myapex",
5611 key: "myapex.key",
5612 apps: [
5613 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005614 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005615 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005616 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005617 }
5618
5619 apex_key {
5620 name: "myapex.key",
5621 public_key: "testkey.avbpubkey",
5622 private_key: "testkey.pem",
5623 }
5624
5625 android_app {
5626 name: "AppFoo",
5627 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005628 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005629 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005630 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005631 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005632 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005633 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005634
5635 android_app {
5636 name: "AppFooPriv",
5637 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005638 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005639 system_modules: "none",
5640 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005641 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005642 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005643 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005644
5645 cc_library_shared {
5646 name: "libjni",
5647 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005648 shared_libs: ["libfoo"],
5649 stl: "none",
5650 system_shared_libs: [],
5651 apex_available: [ "myapex" ],
5652 sdk_version: "current",
5653 }
5654
5655 cc_library_shared {
5656 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005657 stl: "none",
5658 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005659 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005660 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005661 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005662 `)
5663
Sundong Ahnabb64432019-10-22 13:58:29 +09005664 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005665 apexRule := module.Rule("apexRule")
5666 copyCmds := apexRule.Args["copy_commands"]
5667
5668 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005669 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005670
Colin Crossaede88c2020-08-11 12:17:01 -07005671 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005672 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005673 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005674 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005675 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005676 // JNI libraries including transitive deps are
5677 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005678 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005679 // ... embedded inside APK (jnilibs.zip)
5680 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5681 // ... and not directly inside the APEX
5682 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5683 }
Dario Frenicde2a032019-10-27 00:29:22 +01005684}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005685
Dario Frenicde2a032019-10-27 00:29:22 +01005686func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005687 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005688 apex {
5689 name: "myapex",
5690 key: "myapex.key",
5691 apps: [
5692 "AppFooPrebuilt",
5693 "AppFooPrivPrebuilt",
5694 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005695 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005696 }
5697
5698 apex_key {
5699 name: "myapex.key",
5700 public_key: "testkey.avbpubkey",
5701 private_key: "testkey.pem",
5702 }
5703
5704 android_app_import {
5705 name: "AppFooPrebuilt",
5706 apk: "PrebuiltAppFoo.apk",
5707 presigned: true,
5708 dex_preopt: {
5709 enabled: false,
5710 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005711 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005712 }
5713
5714 android_app_import {
5715 name: "AppFooPrivPrebuilt",
5716 apk: "PrebuiltAppFooPriv.apk",
5717 privileged: true,
5718 presigned: true,
5719 dex_preopt: {
5720 enabled: false,
5721 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005722 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005723 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005724 }
5725 `)
5726
Sundong Ahnabb64432019-10-22 13:58:29 +09005727 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005728 apexRule := module.Rule("apexRule")
5729 copyCmds := apexRule.Args["copy_commands"]
5730
5731 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005732 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5733}
5734
5735func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005736 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005737 apex {
5738 name: "myapex",
5739 key: "myapex.key",
5740 apps: [
5741 "AppFoo",
5742 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005743 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005744 }
5745
5746 apex_key {
5747 name: "myapex.key",
5748 public_key: "testkey.avbpubkey",
5749 private_key: "testkey.pem",
5750 }
5751
5752 android_app {
5753 name: "AppFoo",
5754 srcs: ["foo/bar/MyClass.java"],
5755 sdk_version: "none",
5756 system_modules: "none",
5757 apex_available: [ "myapex" ],
5758 }
5759
5760 android_app_import {
5761 name: "AppFoo",
5762 apk: "AppFooPrebuilt.apk",
5763 filename: "AppFooPrebuilt.apk",
5764 presigned: true,
5765 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005766 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005767 }
5768 `, withFiles(map[string][]byte{
5769 "AppFooPrebuilt.apk": nil,
5770 }))
5771
5772 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005773 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005774 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005775}
5776
Dario Freni6f3937c2019-12-20 22:58:03 +00005777func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005778 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005779 apex {
5780 name: "myapex",
5781 key: "myapex.key",
5782 apps: [
5783 "TesterHelpAppFoo",
5784 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005785 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005786 }
5787
5788 apex_key {
5789 name: "myapex.key",
5790 public_key: "testkey.avbpubkey",
5791 private_key: "testkey.pem",
5792 }
5793
5794 android_test_helper_app {
5795 name: "TesterHelpAppFoo",
5796 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005797 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005798 }
5799
5800 `)
5801
5802 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5803 apexRule := module.Rule("apexRule")
5804 copyCmds := apexRule.Args["copy_commands"]
5805
5806 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5807}
5808
Jooyung Han18020ea2019-11-13 10:50:48 +09005809func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5810 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005811 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005812 apex {
5813 name: "myapex",
5814 key: "myapex.key",
5815 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005816 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005817 }
5818
5819 apex_key {
5820 name: "myapex.key",
5821 public_key: "testkey.avbpubkey",
5822 private_key: "testkey.pem",
5823 }
5824
5825 apex {
5826 name: "otherapex",
5827 key: "myapex.key",
5828 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005829 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005830 }
5831
5832 cc_defaults {
5833 name: "libfoo-defaults",
5834 apex_available: ["otherapex"],
5835 }
5836
5837 cc_library {
5838 name: "libfoo",
5839 defaults: ["libfoo-defaults"],
5840 stl: "none",
5841 system_shared_libs: [],
5842 }`)
5843}
5844
Paul Duffine52e66f2020-03-30 17:54:29 +01005845func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005846 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005847 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005848 apex {
5849 name: "myapex",
5850 key: "myapex.key",
5851 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005852 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005853 }
5854
5855 apex_key {
5856 name: "myapex.key",
5857 public_key: "testkey.avbpubkey",
5858 private_key: "testkey.pem",
5859 }
5860
5861 apex {
5862 name: "otherapex",
5863 key: "otherapex.key",
5864 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005865 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005866 }
5867
5868 apex_key {
5869 name: "otherapex.key",
5870 public_key: "testkey.avbpubkey",
5871 private_key: "testkey.pem",
5872 }
5873
5874 cc_library {
5875 name: "libfoo",
5876 stl: "none",
5877 system_shared_libs: [],
5878 apex_available: ["otherapex"],
5879 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005880}
Jiyong Park127b40b2019-09-30 16:04:35 +09005881
Paul Duffine52e66f2020-03-30 17:54:29 +01005882func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005883 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005884 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005885.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005886.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005887.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005888.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005889.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005890.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005891 apex {
5892 name: "myapex",
5893 key: "myapex.key",
5894 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005895 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005896 }
5897
5898 apex_key {
5899 name: "myapex.key",
5900 public_key: "testkey.avbpubkey",
5901 private_key: "testkey.pem",
5902 }
5903
Jiyong Park127b40b2019-09-30 16:04:35 +09005904 cc_library {
5905 name: "libfoo",
5906 stl: "none",
5907 shared_libs: ["libbar"],
5908 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005909 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005910 }
5911
5912 cc_library {
5913 name: "libbar",
5914 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005915 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005916 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005917 apex_available: ["myapex"],
5918 }
5919
5920 cc_library {
5921 name: "libbaz",
5922 stl: "none",
5923 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005924 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005925}
Jiyong Park127b40b2019-09-30 16:04:35 +09005926
Paul Duffine52e66f2020-03-30 17:54:29 +01005927func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005928 testApexError(t, "\"otherapex\" is not a valid module name", `
5929 apex {
5930 name: "myapex",
5931 key: "myapex.key",
5932 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005933 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005934 }
5935
5936 apex_key {
5937 name: "myapex.key",
5938 public_key: "testkey.avbpubkey",
5939 private_key: "testkey.pem",
5940 }
5941
5942 cc_library {
5943 name: "libfoo",
5944 stl: "none",
5945 system_shared_libs: [],
5946 apex_available: ["otherapex"],
5947 }`)
5948
Paul Duffine52e66f2020-03-30 17:54:29 +01005949 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005950 apex {
5951 name: "myapex",
5952 key: "myapex.key",
5953 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005954 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005955 }
5956
5957 apex_key {
5958 name: "myapex.key",
5959 public_key: "testkey.avbpubkey",
5960 private_key: "testkey.pem",
5961 }
5962
5963 cc_library {
5964 name: "libfoo",
5965 stl: "none",
5966 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005967 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005968 apex_available: ["myapex"],
5969 }
5970
5971 cc_library {
5972 name: "libbar",
5973 stl: "none",
5974 system_shared_libs: [],
5975 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005976 }
5977
5978 cc_library {
5979 name: "libbaz",
5980 stl: "none",
5981 system_shared_libs: [],
5982 stubs: {
5983 versions: ["10", "20", "30"],
5984 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005985 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005986}
Jiyong Park127b40b2019-09-30 16:04:35 +09005987
Jiyong Park89e850a2020-04-07 16:37:39 +09005988func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005989 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005990 apex {
5991 name: "myapex",
5992 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005993 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005994 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005995 }
5996
5997 apex_key {
5998 name: "myapex.key",
5999 public_key: "testkey.avbpubkey",
6000 private_key: "testkey.pem",
6001 }
6002
6003 cc_library {
6004 name: "libfoo",
6005 stl: "none",
6006 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006007 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006008 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006009 }
6010
6011 cc_library {
6012 name: "libfoo2",
6013 stl: "none",
6014 system_shared_libs: [],
6015 shared_libs: ["libbaz"],
6016 apex_available: ["//apex_available:platform"],
6017 }
6018
6019 cc_library {
6020 name: "libbar",
6021 stl: "none",
6022 system_shared_libs: [],
6023 apex_available: ["myapex"],
6024 }
6025
6026 cc_library {
6027 name: "libbaz",
6028 stl: "none",
6029 system_shared_libs: [],
6030 apex_available: ["myapex"],
6031 stubs: {
6032 versions: ["1"],
6033 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006034 }`)
6035
Jiyong Park89e850a2020-04-07 16:37:39 +09006036 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6037 // because it depends on libbar which isn't available to platform
6038 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6039 if libfoo.NotAvailableForPlatform() != true {
6040 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6041 }
6042
6043 // libfoo2 however can be available to platform because it depends on libbaz which provides
6044 // stubs
6045 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6046 if libfoo2.NotAvailableForPlatform() == true {
6047 t.Errorf("%q should be available to platform", libfoo2.String())
6048 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006049}
Jiyong Parka90ca002019-10-07 15:47:24 +09006050
Paul Duffine52e66f2020-03-30 17:54:29 +01006051func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006052 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006053 apex {
6054 name: "myapex",
6055 key: "myapex.key",
6056 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006057 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006058 }
6059
6060 apex_key {
6061 name: "myapex.key",
6062 public_key: "testkey.avbpubkey",
6063 private_key: "testkey.pem",
6064 }
6065
6066 cc_library {
6067 name: "libfoo",
6068 stl: "none",
6069 system_shared_libs: [],
6070 apex_available: ["myapex"],
6071 static: {
6072 apex_available: ["//apex_available:platform"],
6073 },
6074 }`)
6075
Jiyong Park89e850a2020-04-07 16:37:39 +09006076 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6077 if libfooShared.NotAvailableForPlatform() != true {
6078 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6079 }
6080 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6081 if libfooStatic.NotAvailableForPlatform() != false {
6082 t.Errorf("%q should be available to platform", libfooStatic.String())
6083 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006084}
6085
Jiyong Park5d790c32019-11-15 18:40:32 +09006086func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006087 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006088 apex {
6089 name: "myapex",
6090 key: "myapex.key",
6091 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006092 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006093 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006094 bootclasspath_fragments: ["mybootclasspath_fragment"],
6095 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6096 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006097 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006098 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006099 }
6100
6101 override_apex {
6102 name: "override_myapex",
6103 base: "myapex",
6104 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08006105 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006106 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006107 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6108 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6109 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006110 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006111 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006112 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006113 key: "mynewapex.key",
6114 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006115 }
6116
6117 apex_key {
6118 name: "myapex.key",
6119 public_key: "testkey.avbpubkey",
6120 private_key: "testkey.pem",
6121 }
6122
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006123 apex_key {
6124 name: "mynewapex.key",
6125 public_key: "testkey2.avbpubkey",
6126 private_key: "testkey2.pem",
6127 }
6128
6129 android_app_certificate {
6130 name: "myapex.certificate",
6131 certificate: "testkey",
6132 }
6133
Jiyong Park5d790c32019-11-15 18:40:32 +09006134 android_app {
6135 name: "app",
6136 srcs: ["foo/bar/MyClass.java"],
6137 package_name: "foo",
6138 sdk_version: "none",
6139 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006140 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006141 }
6142
6143 override_android_app {
6144 name: "override_app",
6145 base: "app",
6146 package_name: "bar",
6147 }
markchien7c803b82021-08-26 22:10:06 +08006148
6149 bpf {
6150 name: "bpf",
6151 srcs: ["bpf.c"],
6152 }
6153
6154 bpf {
6155 name: "override_bpf",
6156 srcs: ["override_bpf.c"],
6157 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006158
6159 prebuilt_etc {
6160 name: "myetc",
6161 src: "myprebuilt",
6162 }
6163
6164 prebuilt_etc {
6165 name: "override_myetc",
6166 src: "override_myprebuilt",
6167 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006168
6169 java_library {
6170 name: "bcplib",
6171 srcs: ["a.java"],
6172 compile_dex: true,
6173 apex_available: ["myapex"],
6174 permitted_packages: ["bcp.lib"],
6175 }
6176
6177 bootclasspath_fragment {
6178 name: "mybootclasspath_fragment",
6179 contents: ["bcplib"],
6180 apex_available: ["myapex"],
6181 }
6182
6183 java_library {
6184 name: "override_bcplib",
6185 srcs: ["a.java"],
6186 compile_dex: true,
6187 apex_available: ["myapex"],
6188 permitted_packages: ["override.bcp.lib"],
6189 }
6190
6191 bootclasspath_fragment {
6192 name: "override_bootclasspath_fragment",
6193 contents: ["override_bcplib"],
6194 apex_available: ["myapex"],
6195 }
6196
6197 java_library {
6198 name: "systemserverlib",
6199 srcs: ["a.java"],
6200 apex_available: ["myapex"],
6201 }
6202
6203 systemserverclasspath_fragment {
6204 name: "mysystemserverclasspath_fragment",
6205 standalone_contents: ["systemserverlib"],
6206 apex_available: ["myapex"],
6207 }
6208
6209 java_library {
6210 name: "override_systemserverlib",
6211 srcs: ["a.java"],
6212 apex_available: ["myapex"],
6213 }
6214
6215 systemserverclasspath_fragment {
6216 name: "override_systemserverclasspath_fragment",
6217 standalone_contents: ["override_systemserverlib"],
6218 apex_available: ["myapex"],
6219 }
6220
6221 java_library {
6222 name: "myjava_library",
6223 srcs: ["a.java"],
6224 compile_dex: true,
6225 apex_available: ["myapex"],
6226 }
6227
6228 java_library {
6229 name: "override_java_library",
6230 srcs: ["a.java"],
6231 compile_dex: true,
6232 apex_available: ["myapex"],
6233 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006234 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006235
Jiyong Park317645e2019-12-05 13:20:58 +09006236 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6237 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6238 if originalVariant.GetOverriddenBy() != "" {
6239 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6240 }
6241 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6242 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6243 }
6244
Jiyong Park5d790c32019-11-15 18:40:32 +09006245 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6246 apexRule := module.Rule("apexRule")
6247 copyCmds := apexRule.Args["copy_commands"]
6248
6249 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006250 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006251
markchien7c803b82021-08-26 22:10:06 +08006252 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6253 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6254
Daniel Norman5a3ce132021-08-26 15:44:43 -07006255 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6256 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6257
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006258 apexBundle := module.Module().(*apexBundle)
6259 name := apexBundle.Name()
6260 if name != "override_myapex" {
6261 t.Errorf("name should be \"override_myapex\", but was %q", name)
6262 }
6263
Baligh Uddin004d7172020-02-19 21:29:28 -08006264 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6265 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6266 }
6267
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006268 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6269 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6270 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6271 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6272 android.AssertArrayString(t, "Java_libs does not match",
6273 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6274
Jiyong Park20bacab2020-03-03 11:45:41 +09006275 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006276 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006277 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6278
6279 signApkRule := module.Rule("signapk")
6280 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006281
Colin Crossaa255532020-07-03 13:18:24 -07006282 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006283 var builder strings.Builder
6284 data.Custom(&builder, name, "TARGET_", "", data)
6285 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006286 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006287 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006288 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006289 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6290 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6291 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006292 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006293 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006294 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006295 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006296 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006297 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006298 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6299 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6300 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006301 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006302}
6303
Jooyung Han214bf372019-11-12 13:03:50 +09006304func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006305 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006306 apex {
6307 name: "myapex",
6308 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006309 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006310 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006311 }
6312
6313 apex_key {
6314 name: "myapex.key",
6315 public_key: "testkey.avbpubkey",
6316 private_key: "testkey.pem",
6317 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006318
6319 cc_library {
6320 name: "mylib",
6321 srcs: ["mylib.cpp"],
6322 stl: "libc++",
6323 system_shared_libs: [],
6324 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006325 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006326 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006327 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006328
6329 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6330 args := module.Rule("apexRule").Args
6331 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006332 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006333
6334 // The copies of the libraries in the apex should have one more dependency than
6335 // the ones outside the apex, namely the unwinder. Ideally we should check
6336 // the dependency names directly here but for some reason the names are blank in
6337 // this test.
6338 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006339 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006340 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6341 if len(apexImplicits) != len(nonApexImplicits)+1 {
6342 t.Errorf("%q missing unwinder dep", lib)
6343 }
6344 }
Jooyung Han214bf372019-11-12 13:03:50 +09006345}
6346
Paul Duffine05480a2021-03-08 15:07:14 +00006347var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006348 "api/current.txt": nil,
6349 "api/removed.txt": nil,
6350 "api/system-current.txt": nil,
6351 "api/system-removed.txt": nil,
6352 "api/test-current.txt": nil,
6353 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006354
Anton Hanssondff2c782020-12-21 17:10:01 +00006355 "100/public/api/foo.txt": nil,
6356 "100/public/api/foo-removed.txt": nil,
6357 "100/system/api/foo.txt": nil,
6358 "100/system/api/foo-removed.txt": nil,
6359
Paul Duffineedc5d52020-06-12 17:46:39 +01006360 // For java_sdk_library_import
6361 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006362}
6363
Jooyung Han58f26ab2019-12-18 15:34:32 +09006364func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006365 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006366 apex {
6367 name: "myapex",
6368 key: "myapex.key",
6369 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006370 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006371 }
6372
6373 apex_key {
6374 name: "myapex.key",
6375 public_key: "testkey.avbpubkey",
6376 private_key: "testkey.pem",
6377 }
6378
6379 java_sdk_library {
6380 name: "foo",
6381 srcs: ["a.java"],
6382 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006383 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006384 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006385
6386 prebuilt_apis {
6387 name: "sdk",
6388 api_dirs: ["100"],
6389 }
Paul Duffin9b879592020-05-26 13:21:35 +01006390 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006391
6392 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006393 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006394 "javalib/foo.jar",
6395 "etc/permissions/foo.xml",
6396 })
6397 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006398 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006399 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 +09006400}
6401
Paul Duffin9b879592020-05-26 13:21:35 +01006402func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006403 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006404 apex {
6405 name: "myapex",
6406 key: "myapex.key",
6407 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006408 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006409 }
6410
6411 apex_key {
6412 name: "myapex.key",
6413 public_key: "testkey.avbpubkey",
6414 private_key: "testkey.pem",
6415 }
6416
6417 java_sdk_library {
6418 name: "foo",
6419 srcs: ["a.java"],
6420 api_packages: ["foo"],
6421 apex_available: ["myapex"],
6422 sdk_version: "none",
6423 system_modules: "none",
6424 }
6425
6426 java_library {
6427 name: "bar",
6428 srcs: ["a.java"],
6429 libs: ["foo"],
6430 apex_available: ["myapex"],
6431 sdk_version: "none",
6432 system_modules: "none",
6433 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006434
6435 prebuilt_apis {
6436 name: "sdk",
6437 api_dirs: ["100"],
6438 }
Paul Duffin9b879592020-05-26 13:21:35 +01006439 `, withFiles(filesForSdkLibrary))
6440
6441 // java_sdk_library installs both impl jar and permission XML
6442 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6443 "javalib/bar.jar",
6444 "javalib/foo.jar",
6445 "etc/permissions/foo.xml",
6446 })
6447
6448 // The bar library should depend on the implementation jar.
6449 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006450 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006451 t.Errorf("expected %q, found %#q", expected, actual)
6452 }
6453}
6454
6455func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006456 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006457 apex {
6458 name: "myapex",
6459 key: "myapex.key",
6460 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006461 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006462 }
6463
6464 apex_key {
6465 name: "myapex.key",
6466 public_key: "testkey.avbpubkey",
6467 private_key: "testkey.pem",
6468 }
6469
6470 java_sdk_library {
6471 name: "foo",
6472 srcs: ["a.java"],
6473 api_packages: ["foo"],
6474 apex_available: ["myapex"],
6475 sdk_version: "none",
6476 system_modules: "none",
6477 }
6478
6479 java_library {
6480 name: "bar",
6481 srcs: ["a.java"],
6482 libs: ["foo"],
6483 sdk_version: "none",
6484 system_modules: "none",
6485 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006486
6487 prebuilt_apis {
6488 name: "sdk",
6489 api_dirs: ["100"],
6490 }
Paul Duffin9b879592020-05-26 13:21:35 +01006491 `, withFiles(filesForSdkLibrary))
6492
6493 // java_sdk_library installs both impl jar and permission XML
6494 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6495 "javalib/foo.jar",
6496 "etc/permissions/foo.xml",
6497 })
6498
6499 // The bar library should depend on the stubs jar.
6500 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006501 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006502 t.Errorf("expected %q, found %#q", expected, actual)
6503 }
6504}
6505
Paul Duffineedc5d52020-06-12 17:46:39 +01006506func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006507 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006508 prebuilt_apis {
6509 name: "sdk",
6510 api_dirs: ["100"],
6511 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006512 withFiles(map[string][]byte{
6513 "apex/a.java": nil,
6514 "apex/apex_manifest.json": nil,
6515 "apex/Android.bp": []byte(`
6516 package {
6517 default_visibility: ["//visibility:private"],
6518 }
6519
6520 apex {
6521 name: "myapex",
6522 key: "myapex.key",
6523 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006524 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006525 }
6526
6527 apex_key {
6528 name: "myapex.key",
6529 public_key: "testkey.avbpubkey",
6530 private_key: "testkey.pem",
6531 }
6532
6533 java_library {
6534 name: "bar",
6535 srcs: ["a.java"],
6536 libs: ["foo"],
6537 apex_available: ["myapex"],
6538 sdk_version: "none",
6539 system_modules: "none",
6540 }
6541`),
6542 "source/a.java": nil,
6543 "source/api/current.txt": nil,
6544 "source/api/removed.txt": nil,
6545 "source/Android.bp": []byte(`
6546 package {
6547 default_visibility: ["//visibility:private"],
6548 }
6549
6550 java_sdk_library {
6551 name: "foo",
6552 visibility: ["//apex"],
6553 srcs: ["a.java"],
6554 api_packages: ["foo"],
6555 apex_available: ["myapex"],
6556 sdk_version: "none",
6557 system_modules: "none",
6558 public: {
6559 enabled: true,
6560 },
6561 }
6562`),
6563 "prebuilt/a.jar": nil,
6564 "prebuilt/Android.bp": []byte(`
6565 package {
6566 default_visibility: ["//visibility:private"],
6567 }
6568
6569 java_sdk_library_import {
6570 name: "foo",
6571 visibility: ["//apex", "//source"],
6572 apex_available: ["myapex"],
6573 prefer: true,
6574 public: {
6575 jars: ["a.jar"],
6576 },
6577 }
6578`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006579 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006580 )
6581
6582 // java_sdk_library installs both impl jar and permission XML
6583 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6584 "javalib/bar.jar",
6585 "javalib/foo.jar",
6586 "etc/permissions/foo.xml",
6587 })
6588
6589 // The bar library should depend on the implementation jar.
6590 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006591 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006592 t.Errorf("expected %q, found %#q", expected, actual)
6593 }
6594}
6595
6596func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6597 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6598 apex {
6599 name: "myapex",
6600 key: "myapex.key",
6601 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006602 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006603 }
6604
6605 apex_key {
6606 name: "myapex.key",
6607 public_key: "testkey.avbpubkey",
6608 private_key: "testkey.pem",
6609 }
6610
6611 java_sdk_library_import {
6612 name: "foo",
6613 apex_available: ["myapex"],
6614 prefer: true,
6615 public: {
6616 jars: ["a.jar"],
6617 },
6618 }
6619
6620 `, withFiles(filesForSdkLibrary))
6621}
6622
atrost6e126252020-01-27 17:01:16 +00006623func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006624 result := android.GroupFixturePreparers(
6625 prepareForApexTest,
6626 java.PrepareForTestWithPlatformCompatConfig,
6627 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006628 apex {
6629 name: "myapex",
6630 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006631 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006632 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006633 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006634 }
6635
6636 apex_key {
6637 name: "myapex.key",
6638 public_key: "testkey.avbpubkey",
6639 private_key: "testkey.pem",
6640 }
6641
6642 platform_compat_config {
6643 name: "myjar-platform-compat-config",
6644 src: ":myjar",
6645 }
6646
6647 java_library {
6648 name: "myjar",
6649 srcs: ["foo/bar/MyClass.java"],
6650 sdk_version: "none",
6651 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006652 apex_available: [ "myapex" ],
6653 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006654
6655 // Make sure that a preferred prebuilt does not affect the apex contents.
6656 prebuilt_platform_compat_config {
6657 name: "myjar-platform-compat-config",
6658 metadata: "compat-config/metadata.xml",
6659 prefer: true,
6660 }
atrost6e126252020-01-27 17:01:16 +00006661 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006662 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006663 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6664 "etc/compatconfig/myjar-platform-compat-config.xml",
6665 "javalib/myjar.jar",
6666 })
6667}
6668
Jiyong Park479321d2019-12-16 11:47:12 +09006669func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6670 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6671 apex {
6672 name: "myapex",
6673 key: "myapex.key",
6674 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006675 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006676 }
6677
6678 apex_key {
6679 name: "myapex.key",
6680 public_key: "testkey.avbpubkey",
6681 private_key: "testkey.pem",
6682 }
6683
6684 java_library {
6685 name: "myjar",
6686 srcs: ["foo/bar/MyClass.java"],
6687 sdk_version: "none",
6688 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006689 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006690 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006691 }
6692 `)
6693}
6694
Jiyong Park7afd1072019-12-30 16:56:33 +09006695func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006696 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006697 apex {
6698 name: "myapex",
6699 key: "myapex.key",
6700 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006701 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006702 }
6703
6704 apex_key {
6705 name: "myapex.key",
6706 public_key: "testkey.avbpubkey",
6707 private_key: "testkey.pem",
6708 }
6709
6710 cc_library {
6711 name: "mylib",
6712 srcs: ["mylib.cpp"],
6713 system_shared_libs: [],
6714 stl: "none",
6715 required: ["a", "b"],
6716 host_required: ["c", "d"],
6717 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006718 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006719 }
6720 `)
6721
6722 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006723 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006724 name := apexBundle.BaseModuleName()
6725 prefix := "TARGET_"
6726 var builder strings.Builder
6727 data.Custom(&builder, name, prefix, "", data)
6728 androidMk := builder.String()
6729 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6730 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6731 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6732}
6733
Jiyong Park7cd10e32020-01-14 09:22:18 +09006734func TestSymlinksFromApexToSystem(t *testing.T) {
6735 bp := `
6736 apex {
6737 name: "myapex",
6738 key: "myapex.key",
6739 native_shared_libs: ["mylib"],
6740 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006741 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006742 }
6743
Jiyong Park9d677202020-02-19 16:29:35 +09006744 apex {
6745 name: "myapex.updatable",
6746 key: "myapex.key",
6747 native_shared_libs: ["mylib"],
6748 java_libs: ["myjar"],
6749 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006750 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006751 }
6752
Jiyong Park7cd10e32020-01-14 09:22:18 +09006753 apex_key {
6754 name: "myapex.key",
6755 public_key: "testkey.avbpubkey",
6756 private_key: "testkey.pem",
6757 }
6758
6759 cc_library {
6760 name: "mylib",
6761 srcs: ["mylib.cpp"],
6762 shared_libs: ["myotherlib"],
6763 system_shared_libs: [],
6764 stl: "none",
6765 apex_available: [
6766 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006767 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006768 "//apex_available:platform",
6769 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006770 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006771 }
6772
6773 cc_library {
6774 name: "myotherlib",
6775 srcs: ["mylib.cpp"],
6776 system_shared_libs: [],
6777 stl: "none",
6778 apex_available: [
6779 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006780 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006781 "//apex_available:platform",
6782 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006783 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006784 }
6785
6786 java_library {
6787 name: "myjar",
6788 srcs: ["foo/bar/MyClass.java"],
6789 sdk_version: "none",
6790 system_modules: "none",
6791 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006792 apex_available: [
6793 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006794 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006795 "//apex_available:platform",
6796 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006797 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006798 }
6799
6800 java_library {
6801 name: "myotherjar",
6802 srcs: ["foo/bar/MyClass.java"],
6803 sdk_version: "none",
6804 system_modules: "none",
6805 apex_available: [
6806 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006807 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006808 "//apex_available:platform",
6809 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006810 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006811 }
6812 `
6813
6814 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6815 for _, f := range files {
6816 if f.path == file {
6817 if f.isLink {
6818 t.Errorf("%q is not a real file", file)
6819 }
6820 return
6821 }
6822 }
6823 t.Errorf("%q is not found", file)
6824 }
6825
6826 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6827 for _, f := range files {
6828 if f.path == file {
6829 if !f.isLink {
6830 t.Errorf("%q is not a symlink", file)
6831 }
6832 return
6833 }
6834 }
6835 t.Errorf("%q is not found", file)
6836 }
6837
Jiyong Park9d677202020-02-19 16:29:35 +09006838 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6839 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006840 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006841 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006842 ensureRealfileExists(t, files, "javalib/myjar.jar")
6843 ensureRealfileExists(t, files, "lib64/mylib.so")
6844 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6845
Jiyong Park9d677202020-02-19 16:29:35 +09006846 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6847 ensureRealfileExists(t, files, "javalib/myjar.jar")
6848 ensureRealfileExists(t, files, "lib64/mylib.so")
6849 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6850
6851 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006852 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006853 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006854 ensureRealfileExists(t, files, "javalib/myjar.jar")
6855 ensureRealfileExists(t, files, "lib64/mylib.so")
6856 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006857
6858 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6859 ensureRealfileExists(t, files, "javalib/myjar.jar")
6860 ensureRealfileExists(t, files, "lib64/mylib.so")
6861 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006862}
6863
Yo Chiange8128052020-07-23 20:09:18 +08006864func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006865 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006866 apex {
6867 name: "myapex",
6868 key: "myapex.key",
6869 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006870 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006871 }
6872
6873 apex_key {
6874 name: "myapex.key",
6875 public_key: "testkey.avbpubkey",
6876 private_key: "testkey.pem",
6877 }
6878
6879 cc_library_shared {
6880 name: "mylib",
6881 srcs: ["mylib.cpp"],
6882 shared_libs: ["myotherlib"],
6883 system_shared_libs: [],
6884 stl: "none",
6885 apex_available: [
6886 "myapex",
6887 "//apex_available:platform",
6888 ],
6889 }
6890
6891 cc_prebuilt_library_shared {
6892 name: "myotherlib",
6893 srcs: ["prebuilt.so"],
6894 system_shared_libs: [],
6895 stl: "none",
6896 apex_available: [
6897 "myapex",
6898 "//apex_available:platform",
6899 ],
6900 }
6901 `)
6902
6903 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006904 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006905 var builder strings.Builder
6906 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6907 androidMk := builder.String()
6908 // `myotherlib` is added to `myapex` as symlink
6909 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6910 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6911 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6912 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006913 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 +08006914}
6915
Jooyung Han643adc42020-02-27 13:50:06 +09006916func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006917 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006918 apex {
6919 name: "myapex",
6920 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09006921 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006922 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006923 }
6924
6925 apex_key {
6926 name: "myapex.key",
6927 public_key: "testkey.avbpubkey",
6928 private_key: "testkey.pem",
6929 }
6930
6931 cc_library {
6932 name: "mylib",
6933 srcs: ["mylib.cpp"],
6934 shared_libs: ["mylib2"],
6935 system_shared_libs: [],
6936 stl: "none",
6937 apex_available: [ "myapex" ],
6938 }
6939
6940 cc_library {
6941 name: "mylib2",
6942 srcs: ["mylib.cpp"],
6943 system_shared_libs: [],
6944 stl: "none",
6945 apex_available: [ "myapex" ],
6946 }
Jiyong Park34d5c332022-02-24 18:02:44 +09006947
6948 rust_ffi_shared {
6949 name: "libfoo.rust",
6950 crate_name: "foo",
6951 srcs: ["foo.rs"],
6952 shared_libs: ["libfoo.shared_from_rust"],
6953 prefer_rlib: true,
6954 apex_available: ["myapex"],
6955 }
6956
6957 cc_library_shared {
6958 name: "libfoo.shared_from_rust",
6959 srcs: ["mylib.cpp"],
6960 system_shared_libs: [],
6961 stl: "none",
6962 stubs: {
6963 versions: ["10", "11", "12"],
6964 },
6965 }
6966
Jooyung Han643adc42020-02-27 13:50:06 +09006967 `)
6968
6969 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6970 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09006971 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09006972 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6973 "lib64/mylib.so",
6974 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09006975 "lib64/libfoo.rust.so",
6976 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
6977 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09006978 })
Jiyong Park34d5c332022-02-24 18:02:44 +09006979
6980 // b/220397949
6981 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09006982}
6983
Jooyung Han49f67012020-04-17 13:43:10 +09006984func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006985 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006986 apex {
6987 name: "myapex",
6988 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006989 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006990 }
6991 apex_key {
6992 name: "myapex.key",
6993 public_key: "testkey.avbpubkey",
6994 private_key: "testkey.pem",
6995 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006996 `,
6997 android.FixtureModifyConfig(func(config android.Config) {
6998 delete(config.Targets, android.Android)
6999 config.AndroidCommonTarget = android.Target{}
7000 }),
7001 )
Jooyung Han49f67012020-04-17 13:43:10 +09007002
7003 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7004 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7005 }
7006}
7007
Jiyong Parkbd159612020-02-28 15:22:21 +09007008func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007009 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007010 apex {
7011 name: "myapex",
7012 key: "myapex.key",
7013 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007014 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007015 }
7016
7017 apex_key {
7018 name: "myapex.key",
7019 public_key: "testkey.avbpubkey",
7020 private_key: "testkey.pem",
7021 }
7022
7023 android_app {
7024 name: "AppFoo",
7025 srcs: ["foo/bar/MyClass.java"],
7026 sdk_version: "none",
7027 system_modules: "none",
7028 apex_available: [ "myapex" ],
7029 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007030 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007031
Colin Crosscf371cc2020-11-13 11:48:42 -08007032 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007033 content := bundleConfigRule.Args["content"]
7034
7035 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007036 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 +09007037}
7038
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007039func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007040 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007041 apex {
7042 name: "myapex",
7043 key: "myapex.key",
7044 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007045 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007046 }
7047
7048 apex_key {
7049 name: "myapex.key",
7050 public_key: "testkey.avbpubkey",
7051 private_key: "testkey.pem",
7052 }
7053
7054 android_app_set {
7055 name: "AppSet",
7056 set: "AppSet.apks",
7057 }`)
7058 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007059 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007060 content := bundleConfigRule.Args["content"]
7061 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7062 s := mod.Rule("apexRule").Args["copy_commands"]
7063 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
7064 if len(copyCmds) != 3 {
7065 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
7066 }
7067 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
7068 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
7069 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
7070}
7071
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007072func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007073 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007074 apex_set {
7075 name: "myapex",
7076 filename: "foo_v2.apex",
7077 sanitized: {
7078 none: { set: "myapex.apks", },
7079 hwaddress: { set: "myapex.hwasan.apks", },
7080 },
Paul Duffin24704672021-04-06 16:09:30 +01007081 }
7082 `
7083 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007084
Paul Duffin24704672021-04-06 16:09:30 +01007085 // Check that the extractor produces the correct output file from the correct input file.
7086 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007087
Paul Duffin24704672021-04-06 16:09:30 +01007088 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7089 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007090
Paul Duffin24704672021-04-06 16:09:30 +01007091 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7092
7093 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007094 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7095 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007096
7097 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007098}
7099
Paul Duffin89f570a2021-06-16 01:42:33 +01007100func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007101 t.Helper()
7102
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007103 bp := `
7104 java_library {
7105 name: "some-updatable-apex-lib",
7106 srcs: ["a.java"],
7107 sdk_version: "current",
7108 apex_available: [
7109 "some-updatable-apex",
7110 ],
satayevabcd5972021-08-06 17:49:46 +01007111 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007112 }
7113
7114 java_library {
7115 name: "some-non-updatable-apex-lib",
7116 srcs: ["a.java"],
7117 apex_available: [
7118 "some-non-updatable-apex",
7119 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007120 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007121 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007122 }
7123
7124 bootclasspath_fragment {
7125 name: "some-non-updatable-fragment",
7126 contents: ["some-non-updatable-apex-lib"],
7127 apex_available: [
7128 "some-non-updatable-apex",
7129 ],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007130 }
7131
7132 java_library {
7133 name: "some-platform-lib",
7134 srcs: ["a.java"],
7135 sdk_version: "current",
7136 installable: true,
7137 }
7138
7139 java_library {
7140 name: "some-art-lib",
7141 srcs: ["a.java"],
7142 sdk_version: "current",
7143 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007144 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007145 ],
7146 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007147 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007148 }
7149
7150 apex {
7151 name: "some-updatable-apex",
7152 key: "some-updatable-apex.key",
7153 java_libs: ["some-updatable-apex-lib"],
7154 updatable: true,
7155 min_sdk_version: "current",
7156 }
7157
7158 apex {
7159 name: "some-non-updatable-apex",
7160 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007161 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007162 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007163 }
7164
7165 apex_key {
7166 name: "some-updatable-apex.key",
7167 }
7168
7169 apex_key {
7170 name: "some-non-updatable-apex.key",
7171 }
7172
7173 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007174 name: "com.android.art.debug",
7175 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007176 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007177 updatable: true,
7178 min_sdk_version: "current",
7179 }
7180
Paul Duffinf23bc472021-04-27 12:42:20 +01007181 bootclasspath_fragment {
7182 name: "art-bootclasspath-fragment",
7183 image_name: "art",
7184 contents: ["some-art-lib"],
7185 apex_available: [
7186 "com.android.art.debug",
7187 ],
7188 }
7189
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007190 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007191 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007192 }
7193
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007194 filegroup {
7195 name: "some-updatable-apex-file_contexts",
7196 srcs: [
7197 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7198 ],
7199 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007200
7201 filegroup {
7202 name: "some-non-updatable-apex-file_contexts",
7203 srcs: [
7204 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7205 ],
7206 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007207 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007208
Paul Duffin89f570a2021-06-16 01:42:33 +01007209 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007210}
7211
Paul Duffin89f570a2021-06-16 01:42:33 +01007212func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007213 t.Helper()
7214
Paul Duffin55607122021-03-30 23:32:51 +01007215 fs := android.MockFS{
7216 "a.java": nil,
7217 "a.jar": nil,
7218 "apex_manifest.json": nil,
7219 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007220 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007221 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7222 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7223 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007224 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007225 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007226
Paul Duffin55607122021-03-30 23:32:51 +01007227 errorHandler := android.FixtureExpectsNoErrors
7228 if errmsg != "" {
7229 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007230 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007231
Paul Duffin55607122021-03-30 23:32:51 +01007232 result := android.GroupFixturePreparers(
7233 cc.PrepareForTestWithCcDefaultModules,
7234 java.PrepareForTestWithHiddenApiBuildComponents,
7235 java.PrepareForTestWithJavaDefaultModules,
7236 java.PrepareForTestWithJavaSdkLibraryFiles,
7237 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007238 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007239 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007240 android.FixtureModifyMockFS(func(fs android.MockFS) {
7241 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7242 insert := ""
7243 for _, fragment := range fragments {
7244 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7245 }
7246 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7247 platform_bootclasspath {
7248 name: "platform-bootclasspath",
7249 fragments: [
7250 %s
7251 ],
7252 }
7253 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007254 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007255 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007256 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007257 ).
7258 ExtendWithErrorHandler(errorHandler).
7259 RunTestWithBp(t, bp)
7260
7261 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007262}
7263
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007264func TestDuplicateDeapexeresFromPrebuiltApexes(t *testing.T) {
7265 preparers := android.GroupFixturePreparers(
7266 java.PrepareForTestWithJavaDefaultModules,
7267 PrepareForTestWithApexBuildComponents,
7268 ).
7269 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7270 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7271
7272 bpBase := `
7273 apex_set {
7274 name: "com.android.myapex",
7275 installable: true,
7276 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7277 set: "myapex.apks",
7278 }
7279
7280 apex_set {
7281 name: "com.mycompany.android.myapex",
7282 apex_name: "com.android.myapex",
7283 installable: true,
7284 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7285 set: "company-myapex.apks",
7286 }
7287
7288 prebuilt_bootclasspath_fragment {
7289 name: "my-bootclasspath-fragment",
7290 apex_available: ["com.android.myapex"],
7291 %s
7292 }
7293 `
7294
7295 t.Run("java_import", func(t *testing.T) {
7296 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7297 java_import {
7298 name: "libfoo",
7299 jars: ["libfoo.jar"],
7300 apex_available: ["com.android.myapex"],
7301 }
7302 `)
7303 })
7304
7305 t.Run("java_sdk_library_import", func(t *testing.T) {
7306 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7307 java_sdk_library_import {
7308 name: "libfoo",
7309 public: {
7310 jars: ["libbar.jar"],
7311 },
7312 apex_available: ["com.android.myapex"],
7313 }
7314 `)
7315 })
7316
7317 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7318 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7319 image_name: "art",
7320 contents: ["libfoo"],
7321 `)+`
7322 java_sdk_library_import {
7323 name: "libfoo",
7324 public: {
7325 jars: ["libbar.jar"],
7326 },
7327 apex_available: ["com.android.myapex"],
7328 }
7329 `)
7330 })
7331}
7332
Jooyung Han548640b2020-04-27 12:10:30 +09007333func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7334 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7335 apex {
7336 name: "myapex",
7337 key: "myapex.key",
7338 updatable: true,
7339 }
7340
7341 apex_key {
7342 name: "myapex.key",
7343 public_key: "testkey.avbpubkey",
7344 private_key: "testkey.pem",
7345 }
7346 `)
7347}
7348
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007349func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7350 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7351 apex {
7352 name: "myapex",
7353 key: "myapex.key",
7354 }
7355
7356 apex_key {
7357 name: "myapex.key",
7358 public_key: "testkey.avbpubkey",
7359 private_key: "testkey.pem",
7360 }
7361 `)
7362}
7363
Daniel Norman69109112021-12-02 12:52:42 -08007364func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7365 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7366 apex {
7367 name: "myapex",
7368 key: "myapex.key",
7369 updatable: true,
7370 soc_specific: true,
7371 }
7372
7373 apex_key {
7374 name: "myapex.key",
7375 public_key: "testkey.avbpubkey",
7376 private_key: "testkey.pem",
7377 }
7378 `)
7379}
7380
satayevb98371c2021-06-15 16:49:50 +01007381func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7382 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7383 apex {
7384 name: "myapex",
7385 key: "myapex.key",
7386 systemserverclasspath_fragments: [
7387 "mysystemserverclasspathfragment",
7388 ],
7389 min_sdk_version: "29",
7390 updatable: true,
7391 }
7392
7393 apex_key {
7394 name: "myapex.key",
7395 public_key: "testkey.avbpubkey",
7396 private_key: "testkey.pem",
7397 }
7398
7399 java_library {
7400 name: "foo",
7401 srcs: ["b.java"],
7402 min_sdk_version: "29",
7403 installable: true,
7404 apex_available: [
7405 "myapex",
7406 ],
7407 }
7408
7409 systemserverclasspath_fragment {
7410 name: "mysystemserverclasspathfragment",
7411 generate_classpaths_proto: false,
7412 contents: [
7413 "foo",
7414 ],
7415 apex_available: [
7416 "myapex",
7417 ],
7418 }
satayevabcd5972021-08-06 17:49:46 +01007419 `,
7420 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7421 )
satayevb98371c2021-06-15 16:49:50 +01007422}
7423
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007424func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007425 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7426 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7427 // modules to be included in the BootJars.
7428 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7429 return android.GroupFixturePreparers(
7430 dexpreopt.FixtureSetBootJars(bootJars...),
7431 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7432 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7433 }),
7434 )
7435 }
7436
7437 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7438 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7439 // specified in the ArtApexJars configuration.
7440 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7441 return android.GroupFixturePreparers(
7442 dexpreopt.FixtureSetArtBootJars(bootJars...),
7443 dexpreopt.FixtureSetBootJars(bootJars...),
7444 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7445 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7446 }),
7447 )
7448 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007449
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007450 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007451 preparer := android.GroupFixturePreparers(
7452 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7453 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7454 )
7455 fragments := []java.ApexVariantReference{
7456 {
7457 Apex: proptools.StringPtr("com.android.art.debug"),
7458 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7459 },
7460 {
7461 Apex: proptools.StringPtr("some-non-updatable-apex"),
7462 Module: proptools.StringPtr("some-non-updatable-fragment"),
7463 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007464 }
satayevabcd5972021-08-06 17:49:46 +01007465 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007466 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007467
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007468 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007469 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7470 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007471 preparer := android.GroupFixturePreparers(
7472 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7473 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7474 )
Paul Duffin60264a02021-04-12 20:02:36 +01007475 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007476 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007477
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007478 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 +01007479 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 +01007480 // Update the dexpreopt ArtApexJars directly.
7481 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7482 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007483 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007484
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007485 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 +01007486 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 +01007487 // Update the dexpreopt ArtApexJars directly.
7488 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7489 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007490 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007491
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007492 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 +01007493 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 +01007494 preparer := android.GroupFixturePreparers(
7495 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7496 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7497 )
Paul Duffin60264a02021-04-12 20:02:36 +01007498 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007499 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007500
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007501 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 +01007502 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007503 fragment := java.ApexVariantReference{
7504 Apex: proptools.StringPtr("some-non-updatable-apex"),
7505 Module: proptools.StringPtr("some-non-updatable-fragment"),
7506 }
7507 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007508 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007509
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007510 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007511 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007512 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7513 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007514 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007515
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007516 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007517 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007518 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7519 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007520 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007521
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007522 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007523 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007524 // Update the dexpreopt ArtApexJars directly.
7525 preparer := prepareSetArtJars("platform:some-platform-lib")
7526 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007527 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007528
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007529 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007530 preparer := android.GroupFixturePreparers(
7531 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7532 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7533 )
7534 fragments := []java.ApexVariantReference{
7535 {
7536 Apex: proptools.StringPtr("some-non-updatable-apex"),
7537 Module: proptools.StringPtr("some-non-updatable-fragment"),
7538 },
7539 }
7540 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007541 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007542}
7543
7544func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007545 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007546 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007547 fragment := java.ApexVariantReference{
7548 Apex: proptools.StringPtr("myapex"),
7549 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7550 }
7551
Paul Duffin064b70c2020-11-02 17:32:38 +00007552 testDexpreoptWithApexes(t, `
7553 prebuilt_apex {
7554 name: "myapex" ,
7555 arch: {
7556 arm64: {
7557 src: "myapex-arm64.apex",
7558 },
7559 arm: {
7560 src: "myapex-arm.apex",
7561 },
7562 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007563 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7564 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007565
Paul Duffin89f570a2021-06-16 01:42:33 +01007566 prebuilt_bootclasspath_fragment {
7567 name: "my-bootclasspath-fragment",
7568 contents: ["libfoo"],
7569 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007570 hidden_api: {
7571 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7572 metadata: "my-bootclasspath-fragment/metadata.csv",
7573 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007574 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7575 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7576 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007577 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007578 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007579
Paul Duffin89f570a2021-06-16 01:42:33 +01007580 java_import {
7581 name: "libfoo",
7582 jars: ["libfoo.jar"],
7583 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007584 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007585 }
7586 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007587 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007588}
7589
satayevd604b212021-07-21 14:23:52 +01007590func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007591 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007592 bp += `
7593 apex_key {
7594 name: "myapex.key",
7595 public_key: "testkey.avbpubkey",
7596 private_key: "testkey.pem",
7597 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007598 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007599 "lib1/src/A.java": nil,
7600 "lib2/src/B.java": nil,
7601 "system/sepolicy/apex/myapex-file_contexts": nil,
7602 }
7603
Paul Duffin45338f02021-03-30 23:07:52 +01007604 errorHandler := android.FixtureExpectsNoErrors
7605 if errmsg != "" {
7606 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007607 }
Colin Crossae8600b2020-10-29 17:09:13 -07007608
Paul Duffin45338f02021-03-30 23:07:52 +01007609 android.GroupFixturePreparers(
7610 android.PrepareForTestWithAndroidBuildComponents,
7611 java.PrepareForTestWithJavaBuildComponents,
7612 PrepareForTestWithApexBuildComponents,
7613 android.PrepareForTestWithNeverallowRules(rules),
7614 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007615 apexBootJars := make([]string, 0, len(bootJars))
7616 for _, apexBootJar := range bootJars {
7617 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007618 }
satayevd604b212021-07-21 14:23:52 +01007619 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007620 }),
7621 fs.AddToFixture(),
7622 ).
7623 ExtendWithErrorHandler(errorHandler).
7624 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007625}
7626
7627func TestApexPermittedPackagesRules(t *testing.T) {
7628 testcases := []struct {
7629 name string
7630 expectedError string
7631 bp string
7632 bootJars []string
7633 modulesPackages map[string][]string
7634 }{
7635
7636 {
7637 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7638 expectedError: "",
7639 bp: `
7640 java_library {
7641 name: "bcp_lib1",
7642 srcs: ["lib1/src/*.java"],
7643 permitted_packages: ["foo.bar"],
7644 apex_available: ["myapex"],
7645 sdk_version: "none",
7646 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007647 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007648 }
7649 java_library {
7650 name: "nonbcp_lib2",
7651 srcs: ["lib2/src/*.java"],
7652 apex_available: ["myapex"],
7653 permitted_packages: ["a.b"],
7654 sdk_version: "none",
7655 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007656 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007657 }
7658 apex {
7659 name: "myapex",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007660 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007661 key: "myapex.key",
7662 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007663 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007664 }`,
7665 bootJars: []string{"bcp_lib1"},
7666 modulesPackages: map[string][]string{
7667 "myapex": []string{
7668 "foo.bar",
7669 },
7670 },
7671 },
7672 {
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007673 name: "Bootclasspath apex jar not satisfying allowed module packages on Q.",
Andrei Onead967aee2022-01-19 15:36:40 +00007674 expectedError: `(?s)module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only use these package prefixes: foo.bar with min_sdk < T. Please consider the following alternatives:\n 1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library. 2. Move the offending code into an allowed package.\n 3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`,
Andrei Onea115e7e72020-06-05 21:14:03 +01007675 bp: `
7676 java_library {
7677 name: "bcp_lib1",
7678 srcs: ["lib1/src/*.java"],
7679 apex_available: ["myapex"],
7680 permitted_packages: ["foo.bar"],
7681 sdk_version: "none",
7682 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007683 min_sdk_version: "29",
Andrei Onea115e7e72020-06-05 21:14:03 +01007684 }
7685 java_library {
7686 name: "bcp_lib2",
7687 srcs: ["lib2/src/*.java"],
7688 apex_available: ["myapex"],
7689 permitted_packages: ["foo.bar", "bar.baz"],
7690 sdk_version: "none",
7691 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007692 min_sdk_version: "29",
Andrei Onea115e7e72020-06-05 21:14:03 +01007693 }
7694 apex {
7695 name: "myapex",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007696 min_sdk_version: "29",
7697 key: "myapex.key",
7698 java_libs: ["bcp_lib1", "bcp_lib2"],
7699 updatable: false,
7700 }
7701 `,
7702 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7703 modulesPackages: map[string][]string{
7704 "myapex": []string{
7705 "foo.bar",
7706 },
7707 },
7708 },
7709 {
7710 name: "Bootclasspath apex jar not satisfying allowed module packages on R.",
Andrei Onead967aee2022-01-19 15:36:40 +00007711 expectedError: `(?s)module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only use these package prefixes: foo.bar with min_sdk < T. Please consider the following alternatives:\n 1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library. 2. Move the offending code into an allowed package.\n 3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`,
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007712 bp: `
7713 java_library {
7714 name: "bcp_lib1",
7715 srcs: ["lib1/src/*.java"],
7716 apex_available: ["myapex"],
7717 permitted_packages: ["foo.bar"],
7718 sdk_version: "none",
7719 system_modules: "none",
7720 min_sdk_version: "30",
7721 }
7722 java_library {
7723 name: "bcp_lib2",
7724 srcs: ["lib2/src/*.java"],
7725 apex_available: ["myapex"],
7726 permitted_packages: ["foo.bar", "bar.baz"],
7727 sdk_version: "none",
7728 system_modules: "none",
7729 min_sdk_version: "30",
7730 }
7731 apex {
7732 name: "myapex",
7733 min_sdk_version: "30",
7734 key: "myapex.key",
7735 java_libs: ["bcp_lib1", "bcp_lib2"],
7736 updatable: false,
7737 }
7738 `,
7739 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7740 modulesPackages: map[string][]string{
7741 "myapex": []string{
7742 "foo.bar",
7743 },
7744 },
7745 },
7746 {
7747 name: "Bootclasspath apex jar >= T not satisfying Q/R/S allowed module packages.",
7748 expectedError: "",
7749 bp: `
7750 java_library {
7751 name: "bcp_lib1",
7752 srcs: ["lib1/src/*.java"],
7753 apex_available: ["myapex"],
7754 permitted_packages: ["foo.bar"],
7755 sdk_version: "none",
7756 system_modules: "none",
7757 min_sdk_version: "current",
7758 }
7759 java_library {
7760 name: "bcp_lib2",
7761 srcs: ["lib2/src/*.java"],
7762 apex_available: ["myapex"],
7763 permitted_packages: ["foo.bar", "bar.baz"],
7764 sdk_version: "none",
7765 system_modules: "none",
7766 min_sdk_version: "current",
7767 }
7768 apex {
7769 name: "myapex",
7770 min_sdk_version: "current",
Andrei Onea115e7e72020-06-05 21:14:03 +01007771 key: "myapex.key",
7772 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007773 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007774 }
7775 `,
7776 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7777 modulesPackages: map[string][]string{
7778 "myapex": []string{
7779 "foo.bar",
7780 },
7781 },
7782 },
7783 }
7784 for _, tc := range testcases {
7785 t.Run(tc.name, func(t *testing.T) {
7786 rules := createApexPermittedPackagesRules(tc.modulesPackages)
7787 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
7788 })
7789 }
7790}
7791
Jiyong Park62304bb2020-04-13 16:19:48 +09007792func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007793 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09007794 apex {
7795 name: "myapex",
7796 key: "myapex.key",
7797 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007798 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09007799 }
7800
7801 apex_key {
7802 name: "myapex.key",
7803 public_key: "testkey.avbpubkey",
7804 private_key: "testkey.pem",
7805 }
7806
7807 cc_library {
7808 name: "mylib",
7809 srcs: ["mylib.cpp"],
7810 system_shared_libs: [],
7811 stl: "none",
7812 stubs: {
7813 versions: ["1"],
7814 },
7815 apex_available: ["myapex"],
7816 }
7817
7818 cc_library {
7819 name: "myprivlib",
7820 srcs: ["mylib.cpp"],
7821 system_shared_libs: [],
7822 stl: "none",
7823 apex_available: ["myapex"],
7824 }
7825
7826
7827 cc_test {
7828 name: "mytest",
7829 gtest: false,
7830 srcs: ["mylib.cpp"],
7831 system_shared_libs: [],
7832 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09007833 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09007834 test_for: ["myapex"]
7835 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007836
7837 cc_library {
7838 name: "mytestlib",
7839 srcs: ["mylib.cpp"],
7840 system_shared_libs: [],
7841 shared_libs: ["mylib", "myprivlib"],
7842 stl: "none",
7843 test_for: ["myapex"],
7844 }
7845
7846 cc_benchmark {
7847 name: "mybench",
7848 srcs: ["mylib.cpp"],
7849 system_shared_libs: [],
7850 shared_libs: ["mylib", "myprivlib"],
7851 stl: "none",
7852 test_for: ["myapex"],
7853 }
Jiyong Park62304bb2020-04-13 16:19:48 +09007854 `)
7855
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007856 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007857 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007858 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7859 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7860 }
7861
7862 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09007863 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007864 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7865 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7866 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7867}
Jiyong Park46a512f2020-12-04 18:02:13 +09007868
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007869func TestIndirectTestFor(t *testing.T) {
7870 ctx := testApex(t, `
7871 apex {
7872 name: "myapex",
7873 key: "myapex.key",
7874 native_shared_libs: ["mylib", "myprivlib"],
7875 updatable: false,
7876 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007877
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007878 apex_key {
7879 name: "myapex.key",
7880 public_key: "testkey.avbpubkey",
7881 private_key: "testkey.pem",
7882 }
7883
7884 cc_library {
7885 name: "mylib",
7886 srcs: ["mylib.cpp"],
7887 system_shared_libs: [],
7888 stl: "none",
7889 stubs: {
7890 versions: ["1"],
7891 },
7892 apex_available: ["myapex"],
7893 }
7894
7895 cc_library {
7896 name: "myprivlib",
7897 srcs: ["mylib.cpp"],
7898 system_shared_libs: [],
7899 stl: "none",
7900 shared_libs: ["mylib"],
7901 apex_available: ["myapex"],
7902 }
7903
7904 cc_library {
7905 name: "mytestlib",
7906 srcs: ["mylib.cpp"],
7907 system_shared_libs: [],
7908 shared_libs: ["myprivlib"],
7909 stl: "none",
7910 test_for: ["myapex"],
7911 }
7912 `)
7913
7914 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007915 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007916 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7917 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7918 }
7919
7920 // The platform variant of mytestlib links to the platform variant of the
7921 // internal myprivlib.
7922 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
7923
7924 // The platform variant of myprivlib links to the platform variant of mylib
7925 // and bypasses its stubs.
7926 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 +09007927}
7928
Martin Stjernholmec009002021-03-27 15:18:31 +00007929func TestTestForForLibInOtherApex(t *testing.T) {
7930 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
7931 _ = testApex(t, `
7932 apex {
7933 name: "com.android.art",
7934 key: "myapex.key",
7935 native_shared_libs: ["mylib"],
7936 updatable: false,
7937 }
7938
7939 apex {
7940 name: "com.android.art.debug",
7941 key: "myapex.key",
7942 native_shared_libs: ["mylib", "mytestlib"],
7943 updatable: false,
7944 }
7945
7946 apex_key {
7947 name: "myapex.key",
7948 public_key: "testkey.avbpubkey",
7949 private_key: "testkey.pem",
7950 }
7951
7952 cc_library {
7953 name: "mylib",
7954 srcs: ["mylib.cpp"],
7955 system_shared_libs: [],
7956 stl: "none",
7957 stubs: {
7958 versions: ["1"],
7959 },
7960 apex_available: ["com.android.art", "com.android.art.debug"],
7961 }
7962
7963 cc_library {
7964 name: "mytestlib",
7965 srcs: ["mylib.cpp"],
7966 system_shared_libs: [],
7967 shared_libs: ["mylib"],
7968 stl: "none",
7969 apex_available: ["com.android.art.debug"],
7970 test_for: ["com.android.art"],
7971 }
7972 `,
7973 android.MockFS{
7974 "system/sepolicy/apex/com.android.art-file_contexts": nil,
7975 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
7976 }.AddToFixture())
7977}
7978
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007979// TODO(jungjw): Move this to proptools
7980func intPtr(i int) *int {
7981 return &i
7982}
7983
7984func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007985 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007986 apex_set {
7987 name: "myapex",
7988 set: "myapex.apks",
7989 filename: "foo_v2.apex",
7990 overrides: ["foo"],
7991 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007992 `,
7993 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7994 variables.Platform_sdk_version = intPtr(30)
7995 }),
7996 android.FixtureModifyConfig(func(config android.Config) {
7997 config.Targets[android.Android] = []android.Target{
7998 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
7999 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8000 }
8001 }),
8002 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008003
Paul Duffin24704672021-04-06 16:09:30 +01008004 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008005
8006 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008007 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008008 actual := extractedApex.Args["abis"]
8009 expected := "ARMEABI_V7A,ARM64_V8A"
8010 if actual != expected {
8011 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8012 }
8013 actual = extractedApex.Args["sdk-version"]
8014 expected = "30"
8015 if actual != expected {
8016 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8017 }
8018
Paul Duffin6717d882021-06-15 19:09:41 +01008019 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008020 a := m.Module().(*ApexSet)
8021 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008022 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008023 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8024 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8025 }
8026}
8027
Jiyong Park7d95a512020-05-10 15:16:24 +09008028func TestNoStaticLinkingToStubsLib(t *testing.T) {
8029 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8030 apex {
8031 name: "myapex",
8032 key: "myapex.key",
8033 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008034 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008035 }
8036
8037 apex_key {
8038 name: "myapex.key",
8039 public_key: "testkey.avbpubkey",
8040 private_key: "testkey.pem",
8041 }
8042
8043 cc_library {
8044 name: "mylib",
8045 srcs: ["mylib.cpp"],
8046 static_libs: ["otherlib"],
8047 system_shared_libs: [],
8048 stl: "none",
8049 apex_available: [ "myapex" ],
8050 }
8051
8052 cc_library {
8053 name: "otherlib",
8054 srcs: ["mylib.cpp"],
8055 system_shared_libs: [],
8056 stl: "none",
8057 stubs: {
8058 versions: ["1", "2", "3"],
8059 },
8060 apex_available: [ "myapex" ],
8061 }
8062 `)
8063}
8064
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008065func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008066 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008067 apex {
8068 name: "myapex",
8069 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008070 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008071 custom_sign_tool: "sign_myapex",
8072 }
8073
8074 apex_key {
8075 name: "myapex.key",
8076 public_key: "testkey.avbpubkey",
8077 private_key: "testkey.pem",
8078 }
8079 `)
8080
8081 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8082 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8083 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"`)
8084}
8085
8086func TestApexKeysTxtOverrides(t *testing.T) {
8087 ctx := testApex(t, `
8088 apex {
8089 name: "myapex",
8090 key: "myapex.key",
8091 updatable: false,
8092 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008093 }
8094
8095 apex_key {
8096 name: "myapex.key",
8097 public_key: "testkey.avbpubkey",
8098 private_key: "testkey.pem",
8099 }
8100
8101 prebuilt_apex {
8102 name: "myapex",
8103 prefer: true,
8104 arch: {
8105 arm64: {
8106 src: "myapex-arm64.apex",
8107 },
8108 arm: {
8109 src: "myapex-arm.apex",
8110 },
8111 },
8112 }
8113
8114 apex_set {
8115 name: "myapex_set",
8116 set: "myapex.apks",
8117 filename: "myapex_set.apex",
8118 overrides: ["myapex"],
8119 }
8120 `)
8121
8122 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8123 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8124 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 +09008125 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 +09008126}
8127
Jooyung Han938b5932020-06-20 12:47:47 +09008128func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008129 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008130 apex {
8131 name: "myapex",
8132 key: "myapex.key",
8133 apps: ["app"],
8134 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008135 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008136 }
8137
8138 apex_key {
8139 name: "myapex.key",
8140 public_key: "testkey.avbpubkey",
8141 private_key: "testkey.pem",
8142 }
8143
8144 android_app {
8145 name: "app",
8146 srcs: ["foo/bar/MyClass.java"],
8147 package_name: "foo",
8148 sdk_version: "none",
8149 system_modules: "none",
8150 apex_available: [ "myapex" ],
8151 }
8152 `, withFiles(map[string][]byte{
8153 "sub/Android.bp": []byte(`
8154 override_apex {
8155 name: "override_myapex",
8156 base: "myapex",
8157 apps: ["override_app"],
8158 allowed_files: ":allowed",
8159 }
8160 // Overridable "path" property should be referenced indirectly
8161 filegroup {
8162 name: "allowed",
8163 srcs: ["allowed.txt"],
8164 }
8165 override_android_app {
8166 name: "override_app",
8167 base: "app",
8168 package_name: "bar",
8169 }
8170 `),
8171 }))
8172
8173 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8174 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8175 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8176 }
8177
8178 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8179 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8180 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8181 }
8182}
8183
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008184func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008185 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008186 apex {
8187 name: "myapex",
8188 key: "myapex.key",
8189 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008190 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008191 }
8192
8193 apex_key {
8194 name: "myapex.key",
8195 public_key: "testkey.avbpubkey",
8196 private_key: "testkey.pem",
8197 }
8198
8199 cc_library {
8200 name: "mylib",
8201 srcs: ["mylib.cpp"],
8202 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008203 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008204 },
8205 apex_available: ["myapex"],
8206 }
8207
8208 cc_prebuilt_library_shared {
8209 name: "mylib",
8210 prefer: false,
8211 srcs: ["prebuilt.so"],
8212 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008213 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008214 },
8215 apex_available: ["myapex"],
8216 }
8217 `)
8218}
8219
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008220func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008221 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008222 apex {
8223 name: "myapex",
8224 key: "myapex.key",
8225 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008226 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008227 }
8228 apex_key {
8229 name: "myapex.key",
8230 public_key: "testkey.avbpubkey",
8231 private_key: "testkey.pem",
8232 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008233 `,
8234 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8235 variables.CompressedApex = proptools.BoolPtr(true)
8236 }),
8237 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008238
8239 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8240 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8241
8242 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8243 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8244
8245 // Make sure output of bundle is .capex
8246 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8247 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8248
8249 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008250 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008251 var builder strings.Builder
8252 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8253 androidMk := builder.String()
8254 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8255}
8256
Martin Stjernholm2856c662020-12-02 15:03:42 +00008257func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008258 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008259 apex {
8260 name: "myapex",
8261 key: "myapex.key",
8262 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008263 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008264 }
8265
8266 apex_key {
8267 name: "myapex.key",
8268 public_key: "testkey.avbpubkey",
8269 private_key: "testkey.pem",
8270 }
8271
8272 cc_library {
8273 name: "mylib",
8274 srcs: ["mylib.cpp"],
8275 apex_available: ["myapex"],
8276 shared_libs: ["otherlib"],
8277 system_shared_libs: [],
8278 }
8279
8280 cc_library {
8281 name: "otherlib",
8282 srcs: ["mylib.cpp"],
8283 stubs: {
8284 versions: ["current"],
8285 },
8286 }
8287
8288 cc_prebuilt_library_shared {
8289 name: "otherlib",
8290 prefer: true,
8291 srcs: ["prebuilt.so"],
8292 stubs: {
8293 versions: ["current"],
8294 },
8295 }
8296 `)
8297
8298 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008299 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008300 var builder strings.Builder
8301 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8302 androidMk := builder.String()
8303
8304 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8305 // a thing there.
8306 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8307}
8308
Jiyong Parke3867542020-12-03 17:28:25 +09008309func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008310 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008311 apex {
8312 name: "myapex",
8313 key: "myapex.key",
8314 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008315 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008316 }
8317
8318 apex_key {
8319 name: "myapex.key",
8320 public_key: "testkey.avbpubkey",
8321 private_key: "testkey.pem",
8322 }
8323
8324 cc_library {
8325 name: "mylib",
8326 srcs: ["mylib.cpp"],
8327 system_shared_libs: [],
8328 stl: "none",
8329 apex_available: ["myapex"],
8330 shared_libs: ["mylib2"],
8331 target: {
8332 apex: {
8333 exclude_shared_libs: ["mylib2"],
8334 },
8335 },
8336 }
8337
8338 cc_library {
8339 name: "mylib2",
8340 srcs: ["mylib.cpp"],
8341 system_shared_libs: [],
8342 stl: "none",
8343 }
8344 `)
8345
8346 // Check if mylib is linked to mylib2 for the non-apex target
8347 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8348 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8349
8350 // Make sure that the link doesn't occur for the apex target
8351 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8352 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8353
8354 // It shouldn't appear in the copy cmd as well.
8355 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8356 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8357}
8358
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008359func TestPrebuiltStubLibDep(t *testing.T) {
8360 bpBase := `
8361 apex {
8362 name: "myapex",
8363 key: "myapex.key",
8364 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008365 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008366 }
8367 apex_key {
8368 name: "myapex.key",
8369 public_key: "testkey.avbpubkey",
8370 private_key: "testkey.pem",
8371 }
8372 cc_library {
8373 name: "mylib",
8374 srcs: ["mylib.cpp"],
8375 apex_available: ["myapex"],
8376 shared_libs: ["stublib"],
8377 system_shared_libs: [],
8378 }
8379 apex {
8380 name: "otherapex",
8381 enabled: %s,
8382 key: "myapex.key",
8383 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008384 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008385 }
8386 `
8387
8388 stublibSourceBp := `
8389 cc_library {
8390 name: "stublib",
8391 srcs: ["mylib.cpp"],
8392 apex_available: ["otherapex"],
8393 system_shared_libs: [],
8394 stl: "none",
8395 stubs: {
8396 versions: ["1"],
8397 },
8398 }
8399 `
8400
8401 stublibPrebuiltBp := `
8402 cc_prebuilt_library_shared {
8403 name: "stublib",
8404 srcs: ["prebuilt.so"],
8405 apex_available: ["otherapex"],
8406 stubs: {
8407 versions: ["1"],
8408 },
8409 %s
8410 }
8411 `
8412
8413 tests := []struct {
8414 name string
8415 stublibBp string
8416 usePrebuilt bool
8417 modNames []string // Modules to collect AndroidMkEntries for
8418 otherApexEnabled []string
8419 }{
8420 {
8421 name: "only_source",
8422 stublibBp: stublibSourceBp,
8423 usePrebuilt: false,
8424 modNames: []string{"stublib"},
8425 otherApexEnabled: []string{"true", "false"},
8426 },
8427 {
8428 name: "source_preferred",
8429 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8430 usePrebuilt: false,
8431 modNames: []string{"stublib", "prebuilt_stublib"},
8432 otherApexEnabled: []string{"true", "false"},
8433 },
8434 {
8435 name: "prebuilt_preferred",
8436 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8437 usePrebuilt: true,
8438 modNames: []string{"stublib", "prebuilt_stublib"},
8439 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8440 },
8441 {
8442 name: "only_prebuilt",
8443 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8444 usePrebuilt: true,
8445 modNames: []string{"stublib"},
8446 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8447 },
8448 }
8449
8450 for _, test := range tests {
8451 t.Run(test.name, func(t *testing.T) {
8452 for _, otherApexEnabled := range test.otherApexEnabled {
8453 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008454 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008455
8456 type modAndMkEntries struct {
8457 mod *cc.Module
8458 mkEntries android.AndroidMkEntries
8459 }
8460 entries := []*modAndMkEntries{}
8461
8462 // Gather shared lib modules that are installable
8463 for _, modName := range test.modNames {
8464 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8465 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8466 continue
8467 }
8468 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008469 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008470 continue
8471 }
Colin Crossaa255532020-07-03 13:18:24 -07008472 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008473 if ent.Disabled {
8474 continue
8475 }
8476 entries = append(entries, &modAndMkEntries{
8477 mod: mod,
8478 mkEntries: ent,
8479 })
8480 }
8481 }
8482 }
8483
8484 var entry *modAndMkEntries = nil
8485 for _, ent := range entries {
8486 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8487 if entry != nil {
8488 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8489 } else {
8490 entry = ent
8491 }
8492 }
8493 }
8494
8495 if entry == nil {
8496 t.Errorf("AndroidMk entry for \"stublib\" missing")
8497 } else {
8498 isPrebuilt := entry.mod.Prebuilt() != nil
8499 if isPrebuilt != test.usePrebuilt {
8500 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8501 }
8502 if !entry.mod.IsStubs() {
8503 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8504 }
8505 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8506 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8507 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008508 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008509 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008510 if !android.InList(expected, cflags) {
8511 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8512 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008513 }
8514 })
8515 }
8516 })
8517 }
8518}
8519
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008520func TestHostApexInHostOnlyBuild(t *testing.T) {
8521 testApex(t, `
8522 apex {
8523 name: "myapex",
8524 host_supported: true,
8525 key: "myapex.key",
8526 updatable: false,
8527 payload_type: "zip",
8528 }
8529 apex_key {
8530 name: "myapex.key",
8531 public_key: "testkey.avbpubkey",
8532 private_key: "testkey.pem",
8533 }
8534 `,
8535 android.FixtureModifyConfig(func(config android.Config) {
8536 // We may not have device targets in all builds, e.g. in
8537 // prebuilts/build-tools/build-prebuilts.sh
8538 config.Targets[android.Android] = []android.Target{}
8539 }))
8540}
8541
Colin Crossc33e5212021-05-25 18:16:02 -07008542func TestApexJavaCoverage(t *testing.T) {
8543 bp := `
8544 apex {
8545 name: "myapex",
8546 key: "myapex.key",
8547 java_libs: ["mylib"],
8548 bootclasspath_fragments: ["mybootclasspathfragment"],
8549 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8550 updatable: false,
8551 }
8552
8553 apex_key {
8554 name: "myapex.key",
8555 public_key: "testkey.avbpubkey",
8556 private_key: "testkey.pem",
8557 }
8558
8559 java_library {
8560 name: "mylib",
8561 srcs: ["mylib.java"],
8562 apex_available: ["myapex"],
8563 compile_dex: true,
8564 }
8565
8566 bootclasspath_fragment {
8567 name: "mybootclasspathfragment",
8568 contents: ["mybootclasspathlib"],
8569 apex_available: ["myapex"],
8570 }
8571
8572 java_library {
8573 name: "mybootclasspathlib",
8574 srcs: ["mybootclasspathlib.java"],
8575 apex_available: ["myapex"],
8576 compile_dex: true,
8577 }
8578
8579 systemserverclasspath_fragment {
8580 name: "mysystemserverclasspathfragment",
8581 contents: ["mysystemserverclasspathlib"],
8582 apex_available: ["myapex"],
8583 }
8584
8585 java_library {
8586 name: "mysystemserverclasspathlib",
8587 srcs: ["mysystemserverclasspathlib.java"],
8588 apex_available: ["myapex"],
8589 compile_dex: true,
8590 }
8591 `
8592
8593 result := android.GroupFixturePreparers(
8594 PrepareForTestWithApexBuildComponents,
8595 prepareForTestWithMyapex,
8596 java.PrepareForTestWithJavaDefaultModules,
8597 android.PrepareForTestWithAndroidBuildComponents,
8598 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008599 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8600 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008601 android.FixtureMergeEnv(map[string]string{
8602 "EMMA_INSTRUMENT": "true",
8603 }),
8604 ).RunTest(t)
8605
8606 // Make sure jacoco ran on both mylib and mybootclasspathlib
8607 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8608 t.Errorf("Failed to find jacoco rule for mylib")
8609 }
8610 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8611 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8612 }
8613 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8614 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8615 }
8616}
8617
Jiyong Park192600a2021-08-03 07:52:17 +00008618func TestProhibitStaticExecutable(t *testing.T) {
8619 testApexError(t, `executable mybin is static`, `
8620 apex {
8621 name: "myapex",
8622 key: "myapex.key",
8623 binaries: ["mybin"],
8624 min_sdk_version: "29",
8625 }
8626
8627 apex_key {
8628 name: "myapex.key",
8629 public_key: "testkey.avbpubkey",
8630 private_key: "testkey.pem",
8631 }
8632
8633 cc_binary {
8634 name: "mybin",
8635 srcs: ["mylib.cpp"],
8636 relative_install_path: "foo/bar",
8637 static_executable: true,
8638 system_shared_libs: [],
8639 stl: "none",
8640 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008641 min_sdk_version: "29",
8642 }
8643 `)
8644
8645 testApexError(t, `executable mybin.rust is static`, `
8646 apex {
8647 name: "myapex",
8648 key: "myapex.key",
8649 binaries: ["mybin.rust"],
8650 min_sdk_version: "29",
8651 }
8652
8653 apex_key {
8654 name: "myapex.key",
8655 public_key: "testkey.avbpubkey",
8656 private_key: "testkey.pem",
8657 }
8658
8659 rust_binary {
8660 name: "mybin.rust",
8661 srcs: ["foo.rs"],
8662 static_executable: true,
8663 apex_available: ["myapex"],
8664 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008665 }
8666 `)
8667}
8668
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008669func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8670 ctx := testApex(t, `
8671 apex {
8672 name: "myapex",
8673 key: "myapex.key",
8674 updatable: false,
8675 java_libs: ["foo"],
8676 }
8677
8678 apex_key {
8679 name: "myapex.key",
8680 public_key: "testkey.avbpubkey",
8681 private_key: "testkey.pem",
8682 }
8683
8684 java_library {
8685 name: "foo",
8686 srcs: ["foo.java"],
8687 apex_available: ["myapex"],
8688 installable: true,
8689 }
8690 `,
8691 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8692 )
8693
8694 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8695 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8696 var builder strings.Builder
8697 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8698 androidMk := builder.String()
8699 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")
8700}
8701
8702func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8703 ctx := testApex(t, `
8704 prebuilt_apex {
8705 name: "myapex",
8706 arch: {
8707 arm64: {
8708 src: "myapex-arm64.apex",
8709 },
8710 arm: {
8711 src: "myapex-arm.apex",
8712 },
8713 },
8714 exported_java_libs: ["foo"],
8715 }
8716
8717 java_import {
8718 name: "foo",
8719 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008720 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008721 }
8722 `,
8723 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8724 )
8725
8726 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8727 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8728 mainModuleEntries := entriesList[0]
8729 android.AssertArrayString(t,
8730 "LOCAL_REQUIRED_MODULES",
8731 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8732 []string{
8733 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8734 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8735 })
8736}
8737
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008738func TestAndroidMk_RequiredModules(t *testing.T) {
8739 ctx := testApex(t, `
8740 apex {
8741 name: "myapex",
8742 key: "myapex.key",
8743 updatable: false,
8744 java_libs: ["foo"],
8745 required: ["otherapex"],
8746 }
8747
8748 apex {
8749 name: "otherapex",
8750 key: "myapex.key",
8751 updatable: false,
8752 java_libs: ["foo"],
8753 required: ["otherapex"],
8754 }
8755
8756 apex_key {
8757 name: "myapex.key",
8758 public_key: "testkey.avbpubkey",
8759 private_key: "testkey.pem",
8760 }
8761
8762 java_library {
8763 name: "foo",
8764 srcs: ["foo.java"],
8765 apex_available: ["myapex", "otherapex"],
8766 installable: true,
8767 }
8768 `)
8769
8770 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8771 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8772 var builder strings.Builder
8773 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8774 androidMk := builder.String()
8775 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
8776}
8777
Jooyung Hana6d36672022-02-24 13:58:07 +09008778func TestApexOutputFileProducer(t *testing.T) {
8779 for _, tc := range []struct {
8780 name string
8781 ref string
8782 expected_data []string
8783 }{
8784 {
8785 name: "test_using_output",
8786 ref: ":myapex",
8787 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
8788 },
8789 {
8790 name: "test_using_apex",
8791 ref: ":myapex{.apex}",
8792 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
8793 },
8794 } {
8795 t.Run(tc.name, func(t *testing.T) {
8796 ctx := testApex(t, `
8797 apex {
8798 name: "myapex",
8799 key: "myapex.key",
8800 compressible: true,
8801 updatable: false,
8802 }
8803
8804 apex_key {
8805 name: "myapex.key",
8806 public_key: "testkey.avbpubkey",
8807 private_key: "testkey.pem",
8808 }
8809
8810 java_test {
8811 name: "`+tc.name+`",
8812 srcs: ["a.java"],
8813 data: ["`+tc.ref+`"],
8814 }
8815 `,
8816 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8817 variables.CompressedApex = proptools.BoolPtr(true)
8818 }))
8819 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
8820 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
8821 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
8822 })
8823 }
8824}
8825
satayev758968a2021-12-06 11:42:40 +00008826func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
8827 preparer := android.GroupFixturePreparers(
8828 PrepareForTestWithApexBuildComponents,
8829 prepareForTestWithMyapex,
8830 java.PrepareForTestWithJavaSdkLibraryFiles,
8831 java.PrepareForTestWithJavaDefaultModules,
8832 android.PrepareForTestWithAndroidBuildComponents,
8833 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8834 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
8835 )
8836
8837 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
8838 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8839 preparer.RunTestWithBp(t, `
8840 apex {
8841 name: "myapex",
8842 key: "myapex.key",
8843 bootclasspath_fragments: ["mybootclasspathfragment"],
8844 min_sdk_version: "30",
8845 updatable: false,
8846 }
8847
8848 apex_key {
8849 name: "myapex.key",
8850 public_key: "testkey.avbpubkey",
8851 private_key: "testkey.pem",
8852 }
8853
8854 bootclasspath_fragment {
8855 name: "mybootclasspathfragment",
8856 contents: ["mybootclasspathlib"],
8857 apex_available: ["myapex"],
8858 }
8859
8860 java_sdk_library {
8861 name: "mybootclasspathlib",
8862 srcs: ["mybootclasspathlib.java"],
8863 apex_available: ["myapex"],
8864 compile_dex: true,
8865 unsafe_ignore_missing_latest_api: true,
8866 min_sdk_version: "31",
8867 static_libs: ["util"],
8868 }
8869
8870 java_library {
8871 name: "util",
8872 srcs: ["a.java"],
8873 apex_available: ["myapex"],
8874 min_sdk_version: "31",
8875 static_libs: ["another_util"],
8876 }
8877
8878 java_library {
8879 name: "another_util",
8880 srcs: ["a.java"],
8881 min_sdk_version: "31",
8882 apex_available: ["myapex"],
8883 }
8884 `)
8885 })
8886
8887 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
8888 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8889 preparer.RunTestWithBp(t, `
8890 apex {
8891 name: "myapex",
8892 key: "myapex.key",
8893 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8894 min_sdk_version: "30",
8895 updatable: false,
8896 }
8897
8898 apex_key {
8899 name: "myapex.key",
8900 public_key: "testkey.avbpubkey",
8901 private_key: "testkey.pem",
8902 }
8903
8904 systemserverclasspath_fragment {
8905 name: "mysystemserverclasspathfragment",
8906 contents: ["mysystemserverclasspathlib"],
8907 apex_available: ["myapex"],
8908 }
8909
8910 java_sdk_library {
8911 name: "mysystemserverclasspathlib",
8912 srcs: ["mysystemserverclasspathlib.java"],
8913 apex_available: ["myapex"],
8914 compile_dex: true,
8915 min_sdk_version: "32",
8916 unsafe_ignore_missing_latest_api: true,
8917 static_libs: ["util"],
8918 }
8919
8920 java_library {
8921 name: "util",
8922 srcs: ["a.java"],
8923 apex_available: ["myapex"],
8924 min_sdk_version: "31",
8925 static_libs: ["another_util"],
8926 }
8927
8928 java_library {
8929 name: "another_util",
8930 srcs: ["a.java"],
8931 min_sdk_version: "31",
8932 apex_available: ["myapex"],
8933 }
8934 `)
8935 })
8936
8937 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8938 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
8939 RunTestWithBp(t, `
8940 apex {
8941 name: "myapex",
8942 key: "myapex.key",
8943 bootclasspath_fragments: ["mybootclasspathfragment"],
8944 min_sdk_version: "30",
8945 updatable: false,
8946 }
8947
8948 apex_key {
8949 name: "myapex.key",
8950 public_key: "testkey.avbpubkey",
8951 private_key: "testkey.pem",
8952 }
8953
8954 bootclasspath_fragment {
8955 name: "mybootclasspathfragment",
8956 contents: ["mybootclasspathlib"],
8957 apex_available: ["myapex"],
8958 }
8959
8960 java_sdk_library {
8961 name: "mybootclasspathlib",
8962 srcs: ["mybootclasspathlib.java"],
8963 apex_available: ["myapex"],
8964 compile_dex: true,
8965 unsafe_ignore_missing_latest_api: true,
8966 }
8967 `)
8968 })
8969
8970 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8971 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
8972 RunTestWithBp(t, `
8973 apex {
8974 name: "myapex",
8975 key: "myapex.key",
8976 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8977 min_sdk_version: "30",
8978 updatable: false,
8979 }
8980
8981 apex_key {
8982 name: "myapex.key",
8983 public_key: "testkey.avbpubkey",
8984 private_key: "testkey.pem",
8985 }
8986
8987 systemserverclasspath_fragment {
8988 name: "mysystemserverclasspathfragment",
8989 contents: ["mysystemserverclasspathlib"],
8990 apex_available: ["myapex"],
8991 }
8992
8993 java_sdk_library {
8994 name: "mysystemserverclasspathlib",
8995 srcs: ["mysystemserverclasspathlib.java"],
8996 apex_available: ["myapex"],
8997 compile_dex: true,
8998 unsafe_ignore_missing_latest_api: true,
8999 }
9000 `)
9001 })
9002}
9003
Jiakai Zhang6decef92022-01-12 17:56:19 +00009004// Verifies that the APEX depends on all the Make modules in the list.
9005func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9006 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9007 for _, dep := range deps {
9008 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9009 }
9010}
9011
9012// Verifies that the APEX does not depend on any of the Make modules in the list.
9013func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9014 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9015 for _, dep := range deps {
9016 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9017 }
9018}
9019
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009020func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009021 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009022}