blob: 3e01f2608c1730e118d5023a27994e5bc72d1f4b [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
Artur Satayeva8bd1132020-04-27 18:07:06 +0100594 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100595 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100596 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
597 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
598 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100599
600 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100601 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100602 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
603 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
604 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800605}
606
Jooyung Hanf21c7972019-12-16 22:32:06 +0900607func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800608 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900609 apex_defaults {
610 name: "myapex-defaults",
611 key: "myapex.key",
612 prebuilts: ["myetc"],
613 native_shared_libs: ["mylib"],
614 java_libs: ["myjar"],
615 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900616 rros: ["rro"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800617 bpfs: ["bpf", "netd_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000618 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900619 }
620
621 prebuilt_etc {
622 name: "myetc",
623 src: "myprebuilt",
624 }
625
626 apex {
627 name: "myapex",
628 defaults: ["myapex-defaults"],
629 }
630
631 apex_key {
632 name: "myapex.key",
633 public_key: "testkey.avbpubkey",
634 private_key: "testkey.pem",
635 }
636
637 cc_library {
638 name: "mylib",
639 system_shared_libs: [],
640 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000641 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900642 }
643
644 java_library {
645 name: "myjar",
646 srcs: ["foo/bar/MyClass.java"],
647 sdk_version: "none",
648 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000649 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900650 }
651
652 android_app {
653 name: "AppFoo",
654 srcs: ["foo/bar/MyClass.java"],
655 sdk_version: "none",
656 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000657 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900658 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900659
660 runtime_resource_overlay {
661 name: "rro",
662 theme: "blue",
663 }
664
markchien2f59ec92020-09-02 16:23:38 +0800665 bpf {
666 name: "bpf",
667 srcs: ["bpf.c", "bpf2.c"],
668 }
669
Ken Chenfad7f9d2021-11-10 22:02:57 +0800670 bpf {
671 name: "netd_test",
672 srcs: ["netd_test.c"],
673 sub_dir: "netd",
674 }
675
Jooyung Hanf21c7972019-12-16 22:32:06 +0900676 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000677 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900678 "etc/myetc",
679 "javalib/myjar.jar",
680 "lib64/mylib.so",
681 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900682 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800683 "etc/bpf/bpf.o",
684 "etc/bpf/bpf2.o",
Ken Chenfad7f9d2021-11-10 22:02:57 +0800685 "etc/bpf/netd/netd_test.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900686 })
687}
688
Jooyung Han01a3ee22019-11-02 02:52:25 +0900689func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800690 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900691 apex {
692 name: "myapex",
693 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000694 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 }
696
697 apex_key {
698 name: "myapex.key",
699 public_key: "testkey.avbpubkey",
700 private_key: "testkey.pem",
701 }
702 `)
703
704 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900705 args := module.Rule("apexRule").Args
706 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
707 t.Error("manifest should be apex_manifest.pb, but " + manifest)
708 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900709}
710
Liz Kammer4854a7d2021-05-27 14:28:27 -0400711func TestApexManifestMinSdkVersion(t *testing.T) {
712 ctx := testApex(t, `
713 apex_defaults {
714 name: "my_defaults",
715 key: "myapex.key",
716 product_specific: true,
717 file_contexts: ":my-file-contexts",
718 updatable: false,
719 }
720 apex {
721 name: "myapex_30",
722 min_sdk_version: "30",
723 defaults: ["my_defaults"],
724 }
725
726 apex {
727 name: "myapex_current",
728 min_sdk_version: "current",
729 defaults: ["my_defaults"],
730 }
731
732 apex {
733 name: "myapex_none",
734 defaults: ["my_defaults"],
735 }
736
737 apex_key {
738 name: "myapex.key",
739 public_key: "testkey.avbpubkey",
740 private_key: "testkey.pem",
741 }
742
743 filegroup {
744 name: "my-file-contexts",
745 srcs: ["product_specific_file_contexts"],
746 }
747 `, withFiles(map[string][]byte{
748 "product_specific_file_contexts": nil,
749 }), android.FixtureModifyProductVariables(
750 func(variables android.FixtureProductVariables) {
751 variables.Unbundled_build = proptools.BoolPtr(true)
752 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
753 }), android.FixtureMergeEnv(map[string]string{
754 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
755 }))
756
757 testCases := []struct {
758 module string
759 minSdkVersion string
760 }{
761 {
762 module: "myapex_30",
763 minSdkVersion: "30",
764 },
765 {
766 module: "myapex_current",
767 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
768 },
769 {
770 module: "myapex_none",
771 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
772 },
773 }
774 for _, tc := range testCases {
775 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
776 args := module.Rule("apexRule").Args
777 optFlags := args["opt_flags"]
778 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
779 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
780 }
781 }
782}
783
Alex Light5098a612018-11-29 17:12:15 -0800784func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800785 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800786 apex {
787 name: "myapex",
788 key: "myapex.key",
789 payload_type: "zip",
790 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000791 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800792 }
793
794 apex_key {
795 name: "myapex.key",
796 public_key: "testkey.avbpubkey",
797 private_key: "testkey.pem",
798 }
799
800 cc_library {
801 name: "mylib",
802 srcs: ["mylib.cpp"],
803 shared_libs: ["mylib2"],
804 system_shared_libs: [],
805 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000806 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800807 }
808
809 cc_library {
810 name: "mylib2",
811 srcs: ["mylib.cpp"],
812 system_shared_libs: [],
813 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000814 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800815 }
816 `)
817
Sundong Ahnabb64432019-10-22 13:58:29 +0900818 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800819 copyCmds := zipApexRule.Args["copy_commands"]
820
821 // Ensure that main rule creates an output
822 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
823
824 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700825 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800826
827 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700828 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800829
830 // Ensure that both direct and indirect deps are copied into apex
831 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
832 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900833}
834
835func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800836 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900837 apex {
838 name: "myapex",
839 key: "myapex.key",
840 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900841 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000842 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900843 }
844
845 apex_key {
846 name: "myapex.key",
847 public_key: "testkey.avbpubkey",
848 private_key: "testkey.pem",
849 }
850
851 cc_library {
852 name: "mylib",
853 srcs: ["mylib.cpp"],
854 shared_libs: ["mylib2", "mylib3"],
855 system_shared_libs: [],
856 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000857 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900858 }
859
860 cc_library {
861 name: "mylib2",
862 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900863 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900864 system_shared_libs: [],
865 stl: "none",
866 stubs: {
867 versions: ["1", "2", "3"],
868 },
869 }
870
871 cc_library {
872 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900873 srcs: ["mylib.cpp"],
874 shared_libs: ["mylib4"],
875 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900876 stl: "none",
877 stubs: {
878 versions: ["10", "11", "12"],
879 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000880 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900881 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900882
883 cc_library {
884 name: "mylib4",
885 srcs: ["mylib.cpp"],
886 system_shared_libs: [],
887 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000888 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900889 }
Jiyong Park105dc322021-06-11 17:22:09 +0900890
891 rust_binary {
892 name: "foo.rust",
893 srcs: ["foo.rs"],
894 shared_libs: ["libfoo.shared_from_rust"],
895 prefer_rlib: true,
896 apex_available: ["myapex"],
897 }
898
899 cc_library_shared {
900 name: "libfoo.shared_from_rust",
901 srcs: ["mylib.cpp"],
902 system_shared_libs: [],
903 stl: "none",
904 stubs: {
905 versions: ["10", "11", "12"],
906 },
907 }
908
Jiyong Park25fc6a92018-11-18 18:02:45 +0900909 `)
910
Sundong Ahnabb64432019-10-22 13:58:29 +0900911 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900912 copyCmds := apexRule.Args["copy_commands"]
913
914 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800915 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916
917 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800918 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919
920 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800921 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900922
Colin Crossaede88c2020-08-11 12:17:01 -0700923 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924
925 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900926 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900928 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900929
930 // 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 -0700931 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700933 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900934
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700935 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
936 // is replaced by sharing of "cFlags" in cc/builder.go.
937 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
938 // module variable representing "cflags". So it was not detected by ensureNotContains.
939 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
940 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
941 // including the original cflags's "-include mylib.h".
942 //
Jiyong Park64379952018-12-13 18:37:29 +0900943 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700944 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
945 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900946
947 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700948 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900949
Jooyung Hana57af4a2020-01-23 05:36:59 +0000950 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900951 "lib64/mylib.so",
952 "lib64/mylib3.so",
953 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900954 "bin/foo.rust",
955 "lib64/libc++.so", // by the implicit dependency from foo.rust
956 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900957 })
Jiyong Park105dc322021-06-11 17:22:09 +0900958
959 // Ensure that stub dependency from a rust module is not included
960 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
961 // The rust module is linked to the stub cc library
962 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
963 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
964 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900965
966 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
967 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900968}
969
Jiyong Park1bc84122021-06-22 20:23:05 +0900970func TestApexCanUsePrivateApis(t *testing.T) {
971 ctx := testApex(t, `
972 apex {
973 name: "myapex",
974 key: "myapex.key",
975 native_shared_libs: ["mylib"],
976 binaries: ["foo.rust"],
977 updatable: false,
978 platform_apis: true,
979 }
980
981 apex_key {
982 name: "myapex.key",
983 public_key: "testkey.avbpubkey",
984 private_key: "testkey.pem",
985 }
986
987 cc_library {
988 name: "mylib",
989 srcs: ["mylib.cpp"],
990 shared_libs: ["mylib2"],
991 system_shared_libs: [],
992 stl: "none",
993 apex_available: [ "myapex" ],
994 }
995
996 cc_library {
997 name: "mylib2",
998 srcs: ["mylib.cpp"],
999 cflags: ["-include mylib.h"],
1000 system_shared_libs: [],
1001 stl: "none",
1002 stubs: {
1003 versions: ["1", "2", "3"],
1004 },
1005 }
1006
1007 rust_binary {
1008 name: "foo.rust",
1009 srcs: ["foo.rs"],
1010 shared_libs: ["libfoo.shared_from_rust"],
1011 prefer_rlib: true,
1012 apex_available: ["myapex"],
1013 }
1014
1015 cc_library_shared {
1016 name: "libfoo.shared_from_rust",
1017 srcs: ["mylib.cpp"],
1018 system_shared_libs: [],
1019 stl: "none",
1020 stubs: {
1021 versions: ["10", "11", "12"],
1022 },
1023 }
1024 `)
1025
1026 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1027 copyCmds := apexRule.Args["copy_commands"]
1028
1029 // Ensure that indirect stubs dep is not included
1030 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1031 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1032
1033 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1034 // of the platform_apis: true)
1035 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000_private").Rule("ld").Args["libFlags"]
1036 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1037 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1038 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000_private").Rule("rustc").Args["linkFlags"]
1039 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1040 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1041}
1042
Colin Cross7812fd32020-09-25 12:35:10 -07001043func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1044 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001045 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001046 apex {
1047 name: "myapex",
1048 key: "myapex.key",
1049 native_shared_libs: ["mylib", "mylib3"],
1050 min_sdk_version: "29",
1051 }
1052
1053 apex_key {
1054 name: "myapex.key",
1055 public_key: "testkey.avbpubkey",
1056 private_key: "testkey.pem",
1057 }
1058
1059 cc_library {
1060 name: "mylib",
1061 srcs: ["mylib.cpp"],
1062 shared_libs: ["mylib2", "mylib3"],
1063 system_shared_libs: [],
1064 stl: "none",
1065 apex_available: [ "myapex" ],
1066 min_sdk_version: "28",
1067 }
1068
1069 cc_library {
1070 name: "mylib2",
1071 srcs: ["mylib.cpp"],
1072 cflags: ["-include mylib.h"],
1073 system_shared_libs: [],
1074 stl: "none",
1075 stubs: {
1076 versions: ["28", "29", "30", "current"],
1077 },
1078 min_sdk_version: "28",
1079 }
1080
1081 cc_library {
1082 name: "mylib3",
1083 srcs: ["mylib.cpp"],
1084 shared_libs: ["mylib4"],
1085 system_shared_libs: [],
1086 stl: "none",
1087 stubs: {
1088 versions: ["28", "29", "30", "current"],
1089 },
1090 apex_available: [ "myapex" ],
1091 min_sdk_version: "28",
1092 }
1093
1094 cc_library {
1095 name: "mylib4",
1096 srcs: ["mylib.cpp"],
1097 system_shared_libs: [],
1098 stl: "none",
1099 apex_available: [ "myapex" ],
1100 min_sdk_version: "28",
1101 }
1102 `)
1103
1104 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1105 copyCmds := apexRule.Args["copy_commands"]
1106
1107 // Ensure that direct non-stubs dep is always included
1108 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1109
1110 // Ensure that indirect stubs dep is not included
1111 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1112
1113 // Ensure that direct stubs dep is included
1114 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1115
1116 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1117
Jiyong Park55549df2021-02-26 23:57:23 +09001118 // Ensure that mylib is linking with the latest version of stub for mylib2
1119 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001120 // ... and not linking to the non-stub (impl) variant of mylib2
1121 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1122
1123 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1124 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1125 // .. and not linking to the stubs variant of mylib3
1126 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1127
1128 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001129 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001130 ensureNotContains(t, mylib2Cflags, "-include ")
1131
1132 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -07001133 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -07001134
1135 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1136 "lib64/mylib.so",
1137 "lib64/mylib3.so",
1138 "lib64/mylib4.so",
1139 })
1140}
1141
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001142func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1143 t.Parallel()
1144 // myapex (Z)
1145 // mylib -----------------.
1146 // |
1147 // otherapex (29) |
1148 // libstub's versions: 29 Z current
1149 // |
1150 // <platform> |
1151 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001152 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001153 apex {
1154 name: "myapex",
1155 key: "myapex.key",
1156 native_shared_libs: ["mylib"],
1157 min_sdk_version: "Z", // non-final
1158 }
1159
1160 cc_library {
1161 name: "mylib",
1162 srcs: ["mylib.cpp"],
1163 shared_libs: ["libstub"],
1164 apex_available: ["myapex"],
1165 min_sdk_version: "Z",
1166 }
1167
1168 apex_key {
1169 name: "myapex.key",
1170 public_key: "testkey.avbpubkey",
1171 private_key: "testkey.pem",
1172 }
1173
1174 apex {
1175 name: "otherapex",
1176 key: "myapex.key",
1177 native_shared_libs: ["libstub"],
1178 min_sdk_version: "29",
1179 }
1180
1181 cc_library {
1182 name: "libstub",
1183 srcs: ["mylib.cpp"],
1184 stubs: {
1185 versions: ["29", "Z", "current"],
1186 },
1187 apex_available: ["otherapex"],
1188 min_sdk_version: "29",
1189 }
1190
1191 // platform module depending on libstub from otherapex should use the latest stub("current")
1192 cc_library {
1193 name: "libplatform",
1194 srcs: ["mylib.cpp"],
1195 shared_libs: ["libstub"],
1196 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001197 `,
1198 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1199 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1200 variables.Platform_sdk_final = proptools.BoolPtr(false)
1201 variables.Platform_version_active_codenames = []string{"Z"}
1202 }),
1203 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001204
Jiyong Park55549df2021-02-26 23:57:23 +09001205 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001206 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001207 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001208 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001209 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001210
1211 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1212 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1213 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1214 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1215 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1216}
1217
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001218func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001219 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001220 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001221 name: "myapex2",
1222 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001223 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001224 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001225 }
1226
1227 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001228 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229 public_key: "testkey.avbpubkey",
1230 private_key: "testkey.pem",
1231 }
1232
1233 cc_library {
1234 name: "mylib",
1235 srcs: ["mylib.cpp"],
1236 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001237 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001238 system_shared_libs: [],
1239 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001240 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001241 }
1242
1243 cc_library {
1244 name: "libfoo",
1245 srcs: ["mylib.cpp"],
1246 shared_libs: ["libbar"],
1247 system_shared_libs: [],
1248 stl: "none",
1249 stubs: {
1250 versions: ["10", "20", "30"],
1251 },
1252 }
1253
1254 cc_library {
1255 name: "libbar",
1256 srcs: ["mylib.cpp"],
1257 system_shared_libs: [],
1258 stl: "none",
1259 }
1260
Jiyong Park678c8812020-02-07 17:25:49 +09001261 cc_library_static {
1262 name: "libbaz",
1263 srcs: ["mylib.cpp"],
1264 system_shared_libs: [],
1265 stl: "none",
1266 apex_available: [ "myapex2" ],
1267 }
1268
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001269 `)
1270
Jiyong Park83dc74b2020-01-14 18:38:44 +09001271 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001272 copyCmds := apexRule.Args["copy_commands"]
1273
1274 // Ensure that direct non-stubs dep is always included
1275 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1276
1277 // Ensure that indirect stubs dep is not included
1278 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1279
1280 // Ensure that dependency of stubs is not included
1281 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1282
Colin Crossaede88c2020-08-11 12:17:01 -07001283 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001284
1285 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001286 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001287 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001288 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289
Jiyong Park3ff16992019-12-27 14:11:47 +09001290 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001291
1292 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1293 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001294
Artur Satayeva8bd1132020-04-27 18:07:06 +01001295 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001296 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001297
Artur Satayeva8bd1132020-04-27 18:07:06 +01001298 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001299 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001300}
1301
Jooyung Hand3639552019-08-09 12:57:43 +09001302func TestApexWithRuntimeLibsDependency(t *testing.T) {
1303 /*
1304 myapex
1305 |
1306 v (runtime_libs)
1307 mylib ------+------> libfoo [provides stub]
1308 |
1309 `------> libbar
1310 */
Colin Cross1c460562021-02-16 17:55:47 -08001311 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001312 apex {
1313 name: "myapex",
1314 key: "myapex.key",
1315 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001316 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001317 }
1318
1319 apex_key {
1320 name: "myapex.key",
1321 public_key: "testkey.avbpubkey",
1322 private_key: "testkey.pem",
1323 }
1324
1325 cc_library {
1326 name: "mylib",
1327 srcs: ["mylib.cpp"],
1328 runtime_libs: ["libfoo", "libbar"],
1329 system_shared_libs: [],
1330 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001331 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001332 }
1333
1334 cc_library {
1335 name: "libfoo",
1336 srcs: ["mylib.cpp"],
1337 system_shared_libs: [],
1338 stl: "none",
1339 stubs: {
1340 versions: ["10", "20", "30"],
1341 },
1342 }
1343
1344 cc_library {
1345 name: "libbar",
1346 srcs: ["mylib.cpp"],
1347 system_shared_libs: [],
1348 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001349 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001350 }
1351
1352 `)
1353
Sundong Ahnabb64432019-10-22 13:58:29 +09001354 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001355 copyCmds := apexRule.Args["copy_commands"]
1356
1357 // Ensure that direct non-stubs dep is always included
1358 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1359
1360 // Ensure that indirect stubs dep is not included
1361 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1362
1363 // Ensure that runtime_libs dep in included
1364 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1365
Sundong Ahnabb64432019-10-22 13:58:29 +09001366 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001367 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1368 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001369
1370}
1371
Paul Duffina02cae32021-03-09 01:44:06 +00001372var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1373 cc.PrepareForTestWithCcBuildComponents,
1374 PrepareForTestWithApexBuildComponents,
1375 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001376 apex {
1377 name: "com.android.runtime",
1378 key: "com.android.runtime.key",
1379 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001380 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001381 }
1382
1383 apex_key {
1384 name: "com.android.runtime.key",
1385 public_key: "testkey.avbpubkey",
1386 private_key: "testkey.pem",
1387 }
Paul Duffina02cae32021-03-09 01:44:06 +00001388 `),
1389 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1390)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001391
Paul Duffina02cae32021-03-09 01:44:06 +00001392func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001393 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001394 cc_library {
1395 name: "libc",
1396 no_libcrt: true,
1397 nocrt: true,
1398 stl: "none",
1399 system_shared_libs: [],
1400 stubs: { versions: ["1"] },
1401 apex_available: ["com.android.runtime"],
1402
1403 sanitize: {
1404 hwaddress: true,
1405 }
1406 }
1407
1408 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001409 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001410 no_libcrt: true,
1411 nocrt: true,
1412 stl: "none",
1413 system_shared_libs: [],
1414 srcs: [""],
1415 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001416 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001417
1418 sanitize: {
1419 never: true,
1420 },
Paul Duffina02cae32021-03-09 01:44:06 +00001421 } `)
1422 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001423
1424 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1425 "lib64/bionic/libc.so",
1426 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1427 })
1428
Colin Cross4c4c1be2022-02-10 11:41:18 -08001429 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001430
1431 installed := hwasan.Description("install libclang_rt.hwasan")
1432 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1433
1434 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1435 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1436 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1437}
1438
1439func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001440 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001441 prepareForTestOfRuntimeApexWithHwasan,
1442 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1443 variables.SanitizeDevice = []string{"hwaddress"}
1444 }),
1445 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001446 cc_library {
1447 name: "libc",
1448 no_libcrt: true,
1449 nocrt: true,
1450 stl: "none",
1451 system_shared_libs: [],
1452 stubs: { versions: ["1"] },
1453 apex_available: ["com.android.runtime"],
1454 }
1455
1456 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001457 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001458 no_libcrt: true,
1459 nocrt: true,
1460 stl: "none",
1461 system_shared_libs: [],
1462 srcs: [""],
1463 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001464 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001465
1466 sanitize: {
1467 never: true,
1468 },
1469 }
Paul Duffina02cae32021-03-09 01:44:06 +00001470 `)
1471 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001472
1473 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1474 "lib64/bionic/libc.so",
1475 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1476 })
1477
Colin Cross4c4c1be2022-02-10 11:41:18 -08001478 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001479
1480 installed := hwasan.Description("install libclang_rt.hwasan")
1481 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1482
1483 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1484 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1485 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1486}
1487
Jooyung Han61b66e92020-03-21 14:21:46 +00001488func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1489 testcases := []struct {
1490 name string
1491 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001492 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001493 shouldLink string
1494 shouldNotLink []string
1495 }{
1496 {
Jiyong Park55549df2021-02-26 23:57:23 +09001497 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001498 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001499 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001500 shouldLink: "current",
1501 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001502 },
1503 {
Jiyong Park55549df2021-02-26 23:57:23 +09001504 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001505 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001506 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001507 shouldLink: "current",
1508 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001509 },
1510 }
1511 for _, tc := range testcases {
1512 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001513 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001514 apex {
1515 name: "myapex",
1516 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001517 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001518 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001519 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001520 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001521
Jooyung Han61b66e92020-03-21 14:21:46 +00001522 apex_key {
1523 name: "myapex.key",
1524 public_key: "testkey.avbpubkey",
1525 private_key: "testkey.pem",
1526 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001527
Jooyung Han61b66e92020-03-21 14:21:46 +00001528 cc_library {
1529 name: "mylib",
1530 srcs: ["mylib.cpp"],
1531 vendor_available: true,
1532 shared_libs: ["libbar"],
1533 system_shared_libs: [],
1534 stl: "none",
1535 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001536 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001537 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001538
Jooyung Han61b66e92020-03-21 14:21:46 +00001539 cc_library {
1540 name: "libbar",
1541 srcs: ["mylib.cpp"],
1542 system_shared_libs: [],
1543 stl: "none",
1544 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001545 llndk: {
1546 symbol_file: "libbar.map.txt",
1547 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001548 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001549 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001550 withUnbundledBuild,
1551 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001552
Jooyung Han61b66e92020-03-21 14:21:46 +00001553 // Ensure that LLNDK dep is not included
1554 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1555 "lib64/mylib.so",
1556 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001557
Jooyung Han61b66e92020-03-21 14:21:46 +00001558 // Ensure that LLNDK dep is required
1559 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1560 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1561 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Steven Moreland2c4000c2021-04-27 02:08:49 +00001563 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1564 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001565 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001566 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001567 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001568
Steven Moreland2c4000c2021-04-27 02:08:49 +00001569 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001570 ver := tc.shouldLink
1571 if tc.shouldLink == "current" {
1572 ver = strconv.Itoa(android.FutureApiLevelInt)
1573 }
1574 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001575 })
1576 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001577}
1578
Jiyong Park25fc6a92018-11-18 18:02:45 +09001579func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001580 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001581 apex {
1582 name: "myapex",
1583 key: "myapex.key",
1584 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001585 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001586 }
1587
1588 apex_key {
1589 name: "myapex.key",
1590 public_key: "testkey.avbpubkey",
1591 private_key: "testkey.pem",
1592 }
1593
1594 cc_library {
1595 name: "mylib",
1596 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001597 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001598 shared_libs: ["libdl#27"],
1599 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001600 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001601 }
1602
1603 cc_library_shared {
1604 name: "mylib_shared",
1605 srcs: ["mylib.cpp"],
1606 shared_libs: ["libdl#27"],
1607 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001608 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001609 }
1610
1611 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001612 name: "libBootstrap",
1613 srcs: ["mylib.cpp"],
1614 stl: "none",
1615 bootstrap: true,
1616 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001617 `)
1618
Sundong Ahnabb64432019-10-22 13:58:29 +09001619 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001620 copyCmds := apexRule.Args["copy_commands"]
1621
1622 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001623 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001624 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1625 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001626
1627 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001628 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001629
Colin Crossaede88c2020-08-11 12:17:01 -07001630 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1631 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1632 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001633
1634 // For dependency to libc
1635 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001636 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001637 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001638 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001639 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001640 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1641 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001642
1643 // For dependency to libm
1644 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001645 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001646 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001647 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001648 // ... and is not compiling with the stub
1649 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1650 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1651
1652 // For dependency to libdl
1653 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001654 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001655 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001656 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1657 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001658 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001659 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660 // ... Cflags from stub is correctly exported to mylib
1661 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1662 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001663
1664 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001665 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1666 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1667 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1668 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001669}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001670
Jooyung Han749dc692020-04-15 11:03:39 +09001671func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001672 // there are three links between liba --> libz.
1673 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001674 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001675 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001676 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001677 apex {
1678 name: "myapex",
1679 key: "myapex.key",
1680 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001681 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001682 }
1683
1684 apex {
1685 name: "otherapex",
1686 key: "myapex.key",
1687 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001688 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001689 }
1690
1691 apex_key {
1692 name: "myapex.key",
1693 public_key: "testkey.avbpubkey",
1694 private_key: "testkey.pem",
1695 }
1696
1697 cc_library {
1698 name: "libx",
1699 shared_libs: ["liba"],
1700 system_shared_libs: [],
1701 stl: "none",
1702 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001703 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001704 }
1705
1706 cc_library {
1707 name: "liby",
1708 shared_libs: ["liba"],
1709 system_shared_libs: [],
1710 stl: "none",
1711 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001712 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001713 }
1714
1715 cc_library {
1716 name: "liba",
1717 shared_libs: ["libz"],
1718 system_shared_libs: [],
1719 stl: "none",
1720 apex_available: [
1721 "//apex_available:anyapex",
1722 "//apex_available:platform",
1723 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001724 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001725 }
1726
1727 cc_library {
1728 name: "libz",
1729 system_shared_libs: [],
1730 stl: "none",
1731 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001732 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001733 },
1734 }
Jooyung Han749dc692020-04-15 11:03:39 +09001735 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001736
1737 expectLink := func(from, from_variant, to, to_variant string) {
1738 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1739 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1740 }
1741 expectNoLink := func(from, from_variant, to, to_variant string) {
1742 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1743 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1744 }
1745 // platform liba is linked to non-stub version
1746 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001747 // liba in myapex is linked to current
1748 expectLink("liba", "shared_apex29", "libz", "shared_current")
1749 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001750 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001751 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001752 // liba in otherapex is linked to current
1753 expectLink("liba", "shared_apex30", "libz", "shared_current")
1754 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001755 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1756 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001757}
1758
Jooyung Hanaed150d2020-04-02 01:41:41 +09001759func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001760 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001761 apex {
1762 name: "myapex",
1763 key: "myapex.key",
1764 native_shared_libs: ["libx"],
1765 min_sdk_version: "R",
1766 }
1767
1768 apex_key {
1769 name: "myapex.key",
1770 public_key: "testkey.avbpubkey",
1771 private_key: "testkey.pem",
1772 }
1773
1774 cc_library {
1775 name: "libx",
1776 shared_libs: ["libz"],
1777 system_shared_libs: [],
1778 stl: "none",
1779 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001780 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001781 }
1782
1783 cc_library {
1784 name: "libz",
1785 system_shared_libs: [],
1786 stl: "none",
1787 stubs: {
1788 versions: ["29", "R"],
1789 },
1790 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001791 `,
1792 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1793 variables.Platform_version_active_codenames = []string{"R"}
1794 }),
1795 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001796
1797 expectLink := func(from, from_variant, to, to_variant string) {
1798 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1799 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1800 }
1801 expectNoLink := func(from, from_variant, to, to_variant string) {
1802 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1803 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1804 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001805 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1806 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001807 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1808 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001809}
1810
Jooyung Han4c4da062021-06-23 10:23:16 +09001811func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1812 testApex(t, `
1813 apex {
1814 name: "myapex",
1815 key: "myapex.key",
1816 java_libs: ["libx"],
1817 min_sdk_version: "S",
1818 }
1819
1820 apex_key {
1821 name: "myapex.key",
1822 public_key: "testkey.avbpubkey",
1823 private_key: "testkey.pem",
1824 }
1825
1826 java_library {
1827 name: "libx",
1828 srcs: ["a.java"],
1829 apex_available: [ "myapex" ],
1830 sdk_version: "current",
1831 min_sdk_version: "S", // should be okay
1832 }
1833 `,
1834 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1835 variables.Platform_version_active_codenames = []string{"S"}
1836 variables.Platform_sdk_codename = proptools.StringPtr("S")
1837 }),
1838 )
1839}
1840
Jooyung Han749dc692020-04-15 11:03:39 +09001841func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001842 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001843 apex {
1844 name: "myapex",
1845 key: "myapex.key",
1846 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001847 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001848 }
1849
1850 apex_key {
1851 name: "myapex.key",
1852 public_key: "testkey.avbpubkey",
1853 private_key: "testkey.pem",
1854 }
1855
1856 cc_library {
1857 name: "libx",
1858 shared_libs: ["libz"],
1859 system_shared_libs: [],
1860 stl: "none",
1861 apex_available: [ "myapex" ],
1862 }
1863
1864 cc_library {
1865 name: "libz",
1866 system_shared_libs: [],
1867 stl: "none",
1868 stubs: {
1869 versions: ["1", "2"],
1870 },
1871 }
1872 `)
1873
1874 expectLink := func(from, from_variant, to, to_variant string) {
1875 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1876 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1877 }
1878 expectNoLink := func(from, from_variant, to, to_variant string) {
1879 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1880 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1881 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001882 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001883 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001884 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001885 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001886}
1887
Jiyong Park5df7bd32021-08-25 16:18:46 +09001888func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1889 ctx := testApex(t, `
1890 apex {
1891 name: "myapex",
1892 key: "myapex.key",
1893 native_shared_libs: ["mylib"],
1894 updatable: false,
1895 vendor: true,
1896 min_sdk_version: "29",
1897 }
1898
1899 apex_key {
1900 name: "myapex.key",
1901 public_key: "testkey.avbpubkey",
1902 private_key: "testkey.pem",
1903 }
1904
1905 cc_library {
1906 name: "mylib",
1907 vendor_available: true,
1908 system_shared_libs: [],
1909 stl: "none",
1910 apex_available: [ "myapex" ],
1911 min_sdk_version: "29",
1912 }
1913 `)
1914
1915 vendorVariant := "android_vendor.29_arm64_armv8-a"
1916
1917 // First check that the correct variant of crtbegin_so is used.
1918 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1919 crtBegin := names(ldRule.Args["crtBegin"])
1920 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1921
1922 // Ensure that the crtbegin_so used by the APEX is targeting 29
1923 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1924 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1925}
1926
Jooyung Han03b51852020-02-26 22:45:42 +09001927func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001928 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001929 apex {
1930 name: "myapex",
1931 key: "myapex.key",
1932 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001933 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001934 }
1935
1936 apex_key {
1937 name: "myapex.key",
1938 public_key: "testkey.avbpubkey",
1939 private_key: "testkey.pem",
1940 }
1941
1942 cc_library {
1943 name: "libx",
1944 system_shared_libs: [],
1945 stl: "none",
1946 apex_available: [ "myapex" ],
1947 stubs: {
1948 versions: ["1", "2"],
1949 },
1950 }
1951
1952 cc_library {
1953 name: "libz",
1954 shared_libs: ["libx"],
1955 system_shared_libs: [],
1956 stl: "none",
1957 }
1958 `)
1959
1960 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001961 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001962 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1963 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1964 }
1965 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001966 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001967 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1968 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1969 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001970 expectLink("libz", "shared", "libx", "shared_current")
1971 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001972 expectNoLink("libz", "shared", "libz", "shared_1")
1973 expectNoLink("libz", "shared", "libz", "shared")
1974}
1975
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001976var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1977 func(variables android.FixtureProductVariables) {
1978 variables.SanitizeDevice = []string{"hwaddress"}
1979 },
1980)
1981
Jooyung Han75568392020-03-20 04:29:24 +09001982func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001983 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001984 apex {
1985 name: "myapex",
1986 key: "myapex.key",
1987 native_shared_libs: ["libx"],
1988 min_sdk_version: "29",
1989 }
1990
1991 apex_key {
1992 name: "myapex.key",
1993 public_key: "testkey.avbpubkey",
1994 private_key: "testkey.pem",
1995 }
1996
1997 cc_library {
1998 name: "libx",
1999 shared_libs: ["libbar"],
2000 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002001 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002002 }
2003
2004 cc_library {
2005 name: "libbar",
2006 stubs: {
2007 versions: ["29", "30"],
2008 },
2009 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002010 `,
2011 prepareForTestWithSantitizeHwaddress,
2012 )
Jooyung Han03b51852020-02-26 22:45:42 +09002013 expectLink := func(from, from_variant, to, to_variant string) {
2014 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2015 libFlags := ld.Args["libFlags"]
2016 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2017 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002018 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002019}
2020
Jooyung Han75568392020-03-20 04:29:24 +09002021func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002022 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002023 apex {
2024 name: "myapex",
2025 key: "myapex.key",
2026 native_shared_libs: ["libx"],
2027 min_sdk_version: "29",
2028 }
2029
2030 apex_key {
2031 name: "myapex.key",
2032 public_key: "testkey.avbpubkey",
2033 private_key: "testkey.pem",
2034 }
2035
2036 cc_library {
2037 name: "libx",
2038 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002039 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002040 }
Jooyung Han75568392020-03-20 04:29:24 +09002041 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002042
2043 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002044 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002045 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002046 // note that platform variant is not.
2047 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002048 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002049}
2050
Jooyung Han749dc692020-04-15 11:03:39 +09002051func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2052 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002053 apex {
2054 name: "myapex",
2055 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002056 native_shared_libs: ["mylib"],
2057 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002058 }
2059
2060 apex_key {
2061 name: "myapex.key",
2062 public_key: "testkey.avbpubkey",
2063 private_key: "testkey.pem",
2064 }
Jooyung Han749dc692020-04-15 11:03:39 +09002065
2066 cc_library {
2067 name: "mylib",
2068 srcs: ["mylib.cpp"],
2069 system_shared_libs: [],
2070 stl: "none",
2071 apex_available: [
2072 "myapex",
2073 ],
2074 min_sdk_version: "30",
2075 }
2076 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002077
2078 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2079 apex {
2080 name: "myapex",
2081 key: "myapex.key",
2082 native_shared_libs: ["libfoo.ffi"],
2083 min_sdk_version: "29",
2084 }
2085
2086 apex_key {
2087 name: "myapex.key",
2088 public_key: "testkey.avbpubkey",
2089 private_key: "testkey.pem",
2090 }
2091
2092 rust_ffi_shared {
2093 name: "libfoo.ffi",
2094 srcs: ["foo.rs"],
2095 crate_name: "foo",
2096 apex_available: [
2097 "myapex",
2098 ],
2099 min_sdk_version: "30",
2100 }
2101 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002102
2103 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2104 apex {
2105 name: "myapex",
2106 key: "myapex.key",
2107 java_libs: ["libfoo"],
2108 min_sdk_version: "29",
2109 }
2110
2111 apex_key {
2112 name: "myapex.key",
2113 public_key: "testkey.avbpubkey",
2114 private_key: "testkey.pem",
2115 }
2116
2117 java_import {
2118 name: "libfoo",
2119 jars: ["libfoo.jar"],
2120 apex_available: [
2121 "myapex",
2122 ],
2123 min_sdk_version: "30",
2124 }
2125 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002126}
2127
2128func TestApexMinSdkVersion_Okay(t *testing.T) {
2129 testApex(t, `
2130 apex {
2131 name: "myapex",
2132 key: "myapex.key",
2133 native_shared_libs: ["libfoo"],
2134 java_libs: ["libbar"],
2135 min_sdk_version: "29",
2136 }
2137
2138 apex_key {
2139 name: "myapex.key",
2140 public_key: "testkey.avbpubkey",
2141 private_key: "testkey.pem",
2142 }
2143
2144 cc_library {
2145 name: "libfoo",
2146 srcs: ["mylib.cpp"],
2147 shared_libs: ["libfoo_dep"],
2148 apex_available: ["myapex"],
2149 min_sdk_version: "29",
2150 }
2151
2152 cc_library {
2153 name: "libfoo_dep",
2154 srcs: ["mylib.cpp"],
2155 apex_available: ["myapex"],
2156 min_sdk_version: "29",
2157 }
2158
2159 java_library {
2160 name: "libbar",
2161 sdk_version: "current",
2162 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002163 static_libs: [
2164 "libbar_dep",
2165 "libbar_import_dep",
2166 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002167 apex_available: ["myapex"],
2168 min_sdk_version: "29",
2169 }
2170
2171 java_library {
2172 name: "libbar_dep",
2173 sdk_version: "current",
2174 srcs: ["a.java"],
2175 apex_available: ["myapex"],
2176 min_sdk_version: "29",
2177 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002178
2179 java_import {
2180 name: "libbar_import_dep",
2181 jars: ["libbar.jar"],
2182 apex_available: ["myapex"],
2183 min_sdk_version: "29",
2184 }
Jooyung Han03b51852020-02-26 22:45:42 +09002185 `)
2186}
2187
Artur Satayev8cf899a2020-04-15 17:29:42 +01002188func TestJavaStableSdkVersion(t *testing.T) {
2189 testCases := []struct {
2190 name string
2191 expectedError string
2192 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002193 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002194 }{
2195 {
2196 name: "Non-updatable apex with non-stable dep",
2197 bp: `
2198 apex {
2199 name: "myapex",
2200 java_libs: ["myjar"],
2201 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002202 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002203 }
2204 apex_key {
2205 name: "myapex.key",
2206 public_key: "testkey.avbpubkey",
2207 private_key: "testkey.pem",
2208 }
2209 java_library {
2210 name: "myjar",
2211 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002212 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002213 apex_available: ["myapex"],
2214 }
2215 `,
2216 },
2217 {
2218 name: "Updatable apex with stable dep",
2219 bp: `
2220 apex {
2221 name: "myapex",
2222 java_libs: ["myjar"],
2223 key: "myapex.key",
2224 updatable: true,
2225 min_sdk_version: "29",
2226 }
2227 apex_key {
2228 name: "myapex.key",
2229 public_key: "testkey.avbpubkey",
2230 private_key: "testkey.pem",
2231 }
2232 java_library {
2233 name: "myjar",
2234 srcs: ["foo/bar/MyClass.java"],
2235 sdk_version: "current",
2236 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002237 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002238 }
2239 `,
2240 },
2241 {
2242 name: "Updatable apex with non-stable dep",
2243 expectedError: "cannot depend on \"myjar\"",
2244 bp: `
2245 apex {
2246 name: "myapex",
2247 java_libs: ["myjar"],
2248 key: "myapex.key",
2249 updatable: true,
2250 }
2251 apex_key {
2252 name: "myapex.key",
2253 public_key: "testkey.avbpubkey",
2254 private_key: "testkey.pem",
2255 }
2256 java_library {
2257 name: "myjar",
2258 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002259 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002260 apex_available: ["myapex"],
2261 }
2262 `,
2263 },
2264 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002265 name: "Updatable apex with non-stable legacy core platform dep",
2266 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2267 bp: `
2268 apex {
2269 name: "myapex",
2270 java_libs: ["myjar-uses-legacy"],
2271 key: "myapex.key",
2272 updatable: true,
2273 }
2274 apex_key {
2275 name: "myapex.key",
2276 public_key: "testkey.avbpubkey",
2277 private_key: "testkey.pem",
2278 }
2279 java_library {
2280 name: "myjar-uses-legacy",
2281 srcs: ["foo/bar/MyClass.java"],
2282 sdk_version: "core_platform",
2283 apex_available: ["myapex"],
2284 }
2285 `,
2286 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2287 },
2288 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002289 name: "Updatable apex with non-stable transitive dep",
2290 // This is not actually detecting that the transitive dependency is unstable, rather it is
2291 // detecting that the transitive dependency is building against a wider API surface than the
2292 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002293 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002294 bp: `
2295 apex {
2296 name: "myapex",
2297 java_libs: ["myjar"],
2298 key: "myapex.key",
2299 updatable: true,
2300 }
2301 apex_key {
2302 name: "myapex.key",
2303 public_key: "testkey.avbpubkey",
2304 private_key: "testkey.pem",
2305 }
2306 java_library {
2307 name: "myjar",
2308 srcs: ["foo/bar/MyClass.java"],
2309 sdk_version: "current",
2310 apex_available: ["myapex"],
2311 static_libs: ["transitive-jar"],
2312 }
2313 java_library {
2314 name: "transitive-jar",
2315 srcs: ["foo/bar/MyClass.java"],
2316 sdk_version: "core_platform",
2317 apex_available: ["myapex"],
2318 }
2319 `,
2320 },
2321 }
2322
2323 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002324 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2325 continue
2326 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002327 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002328 errorHandler := android.FixtureExpectsNoErrors
2329 if test.expectedError != "" {
2330 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002331 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002332 android.GroupFixturePreparers(
2333 java.PrepareForTestWithJavaDefaultModules,
2334 PrepareForTestWithApexBuildComponents,
2335 prepareForTestWithMyapex,
2336 android.OptionalFixturePreparer(test.preparer),
2337 ).
2338 ExtendWithErrorHandler(errorHandler).
2339 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002340 })
2341 }
2342}
2343
Jooyung Han749dc692020-04-15 11:03:39 +09002344func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2345 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2346 apex {
2347 name: "myapex",
2348 key: "myapex.key",
2349 native_shared_libs: ["mylib"],
2350 min_sdk_version: "29",
2351 }
2352
2353 apex_key {
2354 name: "myapex.key",
2355 public_key: "testkey.avbpubkey",
2356 private_key: "testkey.pem",
2357 }
2358
2359 cc_library {
2360 name: "mylib",
2361 srcs: ["mylib.cpp"],
2362 shared_libs: ["mylib2"],
2363 system_shared_libs: [],
2364 stl: "none",
2365 apex_available: [
2366 "myapex",
2367 ],
2368 min_sdk_version: "29",
2369 }
2370
2371 // indirect part of the apex
2372 cc_library {
2373 name: "mylib2",
2374 srcs: ["mylib.cpp"],
2375 system_shared_libs: [],
2376 stl: "none",
2377 apex_available: [
2378 "myapex",
2379 ],
2380 min_sdk_version: "30",
2381 }
2382 `)
2383}
2384
2385func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2386 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2387 apex {
2388 name: "myapex",
2389 key: "myapex.key",
2390 apps: ["AppFoo"],
2391 min_sdk_version: "29",
2392 }
2393
2394 apex_key {
2395 name: "myapex.key",
2396 public_key: "testkey.avbpubkey",
2397 private_key: "testkey.pem",
2398 }
2399
2400 android_app {
2401 name: "AppFoo",
2402 srcs: ["foo/bar/MyClass.java"],
2403 sdk_version: "current",
2404 min_sdk_version: "29",
2405 system_modules: "none",
2406 stl: "none",
2407 static_libs: ["bar"],
2408 apex_available: [ "myapex" ],
2409 }
2410
2411 java_library {
2412 name: "bar",
2413 sdk_version: "current",
2414 srcs: ["a.java"],
2415 apex_available: [ "myapex" ],
2416 }
2417 `)
2418}
2419
2420func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002421 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002422 apex {
2423 name: "myapex",
2424 key: "myapex.key",
2425 native_shared_libs: ["mylib"],
2426 min_sdk_version: "29",
2427 }
2428
2429 apex_key {
2430 name: "myapex.key",
2431 public_key: "testkey.avbpubkey",
2432 private_key: "testkey.pem",
2433 }
2434
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002435 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002436 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2437 cc_library {
2438 name: "mylib",
2439 srcs: ["mylib.cpp"],
2440 shared_libs: ["mylib2"],
2441 system_shared_libs: [],
2442 stl: "none",
2443 apex_available: ["myapex", "otherapex"],
2444 min_sdk_version: "29",
2445 }
2446
2447 cc_library {
2448 name: "mylib2",
2449 srcs: ["mylib.cpp"],
2450 system_shared_libs: [],
2451 stl: "none",
2452 apex_available: ["otherapex"],
2453 stubs: { versions: ["29", "30"] },
2454 min_sdk_version: "30",
2455 }
2456
2457 apex {
2458 name: "otherapex",
2459 key: "myapex.key",
2460 native_shared_libs: ["mylib", "mylib2"],
2461 min_sdk_version: "30",
2462 }
2463 `)
2464 expectLink := func(from, from_variant, to, to_variant string) {
2465 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2466 libFlags := ld.Args["libFlags"]
2467 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2468 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002469 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002470 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002471}
2472
Jooyung Haned124c32021-01-26 11:43:46 +09002473func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002474 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2475 func(variables android.FixtureProductVariables) {
2476 variables.Platform_sdk_codename = proptools.StringPtr("S")
2477 variables.Platform_version_active_codenames = []string{"S"}
2478 },
2479 )
Jooyung Haned124c32021-01-26 11:43:46 +09002480 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2481 apex {
2482 name: "myapex",
2483 key: "myapex.key",
2484 native_shared_libs: ["libfoo"],
2485 min_sdk_version: "S",
2486 }
2487 apex_key {
2488 name: "myapex.key",
2489 public_key: "testkey.avbpubkey",
2490 private_key: "testkey.pem",
2491 }
2492 cc_library {
2493 name: "libfoo",
2494 shared_libs: ["libbar"],
2495 apex_available: ["myapex"],
2496 min_sdk_version: "29",
2497 }
2498 cc_library {
2499 name: "libbar",
2500 apex_available: ["myapex"],
2501 }
2502 `, withSAsActiveCodeNames)
2503}
2504
2505func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002506 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2507 variables.Platform_sdk_codename = proptools.StringPtr("S")
2508 variables.Platform_version_active_codenames = []string{"S", "T"}
2509 })
Colin Cross1c460562021-02-16 17:55:47 -08002510 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002511 apex {
2512 name: "myapex",
2513 key: "myapex.key",
2514 native_shared_libs: ["libfoo"],
2515 min_sdk_version: "S",
2516 }
2517 apex_key {
2518 name: "myapex.key",
2519 public_key: "testkey.avbpubkey",
2520 private_key: "testkey.pem",
2521 }
2522 cc_library {
2523 name: "libfoo",
2524 shared_libs: ["libbar"],
2525 apex_available: ["myapex"],
2526 min_sdk_version: "S",
2527 }
2528 cc_library {
2529 name: "libbar",
2530 stubs: {
2531 symbol_file: "libbar.map.txt",
2532 versions: ["30", "S", "T"],
2533 },
2534 }
2535 `, withSAsActiveCodeNames)
2536
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002537 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002538 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2539 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002540 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002541}
2542
Jiyong Park7c2ee712018-12-07 00:42:25 +09002543func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002544 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002545 apex {
2546 name: "myapex",
2547 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002548 native_shared_libs: ["mylib"],
2549 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002550 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002551 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002552 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002553 }
2554
2555 apex_key {
2556 name: "myapex.key",
2557 public_key: "testkey.avbpubkey",
2558 private_key: "testkey.pem",
2559 }
2560
2561 prebuilt_etc {
2562 name: "myetc",
2563 src: "myprebuilt",
2564 sub_dir: "foo/bar",
2565 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002566
2567 cc_library {
2568 name: "mylib",
2569 srcs: ["mylib.cpp"],
2570 relative_install_path: "foo/bar",
2571 system_shared_libs: [],
2572 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002573 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002574 }
2575
2576 cc_binary {
2577 name: "mybin",
2578 srcs: ["mylib.cpp"],
2579 relative_install_path: "foo/bar",
2580 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002581 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002582 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002583 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002584 `)
2585
Sundong Ahnabb64432019-10-22 13:58:29 +09002586 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002587 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002588
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002589 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002590 ensureContains(t, cmd, "/etc ")
2591 ensureContains(t, cmd, "/etc/foo ")
2592 ensureContains(t, cmd, "/etc/foo/bar ")
2593 ensureContains(t, cmd, "/lib64 ")
2594 ensureContains(t, cmd, "/lib64/foo ")
2595 ensureContains(t, cmd, "/lib64/foo/bar ")
2596 ensureContains(t, cmd, "/lib ")
2597 ensureContains(t, cmd, "/lib/foo ")
2598 ensureContains(t, cmd, "/lib/foo/bar ")
2599 ensureContains(t, cmd, "/bin ")
2600 ensureContains(t, cmd, "/bin/foo ")
2601 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002602}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002603
Jooyung Han35155c42020-02-06 17:33:20 +09002604func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002605 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002606 apex {
2607 name: "myapex",
2608 key: "myapex.key",
2609 multilib: {
2610 both: {
2611 native_shared_libs: ["mylib"],
2612 binaries: ["mybin"],
2613 },
2614 },
2615 compile_multilib: "both",
2616 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002617 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002618 }
2619
2620 apex_key {
2621 name: "myapex.key",
2622 public_key: "testkey.avbpubkey",
2623 private_key: "testkey.pem",
2624 }
2625
2626 cc_library {
2627 name: "mylib",
2628 relative_install_path: "foo/bar",
2629 system_shared_libs: [],
2630 stl: "none",
2631 apex_available: [ "myapex" ],
2632 native_bridge_supported: true,
2633 }
2634
2635 cc_binary {
2636 name: "mybin",
2637 relative_install_path: "foo/bar",
2638 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002639 stl: "none",
2640 apex_available: [ "myapex" ],
2641 native_bridge_supported: true,
2642 compile_multilib: "both", // default is "first" for binary
2643 multilib: {
2644 lib64: {
2645 suffix: "64",
2646 },
2647 },
2648 }
2649 `, withNativeBridgeEnabled)
2650 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2651 "bin/foo/bar/mybin",
2652 "bin/foo/bar/mybin64",
2653 "bin/arm/foo/bar/mybin",
2654 "bin/arm64/foo/bar/mybin64",
2655 "lib/foo/bar/mylib.so",
2656 "lib/arm/foo/bar/mylib.so",
2657 "lib64/foo/bar/mylib.so",
2658 "lib64/arm64/foo/bar/mylib.so",
2659 })
2660}
2661
Jooyung Han85d61762020-06-24 23:50:26 +09002662func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002663 result := android.GroupFixturePreparers(
2664 prepareForApexTest,
2665 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2666 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002667 apex {
2668 name: "myapex",
2669 key: "myapex.key",
2670 binaries: ["mybin"],
2671 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002672 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002673 }
2674 apex_key {
2675 name: "myapex.key",
2676 public_key: "testkey.avbpubkey",
2677 private_key: "testkey.pem",
2678 }
2679 cc_binary {
2680 name: "mybin",
2681 vendor: true,
2682 shared_libs: ["libfoo"],
2683 }
2684 cc_library {
2685 name: "libfoo",
2686 proprietary: true,
2687 }
2688 `)
2689
Colin Crossc68db4b2021-11-11 18:59:15 -08002690 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002691 "bin/mybin",
2692 "lib64/libfoo.so",
2693 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2694 "lib64/libc++.so",
2695 })
2696
Colin Crossc68db4b2021-11-11 18:59:15 -08002697 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2698 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002699 name := apexBundle.BaseModuleName()
2700 prefix := "TARGET_"
2701 var builder strings.Builder
2702 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002703 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002704 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002705 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002706
Colin Crossc68db4b2021-11-11 18:59:15 -08002707 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002708 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2709 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002710}
2711
Jooyung Hanc5a96762022-02-04 11:54:50 +09002712func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2713 testApexError(t, `Trying to include a VNDK library`, `
2714 apex {
2715 name: "myapex",
2716 key: "myapex.key",
2717 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2718 vendor: true,
2719 use_vndk_as_stable: true,
2720 updatable: false,
2721 }
2722 apex_key {
2723 name: "myapex.key",
2724 public_key: "testkey.avbpubkey",
2725 private_key: "testkey.pem",
2726 }`)
2727}
2728
Jooyung Handf78e212020-07-22 15:54:47 +09002729func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002730 // myapex myapex2
2731 // | |
2732 // mybin ------. mybin2
2733 // \ \ / |
2734 // (stable) .---\--------` |
2735 // \ / \ |
2736 // \ / \ /
2737 // libvndk libvendor
2738 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002739 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002740 apex {
2741 name: "myapex",
2742 key: "myapex.key",
2743 binaries: ["mybin"],
2744 vendor: true,
2745 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002746 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002747 }
2748 apex_key {
2749 name: "myapex.key",
2750 public_key: "testkey.avbpubkey",
2751 private_key: "testkey.pem",
2752 }
2753 cc_binary {
2754 name: "mybin",
2755 vendor: true,
2756 shared_libs: ["libvndk", "libvendor"],
2757 }
2758 cc_library {
2759 name: "libvndk",
2760 vndk: {
2761 enabled: true,
2762 },
2763 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002764 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002765 }
2766 cc_library {
2767 name: "libvendor",
2768 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002769 stl: "none",
2770 }
2771 apex {
2772 name: "myapex2",
2773 key: "myapex.key",
2774 binaries: ["mybin2"],
2775 vendor: true,
2776 use_vndk_as_stable: false,
2777 updatable: false,
2778 }
2779 cc_binary {
2780 name: "mybin2",
2781 vendor: true,
2782 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002783 }
2784 `)
2785
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002786 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002787
Jooyung Han91f92032022-02-04 12:36:33 +09002788 for _, tc := range []struct {
2789 name string
2790 apexName string
2791 moduleName string
2792 moduleVariant string
2793 libs []string
2794 contents []string
2795 requireVndkNamespace bool
2796 }{
2797 {
2798 name: "use_vndk_as_stable",
2799 apexName: "myapex",
2800 moduleName: "mybin",
2801 moduleVariant: vendorVariant + "_apex10000",
2802 libs: []string{
2803 // should link with vendor variants of VNDK libs(libvndk/libc++)
2804 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2805 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2806 // unstable Vendor libs as APEX variant
2807 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2808 },
2809 contents: []string{
2810 "bin/mybin",
2811 "lib64/libvendor.so",
2812 // VNDK libs (libvndk/libc++) are not included
2813 },
2814 requireVndkNamespace: true,
2815 },
2816 {
2817 name: "!use_vndk_as_stable",
2818 apexName: "myapex2",
2819 moduleName: "mybin2",
2820 moduleVariant: vendorVariant + "_myapex2",
2821 libs: []string{
2822 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2823 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2824 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2825 // unstable vendor libs have "merged" APEX variants
2826 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2827 },
2828 contents: []string{
2829 "bin/mybin2",
2830 "lib64/libvendor.so",
2831 // VNDK libs are included as well
2832 "lib64/libvndk.so",
2833 "lib64/libc++.so",
2834 },
2835 requireVndkNamespace: false,
2836 },
2837 } {
2838 t.Run(tc.name, func(t *testing.T) {
2839 // Check linked libs
2840 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2841 libs := names(ldRule.Args["libFlags"])
2842 for _, lib := range tc.libs {
2843 ensureListContains(t, libs, lib)
2844 }
2845 // Check apex contents
2846 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002847
Jooyung Han91f92032022-02-04 12:36:33 +09002848 // Check "requireNativeLibs"
2849 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2850 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2851 if tc.requireVndkNamespace {
2852 ensureListContains(t, requireNativeLibs, ":vndk")
2853 } else {
2854 ensureListNotContains(t, requireNativeLibs, ":vndk")
2855 }
2856 })
2857 }
Jooyung Handf78e212020-07-22 15:54:47 +09002858}
2859
Justin Yun13decfb2021-03-08 19:25:55 +09002860func TestProductVariant(t *testing.T) {
2861 ctx := testApex(t, `
2862 apex {
2863 name: "myapex",
2864 key: "myapex.key",
2865 updatable: false,
2866 product_specific: true,
2867 binaries: ["foo"],
2868 }
2869
2870 apex_key {
2871 name: "myapex.key",
2872 public_key: "testkey.avbpubkey",
2873 private_key: "testkey.pem",
2874 }
2875
2876 cc_binary {
2877 name: "foo",
2878 product_available: true,
2879 apex_available: ["myapex"],
2880 srcs: ["foo.cpp"],
2881 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002882 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2883 variables.ProductVndkVersion = proptools.StringPtr("current")
2884 }),
2885 )
Justin Yun13decfb2021-03-08 19:25:55 +09002886
2887 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002888 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002889 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2890 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2891 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2892 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2893}
2894
Jooyung Han8e5685d2020-09-21 11:02:57 +09002895func TestApex_withPrebuiltFirmware(t *testing.T) {
2896 testCases := []struct {
2897 name string
2898 additionalProp string
2899 }{
2900 {"system apex with prebuilt_firmware", ""},
2901 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2902 }
2903 for _, tc := range testCases {
2904 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002905 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002906 apex {
2907 name: "myapex",
2908 key: "myapex.key",
2909 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002910 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002911 `+tc.additionalProp+`
2912 }
2913 apex_key {
2914 name: "myapex.key",
2915 public_key: "testkey.avbpubkey",
2916 private_key: "testkey.pem",
2917 }
2918 prebuilt_firmware {
2919 name: "myfirmware",
2920 src: "myfirmware.bin",
2921 filename_from_src: true,
2922 `+tc.additionalProp+`
2923 }
2924 `)
2925 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2926 "etc/firmware/myfirmware.bin",
2927 })
2928 })
2929 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002930}
2931
Jooyung Hanefb184e2020-06-25 17:14:25 +09002932func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002933 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002934 apex {
2935 name: "myapex",
2936 key: "myapex.key",
2937 vendor: true,
2938 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002939 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002940 }
2941
2942 apex_key {
2943 name: "myapex.key",
2944 public_key: "testkey.avbpubkey",
2945 private_key: "testkey.pem",
2946 }
2947
2948 cc_library {
2949 name: "mylib",
2950 vendor_available: true,
2951 }
2952 `)
2953
2954 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002955 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002956 name := apexBundle.BaseModuleName()
2957 prefix := "TARGET_"
2958 var builder strings.Builder
2959 data.Custom(&builder, name, prefix, "", data)
2960 androidMk := builder.String()
2961 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2962}
2963
Jooyung Han2ed99d02020-06-24 23:26:26 +09002964func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002965 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002966 apex {
2967 name: "myapex",
2968 key: "myapex.key",
2969 vintf_fragments: ["fragment.xml"],
2970 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002971 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002972 }
2973 apex_key {
2974 name: "myapex.key",
2975 public_key: "testkey.avbpubkey",
2976 private_key: "testkey.pem",
2977 }
2978 cc_binary {
2979 name: "mybin",
2980 }
2981 `)
2982
2983 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002984 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002985 name := apexBundle.BaseModuleName()
2986 prefix := "TARGET_"
2987 var builder strings.Builder
2988 data.Custom(&builder, name, prefix, "", data)
2989 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002990 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002991 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002992}
2993
Jiyong Park16e91a02018-12-20 18:18:08 +09002994func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002995 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002996 apex {
2997 name: "myapex",
2998 key: "myapex.key",
2999 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003000 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003001 }
3002
3003 apex_key {
3004 name: "myapex.key",
3005 public_key: "testkey.avbpubkey",
3006 private_key: "testkey.pem",
3007 }
3008
3009 cc_library {
3010 name: "mylib",
3011 srcs: ["mylib.cpp"],
3012 system_shared_libs: [],
3013 stl: "none",
3014 stubs: {
3015 versions: ["1", "2", "3"],
3016 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003017 apex_available: [
3018 "//apex_available:platform",
3019 "myapex",
3020 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003021 }
3022
3023 cc_binary {
3024 name: "not_in_apex",
3025 srcs: ["mylib.cpp"],
3026 static_libs: ["mylib"],
3027 static_executable: true,
3028 system_shared_libs: [],
3029 stl: "none",
3030 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003031 `)
3032
Colin Cross7113d202019-11-20 16:39:12 -08003033 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003034
3035 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003036 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003037}
Jiyong Park9335a262018-12-24 11:31:58 +09003038
3039func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003040 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003041 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003042 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003043 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003044 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003045 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003046 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003047 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003048 }
3049
3050 cc_library {
3051 name: "mylib",
3052 srcs: ["mylib.cpp"],
3053 system_shared_libs: [],
3054 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003055 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003056 }
3057
3058 apex_key {
3059 name: "myapex.key",
3060 public_key: "testkey.avbpubkey",
3061 private_key: "testkey.pem",
3062 }
3063
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003064 android_app_certificate {
3065 name: "myapex.certificate",
3066 certificate: "testkey",
3067 }
3068
3069 android_app_certificate {
3070 name: "myapex.certificate.override",
3071 certificate: "testkey.override",
3072 }
3073
Jiyong Park9335a262018-12-24 11:31:58 +09003074 `)
3075
3076 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003077 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003078
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003079 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3080 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003081 "vendor/foo/devkeys/testkey.avbpubkey")
3082 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003083 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3084 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003085 "vendor/foo/devkeys/testkey.pem")
3086 }
3087
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003088 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003089 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003090 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003091 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003092 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003093 }
3094}
Jiyong Park58e364a2019-01-19 19:24:06 +09003095
Jooyung Hanf121a652019-12-17 14:30:11 +09003096func TestCertificate(t *testing.T) {
3097 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003098 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003099 apex {
3100 name: "myapex",
3101 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003102 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003103 }
3104 apex_key {
3105 name: "myapex.key",
3106 public_key: "testkey.avbpubkey",
3107 private_key: "testkey.pem",
3108 }`)
3109 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3110 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3111 if actual := rule.Args["certificates"]; actual != expected {
3112 t.Errorf("certificates should be %q, not %q", expected, actual)
3113 }
3114 })
3115 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003116 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003117 apex {
3118 name: "myapex_keytest",
3119 key: "myapex.key",
3120 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003121 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003122 }
3123 apex_key {
3124 name: "myapex.key",
3125 public_key: "testkey.avbpubkey",
3126 private_key: "testkey.pem",
3127 }
3128 android_app_certificate {
3129 name: "myapex.certificate.override",
3130 certificate: "testkey.override",
3131 }`)
3132 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3133 expected := "testkey.override.x509.pem testkey.override.pk8"
3134 if actual := rule.Args["certificates"]; actual != expected {
3135 t.Errorf("certificates should be %q, not %q", expected, actual)
3136 }
3137 })
3138 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003139 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003140 apex {
3141 name: "myapex",
3142 key: "myapex.key",
3143 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003144 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003145 }
3146 apex_key {
3147 name: "myapex.key",
3148 public_key: "testkey.avbpubkey",
3149 private_key: "testkey.pem",
3150 }
3151 android_app_certificate {
3152 name: "myapex.certificate",
3153 certificate: "testkey",
3154 }`)
3155 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3156 expected := "testkey.x509.pem testkey.pk8"
3157 if actual := rule.Args["certificates"]; actual != expected {
3158 t.Errorf("certificates should be %q, not %q", expected, actual)
3159 }
3160 })
3161 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003162 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003163 apex {
3164 name: "myapex_keytest",
3165 key: "myapex.key",
3166 file_contexts: ":myapex-file_contexts",
3167 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003168 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003169 }
3170 apex_key {
3171 name: "myapex.key",
3172 public_key: "testkey.avbpubkey",
3173 private_key: "testkey.pem",
3174 }
3175 android_app_certificate {
3176 name: "myapex.certificate.override",
3177 certificate: "testkey.override",
3178 }`)
3179 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3180 expected := "testkey.override.x509.pem testkey.override.pk8"
3181 if actual := rule.Args["certificates"]; actual != expected {
3182 t.Errorf("certificates should be %q, not %q", expected, actual)
3183 }
3184 })
3185 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003186 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003187 apex {
3188 name: "myapex",
3189 key: "myapex.key",
3190 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003191 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003192 }
3193 apex_key {
3194 name: "myapex.key",
3195 public_key: "testkey.avbpubkey",
3196 private_key: "testkey.pem",
3197 }`)
3198 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3199 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3200 if actual := rule.Args["certificates"]; actual != expected {
3201 t.Errorf("certificates should be %q, not %q", expected, actual)
3202 }
3203 })
3204 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003205 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003206 apex {
3207 name: "myapex_keytest",
3208 key: "myapex.key",
3209 file_contexts: ":myapex-file_contexts",
3210 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003211 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003212 }
3213 apex_key {
3214 name: "myapex.key",
3215 public_key: "testkey.avbpubkey",
3216 private_key: "testkey.pem",
3217 }
3218 android_app_certificate {
3219 name: "myapex.certificate.override",
3220 certificate: "testkey.override",
3221 }`)
3222 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3223 expected := "testkey.override.x509.pem testkey.override.pk8"
3224 if actual := rule.Args["certificates"]; actual != expected {
3225 t.Errorf("certificates should be %q, not %q", expected, actual)
3226 }
3227 })
3228}
3229
Jiyong Park58e364a2019-01-19 19:24:06 +09003230func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003231 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003232 apex {
3233 name: "myapex",
3234 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003235 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003236 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003237 }
3238
3239 apex {
3240 name: "otherapex",
3241 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003242 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003243 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003244 }
3245
3246 apex_key {
3247 name: "myapex.key",
3248 public_key: "testkey.avbpubkey",
3249 private_key: "testkey.pem",
3250 }
3251
3252 cc_library {
3253 name: "mylib",
3254 srcs: ["mylib.cpp"],
3255 system_shared_libs: [],
3256 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003257 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003258 "myapex",
3259 "otherapex",
3260 ],
Jooyung Han24282772020-03-21 23:20:55 +09003261 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003262 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003263 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003264 cc_library {
3265 name: "mylib2",
3266 srcs: ["mylib.cpp"],
3267 system_shared_libs: [],
3268 stl: "none",
3269 apex_available: [
3270 "myapex",
3271 "otherapex",
3272 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003273 static_libs: ["mylib3"],
3274 recovery_available: true,
3275 min_sdk_version: "29",
3276 }
3277 cc_library {
3278 name: "mylib3",
3279 srcs: ["mylib.cpp"],
3280 system_shared_libs: [],
3281 stl: "none",
3282 apex_available: [
3283 "myapex",
3284 "otherapex",
3285 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003286 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003287 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003288 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003289 `)
3290
Jooyung Hanc87a0592020-03-02 17:44:33 +09003291 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003292 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003293 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003294 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003295
Jooyung Hanccce2f22020-03-07 03:45:53 +09003296 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003297 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003298 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003299 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003300
Jooyung Hanccce2f22020-03-07 03:45:53 +09003301 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003302 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003303 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003304 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003305
Colin Crossaede88c2020-08-11 12:17:01 -07003306 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3307 // each variant defines additional macros to distinguish which apex variant it is built for
3308
3309 // non-APEX variant does not have __ANDROID_APEX__ defined
3310 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3311 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3312
Dan Albertb19953d2020-11-17 15:29:36 -08003313 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003314 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3315 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003316 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003317
Jooyung Hanc87a0592020-03-02 17:44:33 +09003318 // non-APEX variant does not have __ANDROID_APEX__ defined
3319 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3320 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3321
Dan Albertb19953d2020-11-17 15:29:36 -08003322 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003323 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003324 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003325 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003326}
Jiyong Park7e636d02019-01-28 16:16:54 +09003327
3328func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003329 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003330 apex {
3331 name: "myapex",
3332 key: "myapex.key",
3333 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003334 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003335 }
3336
3337 apex_key {
3338 name: "myapex.key",
3339 public_key: "testkey.avbpubkey",
3340 private_key: "testkey.pem",
3341 }
3342
3343 cc_library_headers {
3344 name: "mylib_headers",
3345 export_include_dirs: ["my_include"],
3346 system_shared_libs: [],
3347 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003348 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003349 }
3350
3351 cc_library {
3352 name: "mylib",
3353 srcs: ["mylib.cpp"],
3354 system_shared_libs: [],
3355 stl: "none",
3356 header_libs: ["mylib_headers"],
3357 export_header_lib_headers: ["mylib_headers"],
3358 stubs: {
3359 versions: ["1", "2", "3"],
3360 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003361 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003362 }
3363
3364 cc_library {
3365 name: "otherlib",
3366 srcs: ["mylib.cpp"],
3367 system_shared_libs: [],
3368 stl: "none",
3369 shared_libs: ["mylib"],
3370 }
3371 `)
3372
Colin Cross7113d202019-11-20 16:39:12 -08003373 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003374
3375 // Ensure that the include path of the header lib is exported to 'otherlib'
3376 ensureContains(t, cFlags, "-Imy_include")
3377}
Alex Light9670d332019-01-29 18:07:33 -08003378
Jiyong Park7cd10e32020-01-14 09:22:18 +09003379type fileInApex struct {
3380 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003381 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003382 isLink bool
3383}
3384
Jooyung Hana57af4a2020-01-23 05:36:59 +00003385func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003386 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003387 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003388 copyCmds := apexRule.Args["copy_commands"]
3389 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003390 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003391 for _, cmd := range strings.Split(copyCmds, "&&") {
3392 cmd = strings.TrimSpace(cmd)
3393 if cmd == "" {
3394 continue
3395 }
3396 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003397 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003398 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003399 switch terms[0] {
3400 case "mkdir":
3401 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003402 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003403 t.Fatal("copyCmds contains invalid cp command", cmd)
3404 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003405 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003406 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003407 isLink = false
3408 case "ln":
3409 if len(terms) != 3 && len(terms) != 4 {
3410 // ln LINK TARGET or ln -s LINK TARGET
3411 t.Fatal("copyCmds contains invalid ln command", cmd)
3412 }
3413 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003414 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003415 isLink = true
3416 default:
3417 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3418 }
3419 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003420 index := strings.Index(dst, imageApexDir)
3421 if index == -1 {
3422 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3423 }
3424 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003425 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003426 }
3427 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003428 return ret
3429}
3430
Jooyung Hana57af4a2020-01-23 05:36:59 +00003431func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3432 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003433 var failed bool
3434 var surplus []string
3435 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003436 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003437 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003438 for _, expected := range files {
3439 if matched, _ := path.Match(expected, file.path); matched {
3440 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003441 mactchFound = true
3442 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003443 }
3444 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003445 if !mactchFound {
3446 surplus = append(surplus, file.path)
3447 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003448 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003449
Jooyung Han31c470b2019-10-18 16:26:59 +09003450 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003451 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003452 t.Log("surplus files", surplus)
3453 failed = true
3454 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003455
3456 if len(files) > len(filesMatched) {
3457 var missing []string
3458 for _, expected := range files {
3459 if !filesMatched[expected] {
3460 missing = append(missing, expected)
3461 }
3462 }
3463 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003464 t.Log("missing files", missing)
3465 failed = true
3466 }
3467 if failed {
3468 t.Fail()
3469 }
3470}
3471
Jooyung Han344d5432019-08-23 11:17:39 +09003472func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003473 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003474 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003475 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003476 "etc/llndk.libraries.29.txt",
3477 "etc/vndkcore.libraries.29.txt",
3478 "etc/vndksp.libraries.29.txt",
3479 "etc/vndkprivate.libraries.29.txt",
3480 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003481 }
3482 testCases := []struct {
3483 vndkVersion string
3484 expectedFiles []string
3485 }{
3486 {
3487 vndkVersion: "current",
3488 expectedFiles: append(commonFiles,
3489 "lib/libvndk.so",
3490 "lib/libvndksp.so",
3491 "lib64/libvndk.so",
3492 "lib64/libvndksp.so"),
3493 },
3494 {
3495 vndkVersion: "",
3496 expectedFiles: append(commonFiles,
3497 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3498 "lib/libvndksp.so",
3499 "lib64/libvndksp.so"),
3500 },
3501 }
3502 for _, tc := range testCases {
3503 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3504 ctx := testApex(t, `
3505 apex_vndk {
3506 name: "com.android.vndk.current",
3507 key: "com.android.vndk.current.key",
3508 updatable: false,
3509 }
3510
3511 apex_key {
3512 name: "com.android.vndk.current.key",
3513 public_key: "testkey.avbpubkey",
3514 private_key: "testkey.pem",
3515 }
3516
3517 cc_library {
3518 name: "libvndk",
3519 srcs: ["mylib.cpp"],
3520 vendor_available: true,
3521 product_available: true,
3522 vndk: {
3523 enabled: true,
3524 },
3525 system_shared_libs: [],
3526 stl: "none",
3527 apex_available: [ "com.android.vndk.current" ],
3528 }
3529
3530 cc_library {
3531 name: "libvndksp",
3532 srcs: ["mylib.cpp"],
3533 vendor_available: true,
3534 product_available: true,
3535 vndk: {
3536 enabled: true,
3537 support_system_process: true,
3538 },
3539 system_shared_libs: [],
3540 stl: "none",
3541 apex_available: [ "com.android.vndk.current" ],
3542 }
3543
3544 // VNDK-Ext should not cause any problems
3545
3546 cc_library {
3547 name: "libvndk.ext",
3548 srcs: ["mylib2.cpp"],
3549 vendor: true,
3550 vndk: {
3551 enabled: true,
3552 extends: "libvndk",
3553 },
3554 system_shared_libs: [],
3555 stl: "none",
3556 }
3557
3558 cc_library {
3559 name: "libvndksp.ext",
3560 srcs: ["mylib2.cpp"],
3561 vendor: true,
3562 vndk: {
3563 enabled: true,
3564 support_system_process: true,
3565 extends: "libvndksp",
3566 },
3567 system_shared_libs: [],
3568 stl: "none",
3569 }
3570 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3571 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3572 }))
3573 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3574 })
3575 }
Jooyung Han344d5432019-08-23 11:17:39 +09003576}
3577
3578func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003579 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003580 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003581 name: "com.android.vndk.current",
3582 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003583 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003584 }
3585
3586 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003587 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003588 public_key: "testkey.avbpubkey",
3589 private_key: "testkey.pem",
3590 }
3591
3592 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003593 name: "libvndk",
3594 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003595 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003596 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003597 vndk: {
3598 enabled: true,
3599 },
3600 system_shared_libs: [],
3601 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003602 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003603 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003604
3605 cc_prebuilt_library_shared {
3606 name: "libvndk.arm",
3607 srcs: ["libvndk.arm.so"],
3608 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003609 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003610 vndk: {
3611 enabled: true,
3612 },
3613 enabled: false,
3614 arch: {
3615 arm: {
3616 enabled: true,
3617 },
3618 },
3619 system_shared_libs: [],
3620 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003621 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003622 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003623 `+vndkLibrariesTxtFiles("current"),
3624 withFiles(map[string][]byte{
3625 "libvndk.so": nil,
3626 "libvndk.arm.so": nil,
3627 }))
Colin Cross2807f002021-03-02 10:15:29 -08003628 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003629 "lib/libvndk.so",
3630 "lib/libvndk.arm.so",
3631 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003632 "lib/libc++.so",
3633 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003634 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003635 })
Jooyung Han344d5432019-08-23 11:17:39 +09003636}
3637
Jooyung Han39edb6c2019-11-06 16:53:07 +09003638func vndkLibrariesTxtFiles(vers ...string) (result string) {
3639 for _, v := range vers {
3640 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003641 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003642 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003643 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003644 name: "` + txt + `.libraries.txt",
3645 }
3646 `
3647 }
3648 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003649 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003650 result += `
3651 prebuilt_etc {
3652 name: "` + txt + `.libraries.` + v + `.txt",
3653 src: "dummy.txt",
3654 }
3655 `
3656 }
3657 }
3658 }
3659 return
3660}
3661
Jooyung Han344d5432019-08-23 11:17:39 +09003662func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003663 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003664 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003665 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003666 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003667 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003668 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003669 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003670 }
3671
3672 apex_key {
3673 name: "myapex.key",
3674 public_key: "testkey.avbpubkey",
3675 private_key: "testkey.pem",
3676 }
3677
Jooyung Han31c470b2019-10-18 16:26:59 +09003678 vndk_prebuilt_shared {
3679 name: "libvndk27",
3680 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003681 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003682 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003683 vndk: {
3684 enabled: true,
3685 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003686 target_arch: "arm64",
3687 arch: {
3688 arm: {
3689 srcs: ["libvndk27_arm.so"],
3690 },
3691 arm64: {
3692 srcs: ["libvndk27_arm64.so"],
3693 },
3694 },
Colin Cross2807f002021-03-02 10:15:29 -08003695 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003696 }
3697
3698 vndk_prebuilt_shared {
3699 name: "libvndk27",
3700 version: "27",
3701 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003702 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003703 vndk: {
3704 enabled: true,
3705 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003706 target_arch: "x86_64",
3707 arch: {
3708 x86: {
3709 srcs: ["libvndk27_x86.so"],
3710 },
3711 x86_64: {
3712 srcs: ["libvndk27_x86_64.so"],
3713 },
3714 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003715 }
3716 `+vndkLibrariesTxtFiles("27"),
3717 withFiles(map[string][]byte{
3718 "libvndk27_arm.so": nil,
3719 "libvndk27_arm64.so": nil,
3720 "libvndk27_x86.so": nil,
3721 "libvndk27_x86_64.so": nil,
3722 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003723
Colin Cross2807f002021-03-02 10:15:29 -08003724 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003725 "lib/libvndk27_arm.so",
3726 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003727 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003728 })
Jooyung Han344d5432019-08-23 11:17:39 +09003729}
3730
Jooyung Han90eee022019-10-01 20:02:42 +09003731func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003732 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003733 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003734 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003735 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003736 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003737 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003738 }
3739 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003740 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003741 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003742 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003743 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003744 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003745 }
3746 apex_key {
3747 name: "myapex.key",
3748 public_key: "testkey.avbpubkey",
3749 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003750 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003751
3752 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003753 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003754 actual := proptools.String(bundle.properties.Apex_name)
3755 if !reflect.DeepEqual(actual, expected) {
3756 t.Errorf("Got '%v', expected '%v'", actual, expected)
3757 }
3758 }
3759
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003760 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003761 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003762}
3763
Jooyung Han344d5432019-08-23 11:17:39 +09003764func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003765 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003766 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003767 name: "com.android.vndk.current",
3768 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003769 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003770 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003771 }
3772
3773 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003774 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003775 public_key: "testkey.avbpubkey",
3776 private_key: "testkey.pem",
3777 }
3778
3779 cc_library {
3780 name: "libvndk",
3781 srcs: ["mylib.cpp"],
3782 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003783 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003784 native_bridge_supported: true,
3785 host_supported: true,
3786 vndk: {
3787 enabled: true,
3788 },
3789 system_shared_libs: [],
3790 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003791 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003792 }
Colin Cross2807f002021-03-02 10:15:29 -08003793 `+vndkLibrariesTxtFiles("current"),
3794 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003795
Colin Cross2807f002021-03-02 10:15:29 -08003796 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003797 "lib/libvndk.so",
3798 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003799 "lib/libc++.so",
3800 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003801 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003802 })
Jooyung Han344d5432019-08-23 11:17:39 +09003803}
3804
3805func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003806 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003807 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003808 name: "com.android.vndk.current",
3809 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003810 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003811 native_bridge_supported: true,
3812 }
3813
3814 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003815 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003816 public_key: "testkey.avbpubkey",
3817 private_key: "testkey.pem",
3818 }
3819
3820 cc_library {
3821 name: "libvndk",
3822 srcs: ["mylib.cpp"],
3823 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003824 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003825 native_bridge_supported: true,
3826 host_supported: true,
3827 vndk: {
3828 enabled: true,
3829 },
3830 system_shared_libs: [],
3831 stl: "none",
3832 }
3833 `)
3834}
3835
Jooyung Han31c470b2019-10-18 16:26:59 +09003836func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003837 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003838 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003839 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003840 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003841 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003842 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003843 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003844 }
3845
3846 apex_key {
3847 name: "myapex.key",
3848 public_key: "testkey.avbpubkey",
3849 private_key: "testkey.pem",
3850 }
3851
3852 vndk_prebuilt_shared {
3853 name: "libvndk27",
3854 version: "27",
3855 target_arch: "arm",
3856 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003857 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003858 vndk: {
3859 enabled: true,
3860 },
3861 arch: {
3862 arm: {
3863 srcs: ["libvndk27.so"],
3864 }
3865 },
3866 }
3867
3868 vndk_prebuilt_shared {
3869 name: "libvndk27",
3870 version: "27",
3871 target_arch: "arm",
3872 binder32bit: true,
3873 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003874 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003875 vndk: {
3876 enabled: true,
3877 },
3878 arch: {
3879 arm: {
3880 srcs: ["libvndk27binder32.so"],
3881 }
3882 },
Colin Cross2807f002021-03-02 10:15:29 -08003883 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003884 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003885 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003886 withFiles(map[string][]byte{
3887 "libvndk27.so": nil,
3888 "libvndk27binder32.so": nil,
3889 }),
3890 withBinder32bit,
3891 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003892 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003893 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3894 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003895 },
3896 }),
3897 )
3898
Colin Cross2807f002021-03-02 10:15:29 -08003899 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003900 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003901 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003902 })
3903}
3904
Jooyung Han45a96772020-06-15 14:59:42 +09003905func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003906 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003907 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003908 name: "com.android.vndk.current",
3909 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003910 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003911 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003912 }
3913
3914 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003915 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003916 public_key: "testkey.avbpubkey",
3917 private_key: "testkey.pem",
3918 }
3919
3920 cc_library {
3921 name: "libz",
3922 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003923 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003924 vndk: {
3925 enabled: true,
3926 },
3927 stubs: {
3928 symbol_file: "libz.map.txt",
3929 versions: ["30"],
3930 }
3931 }
3932 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3933 "libz.map.txt": nil,
3934 }))
3935
Colin Cross2807f002021-03-02 10:15:29 -08003936 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003937 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3938 ensureListEmpty(t, provideNativeLibs)
3939}
3940
Jooyung Hane1633032019-08-01 17:41:43 +09003941func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003942 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003943 apex {
3944 name: "myapex_nodep",
3945 key: "myapex.key",
3946 native_shared_libs: ["lib_nodep"],
3947 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003948 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003949 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003950 }
3951
3952 apex {
3953 name: "myapex_dep",
3954 key: "myapex.key",
3955 native_shared_libs: ["lib_dep"],
3956 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003957 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003958 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003959 }
3960
3961 apex {
3962 name: "myapex_provider",
3963 key: "myapex.key",
3964 native_shared_libs: ["libfoo"],
3965 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003966 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003967 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003968 }
3969
3970 apex {
3971 name: "myapex_selfcontained",
3972 key: "myapex.key",
3973 native_shared_libs: ["lib_dep", "libfoo"],
3974 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003975 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003976 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003977 }
3978
3979 apex_key {
3980 name: "myapex.key",
3981 public_key: "testkey.avbpubkey",
3982 private_key: "testkey.pem",
3983 }
3984
3985 cc_library {
3986 name: "lib_nodep",
3987 srcs: ["mylib.cpp"],
3988 system_shared_libs: [],
3989 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003990 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003991 }
3992
3993 cc_library {
3994 name: "lib_dep",
3995 srcs: ["mylib.cpp"],
3996 shared_libs: ["libfoo"],
3997 system_shared_libs: [],
3998 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003999 apex_available: [
4000 "myapex_dep",
4001 "myapex_provider",
4002 "myapex_selfcontained",
4003 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004004 }
4005
4006 cc_library {
4007 name: "libfoo",
4008 srcs: ["mytest.cpp"],
4009 stubs: {
4010 versions: ["1"],
4011 },
4012 system_shared_libs: [],
4013 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004014 apex_available: [
4015 "myapex_provider",
4016 "myapex_selfcontained",
4017 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004018 }
4019 `)
4020
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004021 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004022 var provideNativeLibs, requireNativeLibs []string
4023
Sundong Ahnabb64432019-10-22 13:58:29 +09004024 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004025 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4026 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004027 ensureListEmpty(t, provideNativeLibs)
4028 ensureListEmpty(t, requireNativeLibs)
4029
Sundong Ahnabb64432019-10-22 13:58:29 +09004030 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004031 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4032 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004033 ensureListEmpty(t, provideNativeLibs)
4034 ensureListContains(t, requireNativeLibs, "libfoo.so")
4035
Sundong Ahnabb64432019-10-22 13:58:29 +09004036 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004037 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4038 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004039 ensureListContains(t, provideNativeLibs, "libfoo.so")
4040 ensureListEmpty(t, requireNativeLibs)
4041
Sundong Ahnabb64432019-10-22 13:58:29 +09004042 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004043 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4044 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004045 ensureListContains(t, provideNativeLibs, "libfoo.so")
4046 ensureListEmpty(t, requireNativeLibs)
4047}
4048
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004049func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004050 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004051 apex {
4052 name: "myapex",
4053 key: "myapex.key",
4054 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09004055 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004056 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004057 }
4058
4059 apex_key {
4060 name: "myapex.key",
4061 public_key: "testkey.avbpubkey",
4062 private_key: "testkey.pem",
4063 }
Jiyong Parkdb334862020-02-05 17:19:28 +09004064
4065 cc_library {
4066 name: "mylib",
4067 srcs: ["mylib.cpp"],
4068 system_shared_libs: [],
4069 stl: "none",
4070 apex_available: [
4071 "//apex_available:platform",
4072 "myapex",
4073 ],
4074 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004075 `)
4076
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004077 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004078 apexManifestRule := module.Rule("apexManifestRule")
4079 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
4080 apexRule := module.Rule("apexRule")
4081 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09004082
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004083 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004084 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09004085 name := apexBundle.BaseModuleName()
4086 prefix := "TARGET_"
4087 var builder strings.Builder
4088 data.Custom(&builder, name, prefix, "", data)
4089 androidMk := builder.String()
4090 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
4091 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004092}
4093
Alex Light0851b882019-02-07 13:20:53 -08004094func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004095 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004096 apex {
4097 name: "myapex",
4098 key: "myapex.key",
4099 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004100 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004101 }
4102
4103 apex_key {
4104 name: "myapex.key",
4105 public_key: "testkey.avbpubkey",
4106 private_key: "testkey.pem",
4107 }
4108
4109 cc_library {
4110 name: "mylib_common",
4111 srcs: ["mylib.cpp"],
4112 system_shared_libs: [],
4113 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004114 apex_available: [
4115 "//apex_available:platform",
4116 "myapex",
4117 ],
Alex Light0851b882019-02-07 13:20:53 -08004118 }
4119 `)
4120
Sundong Ahnabb64432019-10-22 13:58:29 +09004121 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004122 apexRule := module.Rule("apexRule")
4123 copyCmds := apexRule.Args["copy_commands"]
4124
4125 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4126 t.Log("Apex was a test apex!")
4127 t.Fail()
4128 }
4129 // Ensure that main rule creates an output
4130 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4131
4132 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004133 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004134
4135 // Ensure that both direct and indirect deps are copied into apex
4136 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4137
Colin Cross7113d202019-11-20 16:39:12 -08004138 // Ensure that the platform variant ends with _shared
4139 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004140
Colin Cross56a83212020-09-15 18:30:11 -07004141 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004142 t.Log("Found mylib_common not in any apex!")
4143 t.Fail()
4144 }
4145}
4146
4147func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004148 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004149 apex_test {
4150 name: "myapex",
4151 key: "myapex.key",
4152 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004153 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004154 }
4155
4156 apex_key {
4157 name: "myapex.key",
4158 public_key: "testkey.avbpubkey",
4159 private_key: "testkey.pem",
4160 }
4161
4162 cc_library {
4163 name: "mylib_common_test",
4164 srcs: ["mylib.cpp"],
4165 system_shared_libs: [],
4166 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004167 // TODO: remove //apex_available:platform
4168 apex_available: [
4169 "//apex_available:platform",
4170 "myapex",
4171 ],
Alex Light0851b882019-02-07 13:20:53 -08004172 }
4173 `)
4174
Sundong Ahnabb64432019-10-22 13:58:29 +09004175 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004176 apexRule := module.Rule("apexRule")
4177 copyCmds := apexRule.Args["copy_commands"]
4178
4179 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4180 t.Log("Apex was not a test apex!")
4181 t.Fail()
4182 }
4183 // Ensure that main rule creates an output
4184 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4185
4186 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004187 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004188
4189 // Ensure that both direct and indirect deps are copied into apex
4190 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4191
Colin Cross7113d202019-11-20 16:39:12 -08004192 // Ensure that the platform variant ends with _shared
4193 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004194}
4195
Alex Light9670d332019-01-29 18:07:33 -08004196func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004197 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004198 apex {
4199 name: "myapex",
4200 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004201 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004202 multilib: {
4203 first: {
4204 native_shared_libs: ["mylib_common"],
4205 }
4206 },
4207 target: {
4208 android: {
4209 multilib: {
4210 first: {
4211 native_shared_libs: ["mylib"],
4212 }
4213 }
4214 },
4215 host: {
4216 multilib: {
4217 first: {
4218 native_shared_libs: ["mylib2"],
4219 }
4220 }
4221 }
4222 }
4223 }
4224
4225 apex_key {
4226 name: "myapex.key",
4227 public_key: "testkey.avbpubkey",
4228 private_key: "testkey.pem",
4229 }
4230
4231 cc_library {
4232 name: "mylib",
4233 srcs: ["mylib.cpp"],
4234 system_shared_libs: [],
4235 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004236 // TODO: remove //apex_available:platform
4237 apex_available: [
4238 "//apex_available:platform",
4239 "myapex",
4240 ],
Alex Light9670d332019-01-29 18:07:33 -08004241 }
4242
4243 cc_library {
4244 name: "mylib_common",
4245 srcs: ["mylib.cpp"],
4246 system_shared_libs: [],
4247 stl: "none",
4248 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004249 // TODO: remove //apex_available:platform
4250 apex_available: [
4251 "//apex_available:platform",
4252 "myapex",
4253 ],
Alex Light9670d332019-01-29 18:07:33 -08004254 }
4255
4256 cc_library {
4257 name: "mylib2",
4258 srcs: ["mylib.cpp"],
4259 system_shared_libs: [],
4260 stl: "none",
4261 compile_multilib: "first",
4262 }
4263 `)
4264
Sundong Ahnabb64432019-10-22 13:58:29 +09004265 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004266 copyCmds := apexRule.Args["copy_commands"]
4267
4268 // Ensure that main rule creates an output
4269 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4270
4271 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004272 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4273 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4274 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004275
4276 // Ensure that both direct and indirect deps are copied into apex
4277 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4278 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4279 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4280
Colin Cross7113d202019-11-20 16:39:12 -08004281 // Ensure that the platform variant ends with _shared
4282 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4283 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4284 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004285}
Jiyong Park04480cf2019-02-06 00:16:29 +09004286
Jiyong Park59140302020-12-14 18:44:04 +09004287func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004288 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004289 apex {
4290 name: "myapex",
4291 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004292 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004293 arch: {
4294 arm64: {
4295 native_shared_libs: ["mylib.arm64"],
4296 },
4297 x86_64: {
4298 native_shared_libs: ["mylib.x64"],
4299 },
4300 }
4301 }
4302
4303 apex_key {
4304 name: "myapex.key",
4305 public_key: "testkey.avbpubkey",
4306 private_key: "testkey.pem",
4307 }
4308
4309 cc_library {
4310 name: "mylib.arm64",
4311 srcs: ["mylib.cpp"],
4312 system_shared_libs: [],
4313 stl: "none",
4314 // TODO: remove //apex_available:platform
4315 apex_available: [
4316 "//apex_available:platform",
4317 "myapex",
4318 ],
4319 }
4320
4321 cc_library {
4322 name: "mylib.x64",
4323 srcs: ["mylib.cpp"],
4324 system_shared_libs: [],
4325 stl: "none",
4326 // TODO: remove //apex_available:platform
4327 apex_available: [
4328 "//apex_available:platform",
4329 "myapex",
4330 ],
4331 }
4332 `)
4333
4334 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4335 copyCmds := apexRule.Args["copy_commands"]
4336
4337 // Ensure that apex variant is created for the direct dep
4338 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4339 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4340
4341 // Ensure that both direct and indirect deps are copied into apex
4342 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4343 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4344}
4345
Jiyong Park04480cf2019-02-06 00:16:29 +09004346func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004347 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004348 apex {
4349 name: "myapex",
4350 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004351 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004352 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004353 }
4354
4355 apex_key {
4356 name: "myapex.key",
4357 public_key: "testkey.avbpubkey",
4358 private_key: "testkey.pem",
4359 }
4360
4361 sh_binary {
4362 name: "myscript",
4363 src: "mylib.cpp",
4364 filename: "myscript.sh",
4365 sub_dir: "script",
4366 }
4367 `)
4368
Sundong Ahnabb64432019-10-22 13:58:29 +09004369 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004370 copyCmds := apexRule.Args["copy_commands"]
4371
4372 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4373}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004374
Jooyung Han91df2082019-11-20 01:49:42 +09004375func TestApexInVariousPartition(t *testing.T) {
4376 testcases := []struct {
4377 propName, parition, flattenedPartition string
4378 }{
4379 {"", "system", "system_ext"},
4380 {"product_specific: true", "product", "product"},
4381 {"soc_specific: true", "vendor", "vendor"},
4382 {"proprietary: true", "vendor", "vendor"},
4383 {"vendor: true", "vendor", "vendor"},
4384 {"system_ext_specific: true", "system_ext", "system_ext"},
4385 }
4386 for _, tc := range testcases {
4387 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004388 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004389 apex {
4390 name: "myapex",
4391 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004392 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004393 `+tc.propName+`
4394 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004395
Jooyung Han91df2082019-11-20 01:49:42 +09004396 apex_key {
4397 name: "myapex.key",
4398 public_key: "testkey.avbpubkey",
4399 private_key: "testkey.pem",
4400 }
4401 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004402
Jooyung Han91df2082019-11-20 01:49:42 +09004403 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004404 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4405 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004406 if actual != expected {
4407 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4408 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004409
Jooyung Han91df2082019-11-20 01:49:42 +09004410 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004411 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4412 actual = flattened.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 }
4416 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004417 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004418}
Jiyong Park67882562019-03-21 01:11:21 +09004419
Jooyung Han580eb4f2020-06-24 19:33:06 +09004420func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004421 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004422 apex {
4423 name: "myapex",
4424 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004425 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004426 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004427
Jooyung Han580eb4f2020-06-24 19:33:06 +09004428 apex_key {
4429 name: "myapex.key",
4430 public_key: "testkey.avbpubkey",
4431 private_key: "testkey.pem",
4432 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004433 `)
4434 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004435 rule := module.Output("file_contexts")
4436 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4437}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004438
Jooyung Han580eb4f2020-06-24 19:33:06 +09004439func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004440 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004441 apex {
4442 name: "myapex",
4443 key: "myapex.key",
4444 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004445 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004446 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004447
Jooyung Han580eb4f2020-06-24 19:33:06 +09004448 apex_key {
4449 name: "myapex.key",
4450 public_key: "testkey.avbpubkey",
4451 private_key: "testkey.pem",
4452 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004453 `, withFiles(map[string][]byte{
4454 "my_own_file_contexts": nil,
4455 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004456}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004457
Jooyung Han580eb4f2020-06-24 19:33:06 +09004458func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004459 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004460 apex {
4461 name: "myapex",
4462 key: "myapex.key",
4463 product_specific: true,
4464 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004465 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004466 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004467
Jooyung Han580eb4f2020-06-24 19:33:06 +09004468 apex_key {
4469 name: "myapex.key",
4470 public_key: "testkey.avbpubkey",
4471 private_key: "testkey.pem",
4472 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004473 `)
4474
Colin Cross1c460562021-02-16 17:55:47 -08004475 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004476 apex {
4477 name: "myapex",
4478 key: "myapex.key",
4479 product_specific: true,
4480 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004481 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004482 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004483
Jooyung Han580eb4f2020-06-24 19:33:06 +09004484 apex_key {
4485 name: "myapex.key",
4486 public_key: "testkey.avbpubkey",
4487 private_key: "testkey.pem",
4488 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004489 `, withFiles(map[string][]byte{
4490 "product_specific_file_contexts": nil,
4491 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004492 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4493 rule := module.Output("file_contexts")
4494 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4495}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004496
Jooyung Han580eb4f2020-06-24 19:33:06 +09004497func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004498 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004499 apex {
4500 name: "myapex",
4501 key: "myapex.key",
4502 product_specific: true,
4503 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004504 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004505 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004506
Jooyung Han580eb4f2020-06-24 19:33:06 +09004507 apex_key {
4508 name: "myapex.key",
4509 public_key: "testkey.avbpubkey",
4510 private_key: "testkey.pem",
4511 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004512
Jooyung Han580eb4f2020-06-24 19:33:06 +09004513 filegroup {
4514 name: "my-file-contexts",
4515 srcs: ["product_specific_file_contexts"],
4516 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004517 `, withFiles(map[string][]byte{
4518 "product_specific_file_contexts": nil,
4519 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004520 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4521 rule := module.Output("file_contexts")
4522 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004523}
4524
Jiyong Park67882562019-03-21 01:11:21 +09004525func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004526 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004527 apex_key {
4528 name: "myapex.key",
4529 public_key: ":my.avbpubkey",
4530 private_key: ":my.pem",
4531 product_specific: true,
4532 }
4533
4534 filegroup {
4535 name: "my.avbpubkey",
4536 srcs: ["testkey2.avbpubkey"],
4537 }
4538
4539 filegroup {
4540 name: "my.pem",
4541 srcs: ["testkey2.pem"],
4542 }
4543 `)
4544
4545 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4546 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004547 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004548 if actual_pubkey != expected_pubkey {
4549 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4550 }
4551 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004552 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004553 if actual_privkey != expected_privkey {
4554 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4555 }
4556}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004557
4558func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004559 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004560 prebuilt_apex {
4561 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004562 arch: {
4563 arm64: {
4564 src: "myapex-arm64.apex",
4565 },
4566 arm: {
4567 src: "myapex-arm.apex",
4568 },
4569 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004570 }
4571 `)
4572
Wei Li340ee8e2022-03-18 17:33:24 -07004573 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4574 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004575
Jiyong Parkc95714e2019-03-29 14:23:10 +09004576 expectedInput := "myapex-arm64.apex"
4577 if prebuilt.inputApex.String() != expectedInput {
4578 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4579 }
Wei Li340ee8e2022-03-18 17:33:24 -07004580 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4581 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4582 rule := testingModule.Rule("genProvenanceMetaData")
4583 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4584 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4585 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4586 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004587}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004588
Paul Duffinc0609c62021-03-01 17:27:16 +00004589func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004590 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004591 prebuilt_apex {
4592 name: "myapex",
4593 }
4594 `)
4595}
4596
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004597func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004598 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004599 prebuilt_apex {
4600 name: "myapex",
4601 src: "myapex-arm.apex",
4602 filename: "notmyapex.apex",
4603 }
4604 `)
4605
Wei Li340ee8e2022-03-18 17:33:24 -07004606 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4607 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004608
4609 expected := "notmyapex.apex"
4610 if p.installFilename != expected {
4611 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4612 }
Wei Li340ee8e2022-03-18 17:33:24 -07004613 rule := testingModule.Rule("genProvenanceMetaData")
4614 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4615 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4616 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4617 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004618}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004619
Samiul Islam7c02e262021-09-08 17:48:28 +01004620func TestApexSetFilenameOverride(t *testing.T) {
4621 testApex(t, `
4622 apex_set {
4623 name: "com.company.android.myapex",
4624 apex_name: "com.android.myapex",
4625 set: "company-myapex.apks",
4626 filename: "com.company.android.myapex.apex"
4627 }
4628 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4629
4630 testApex(t, `
4631 apex_set {
4632 name: "com.company.android.myapex",
4633 apex_name: "com.android.myapex",
4634 set: "company-myapex.apks",
4635 filename: "com.company.android.myapex.capex"
4636 }
4637 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4638
4639 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4640 apex_set {
4641 name: "com.company.android.myapex",
4642 apex_name: "com.android.myapex",
4643 set: "company-myapex.apks",
4644 filename: "some-random-suffix"
4645 }
4646 `)
4647}
4648
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004649func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004650 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004651 prebuilt_apex {
4652 name: "myapex.prebuilt",
4653 src: "myapex-arm.apex",
4654 overrides: [
4655 "myapex",
4656 ],
4657 }
4658 `)
4659
Wei Li340ee8e2022-03-18 17:33:24 -07004660 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4661 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004662
4663 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004664 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004665 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004666 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004667 }
Wei Li340ee8e2022-03-18 17:33:24 -07004668 rule := testingModule.Rule("genProvenanceMetaData")
4669 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4670 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4671 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4672 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004673}
4674
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004675func TestPrebuiltApexName(t *testing.T) {
4676 testApex(t, `
4677 prebuilt_apex {
4678 name: "com.company.android.myapex",
4679 apex_name: "com.android.myapex",
4680 src: "company-myapex-arm.apex",
4681 }
4682 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4683
4684 testApex(t, `
4685 apex_set {
4686 name: "com.company.android.myapex",
4687 apex_name: "com.android.myapex",
4688 set: "company-myapex.apks",
4689 }
4690 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4691}
4692
4693func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4694 _ = android.GroupFixturePreparers(
4695 java.PrepareForTestWithJavaDefaultModules,
4696 PrepareForTestWithApexBuildComponents,
4697 android.FixtureWithRootAndroidBp(`
4698 platform_bootclasspath {
4699 name: "platform-bootclasspath",
4700 fragments: [
4701 {
4702 apex: "com.android.art",
4703 module: "art-bootclasspath-fragment",
4704 },
4705 ],
4706 }
4707
4708 prebuilt_apex {
4709 name: "com.company.android.art",
4710 apex_name: "com.android.art",
4711 src: "com.company.android.art-arm.apex",
4712 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4713 }
4714
4715 prebuilt_bootclasspath_fragment {
4716 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004717 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004718 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004719 hidden_api: {
4720 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4721 metadata: "my-bootclasspath-fragment/metadata.csv",
4722 index: "my-bootclasspath-fragment/index.csv",
4723 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4724 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4725 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004726 }
4727
4728 java_import {
4729 name: "core-oj",
4730 jars: ["prebuilt.jar"],
4731 }
4732 `),
4733 ).RunTest(t)
4734}
4735
Paul Duffin092153d2021-01-26 11:42:39 +00004736// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4737// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004738func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004739 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004740
Paul Duffin89886cb2021-02-05 16:44:03 +00004741 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004742 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004743 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004744 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004745 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004746 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004747 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4748 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4749 android.NormalizePathForTesting(dexJarBuildPath))
4750 }
4751
4752 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004753 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004754 // Make sure the import has been given the correct path to the dex jar.
4755 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4756 dexJarBuildPath := p.DexJarInstallPath()
4757 stem := android.RemoveOptionalPrebuiltPrefix(name)
4758 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4759 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4760 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004761 }
4762
Paul Duffin39853512021-02-26 11:09:39 +00004763 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004764 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004765 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004766 android.AssertArrayString(t, "Check if there is no source variant",
4767 []string{"android_common"},
4768 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004769 }
4770
4771 t.Run("prebuilt only", func(t *testing.T) {
4772 bp := `
4773 prebuilt_apex {
4774 name: "myapex",
4775 arch: {
4776 arm64: {
4777 src: "myapex-arm64.apex",
4778 },
4779 arm: {
4780 src: "myapex-arm.apex",
4781 },
4782 },
Paul Duffin39853512021-02-26 11:09:39 +00004783 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004784 }
4785
4786 java_import {
4787 name: "libfoo",
4788 jars: ["libfoo.jar"],
4789 }
Paul Duffin39853512021-02-26 11:09:39 +00004790
4791 java_sdk_library_import {
4792 name: "libbar",
4793 public: {
4794 jars: ["libbar.jar"],
4795 },
4796 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004797 `
4798
4799 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4800 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4801
Martin Stjernholm44825602021-09-17 01:44:12 +01004802 deapexerName := deapexerModuleName("myapex")
4803 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4804
Paul Duffinf6932af2021-02-26 18:21:56 +00004805 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004806 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004807 rule := deapexer.Rule("deapexer")
4808 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4809 t.Errorf("expected: %q, found: %q", expected, actual)
4810 }
4811
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004812 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004813 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004814 rule = prebuiltApex.Rule("android/soong/android.Cp")
4815 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4816 t.Errorf("expected: %q, found: %q", expected, actual)
4817 }
4818
Paul Duffin89886cb2021-02-05 16:44:03 +00004819 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004820 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004821
4822 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004823 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004824 })
4825
4826 t.Run("prebuilt with source preferred", func(t *testing.T) {
4827
4828 bp := `
4829 prebuilt_apex {
4830 name: "myapex",
4831 arch: {
4832 arm64: {
4833 src: "myapex-arm64.apex",
4834 },
4835 arm: {
4836 src: "myapex-arm.apex",
4837 },
4838 },
Paul Duffin39853512021-02-26 11:09:39 +00004839 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004840 }
4841
4842 java_import {
4843 name: "libfoo",
4844 jars: ["libfoo.jar"],
4845 }
4846
4847 java_library {
4848 name: "libfoo",
4849 }
Paul Duffin39853512021-02-26 11:09:39 +00004850
4851 java_sdk_library_import {
4852 name: "libbar",
4853 public: {
4854 jars: ["libbar.jar"],
4855 },
4856 }
4857
4858 java_sdk_library {
4859 name: "libbar",
4860 srcs: ["foo/bar/MyClass.java"],
4861 unsafe_ignore_missing_latest_api: true,
4862 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004863 `
4864
4865 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4866 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4867
Paul Duffin89886cb2021-02-05 16:44:03 +00004868 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004869 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004870 ensureNoSourceVariant(t, ctx, "libfoo")
4871
4872 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004873 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004874 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004875 })
4876
4877 t.Run("prebuilt preferred with source", func(t *testing.T) {
4878 bp := `
4879 prebuilt_apex {
4880 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004881 arch: {
4882 arm64: {
4883 src: "myapex-arm64.apex",
4884 },
4885 arm: {
4886 src: "myapex-arm.apex",
4887 },
4888 },
Paul Duffin39853512021-02-26 11:09:39 +00004889 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004890 }
4891
4892 java_import {
4893 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004894 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004895 jars: ["libfoo.jar"],
4896 }
4897
4898 java_library {
4899 name: "libfoo",
4900 }
Paul Duffin39853512021-02-26 11:09:39 +00004901
4902 java_sdk_library_import {
4903 name: "libbar",
4904 prefer: true,
4905 public: {
4906 jars: ["libbar.jar"],
4907 },
4908 }
4909
4910 java_sdk_library {
4911 name: "libbar",
4912 srcs: ["foo/bar/MyClass.java"],
4913 unsafe_ignore_missing_latest_api: true,
4914 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004915 `
4916
4917 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4918 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4919
Paul Duffin89886cb2021-02-05 16:44:03 +00004920 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004921 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004922 ensureNoSourceVariant(t, ctx, "libfoo")
4923
4924 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004925 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004926 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004927 })
4928}
4929
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004930func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004931 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004932 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004933 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4934 // is disabled.
4935 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4936 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004937
Paul Duffin37856732021-02-26 14:24:15 +00004938 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4939 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004940 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004941 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004942 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004943 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004944 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004945 foundLibfooJar = true
4946 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004947 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004948 }
4949 }
4950 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004951 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 +00004952 }
4953 }
4954
Paul Duffin40a3f652021-07-19 13:11:24 +01004955 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004956 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004957 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004958 var rule android.TestingBuildParams
4959
4960 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4961 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004962 }
4963
Paul Duffin40a3f652021-07-19 13:11:24 +01004964 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4965 t.Helper()
4966 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4967 var rule android.TestingBuildParams
4968
4969 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4970 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4971 }
4972
Paul Duffin89f570a2021-06-16 01:42:33 +01004973 fragment := java.ApexVariantReference{
4974 Apex: proptools.StringPtr("myapex"),
4975 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4976 }
4977
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004978 t.Run("prebuilt only", func(t *testing.T) {
4979 bp := `
4980 prebuilt_apex {
4981 name: "myapex",
4982 arch: {
4983 arm64: {
4984 src: "myapex-arm64.apex",
4985 },
4986 arm: {
4987 src: "myapex-arm.apex",
4988 },
4989 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004990 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4991 }
4992
4993 prebuilt_bootclasspath_fragment {
4994 name: "my-bootclasspath-fragment",
4995 contents: ["libfoo", "libbar"],
4996 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004997 hidden_api: {
4998 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4999 metadata: "my-bootclasspath-fragment/metadata.csv",
5000 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005001 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5002 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5003 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005004 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005005 }
5006
5007 java_import {
5008 name: "libfoo",
5009 jars: ["libfoo.jar"],
5010 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005011 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005012 }
Paul Duffin37856732021-02-26 14:24:15 +00005013
5014 java_sdk_library_import {
5015 name: "libbar",
5016 public: {
5017 jars: ["libbar.jar"],
5018 },
5019 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005020 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005021 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005022 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005023 `
5024
Paul Duffin89f570a2021-06-16 01:42:33 +01005025 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005026 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5027 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005028
Paul Duffin537ea3d2021-05-14 10:38:00 +01005029 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005030 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005031 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005032 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005033 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5034 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005035 })
5036
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005037 t.Run("apex_set only", func(t *testing.T) {
5038 bp := `
5039 apex_set {
5040 name: "myapex",
5041 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005042 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5043 }
5044
5045 prebuilt_bootclasspath_fragment {
5046 name: "my-bootclasspath-fragment",
5047 contents: ["libfoo", "libbar"],
5048 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005049 hidden_api: {
5050 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5051 metadata: "my-bootclasspath-fragment/metadata.csv",
5052 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005053 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5054 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5055 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005056 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005057 }
5058
5059 java_import {
5060 name: "libfoo",
5061 jars: ["libfoo.jar"],
5062 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005063 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005064 }
5065
5066 java_sdk_library_import {
5067 name: "libbar",
5068 public: {
5069 jars: ["libbar.jar"],
5070 },
5071 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005072 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005073 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005074 }
5075 `
5076
Paul Duffin89f570a2021-06-16 01:42:33 +01005077 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005078 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5079 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5080
Paul Duffin537ea3d2021-05-14 10:38:00 +01005081 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005082 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005083 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005084 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005085 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5086 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005087 })
5088
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005089 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5090 bp := `
5091 prebuilt_apex {
5092 name: "myapex",
5093 arch: {
5094 arm64: {
5095 src: "myapex-arm64.apex",
5096 },
5097 arm: {
5098 src: "myapex-arm.apex",
5099 },
5100 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005101 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5102 }
5103
5104 prebuilt_bootclasspath_fragment {
5105 name: "my-bootclasspath-fragment",
5106 contents: ["libfoo", "libbar"],
5107 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005108 hidden_api: {
5109 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5110 metadata: "my-bootclasspath-fragment/metadata.csv",
5111 index: "my-bootclasspath-fragment/index.csv",
5112 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5113 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5114 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005115 }
5116
5117 java_import {
5118 name: "libfoo",
5119 jars: ["libfoo.jar"],
5120 apex_available: ["myapex"],
5121 }
5122
5123 java_library {
5124 name: "libfoo",
5125 srcs: ["foo/bar/MyClass.java"],
5126 apex_available: ["myapex"],
5127 }
Paul Duffin37856732021-02-26 14:24:15 +00005128
5129 java_sdk_library_import {
5130 name: "libbar",
5131 public: {
5132 jars: ["libbar.jar"],
5133 },
5134 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005135 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005136 }
5137
5138 java_sdk_library {
5139 name: "libbar",
5140 srcs: ["foo/bar/MyClass.java"],
5141 unsafe_ignore_missing_latest_api: true,
5142 apex_available: ["myapex"],
5143 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005144 `
5145
5146 // In this test the source (java_library) libfoo is active since the
5147 // prebuilt (java_import) defaults to prefer:false. However the
5148 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5149 // find the dex boot jar in it. We either need to disable the source libfoo
5150 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005151 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005152 // dexbootjar check is skipped if AllowMissingDependencies is true
5153 preparerAllowMissingDeps := android.GroupFixturePreparers(
5154 preparer,
5155 android.PrepareForTestWithAllowMissingDependencies,
5156 )
5157 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005158 })
5159
5160 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5161 bp := `
5162 prebuilt_apex {
5163 name: "myapex",
5164 arch: {
5165 arm64: {
5166 src: "myapex-arm64.apex",
5167 },
5168 arm: {
5169 src: "myapex-arm.apex",
5170 },
5171 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005172 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5173 }
5174
5175 prebuilt_bootclasspath_fragment {
5176 name: "my-bootclasspath-fragment",
5177 contents: ["libfoo", "libbar"],
5178 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005179 hidden_api: {
5180 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5181 metadata: "my-bootclasspath-fragment/metadata.csv",
5182 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005183 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5184 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5185 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005186 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005187 }
5188
5189 java_import {
5190 name: "libfoo",
5191 prefer: true,
5192 jars: ["libfoo.jar"],
5193 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005194 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005195 }
5196
5197 java_library {
5198 name: "libfoo",
5199 srcs: ["foo/bar/MyClass.java"],
5200 apex_available: ["myapex"],
5201 }
Paul Duffin37856732021-02-26 14:24:15 +00005202
5203 java_sdk_library_import {
5204 name: "libbar",
5205 prefer: true,
5206 public: {
5207 jars: ["libbar.jar"],
5208 },
5209 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005210 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005211 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005212 }
5213
5214 java_sdk_library {
5215 name: "libbar",
5216 srcs: ["foo/bar/MyClass.java"],
5217 unsafe_ignore_missing_latest_api: true,
5218 apex_available: ["myapex"],
5219 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005220 `
5221
Paul Duffin89f570a2021-06-16 01:42:33 +01005222 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005223 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5224 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005225
Paul Duffin537ea3d2021-05-14 10:38:00 +01005226 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005227 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005228 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005229 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005230 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5231 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005232 })
5233
5234 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5235 bp := `
5236 apex {
5237 name: "myapex",
5238 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005239 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005240 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005241 }
5242
5243 apex_key {
5244 name: "myapex.key",
5245 public_key: "testkey.avbpubkey",
5246 private_key: "testkey.pem",
5247 }
5248
5249 prebuilt_apex {
5250 name: "myapex",
5251 arch: {
5252 arm64: {
5253 src: "myapex-arm64.apex",
5254 },
5255 arm: {
5256 src: "myapex-arm.apex",
5257 },
5258 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005259 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5260 }
5261
5262 prebuilt_bootclasspath_fragment {
5263 name: "my-bootclasspath-fragment",
5264 contents: ["libfoo", "libbar"],
5265 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005266 hidden_api: {
5267 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5268 metadata: "my-bootclasspath-fragment/metadata.csv",
5269 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005270 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5271 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5272 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005273 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005274 }
5275
5276 java_import {
5277 name: "libfoo",
5278 jars: ["libfoo.jar"],
5279 apex_available: ["myapex"],
5280 }
5281
5282 java_library {
5283 name: "libfoo",
5284 srcs: ["foo/bar/MyClass.java"],
5285 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005286 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005287 }
Paul Duffin37856732021-02-26 14:24:15 +00005288
5289 java_sdk_library_import {
5290 name: "libbar",
5291 public: {
5292 jars: ["libbar.jar"],
5293 },
5294 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005295 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005296 }
5297
5298 java_sdk_library {
5299 name: "libbar",
5300 srcs: ["foo/bar/MyClass.java"],
5301 unsafe_ignore_missing_latest_api: true,
5302 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005303 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005304 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005305 `
5306
Paul Duffin89f570a2021-06-16 01:42:33 +01005307 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005308 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5309 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005310
Paul Duffin537ea3d2021-05-14 10:38:00 +01005311 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005312 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005313 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005314 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005315 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5316 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005317 })
5318
5319 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5320 bp := `
5321 apex {
5322 name: "myapex",
5323 enabled: false,
5324 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005325 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005326 }
5327
5328 apex_key {
5329 name: "myapex.key",
5330 public_key: "testkey.avbpubkey",
5331 private_key: "testkey.pem",
5332 }
5333
5334 prebuilt_apex {
5335 name: "myapex",
5336 arch: {
5337 arm64: {
5338 src: "myapex-arm64.apex",
5339 },
5340 arm: {
5341 src: "myapex-arm.apex",
5342 },
5343 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005344 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5345 }
5346
5347 prebuilt_bootclasspath_fragment {
5348 name: "my-bootclasspath-fragment",
5349 contents: ["libfoo", "libbar"],
5350 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005351 hidden_api: {
5352 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5353 metadata: "my-bootclasspath-fragment/metadata.csv",
5354 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005355 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5356 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5357 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005358 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005359 }
5360
5361 java_import {
5362 name: "libfoo",
5363 prefer: true,
5364 jars: ["libfoo.jar"],
5365 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005366 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005367 }
5368
5369 java_library {
5370 name: "libfoo",
5371 srcs: ["foo/bar/MyClass.java"],
5372 apex_available: ["myapex"],
5373 }
Paul Duffin37856732021-02-26 14:24:15 +00005374
5375 java_sdk_library_import {
5376 name: "libbar",
5377 prefer: true,
5378 public: {
5379 jars: ["libbar.jar"],
5380 },
5381 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005382 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005383 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005384 }
5385
5386 java_sdk_library {
5387 name: "libbar",
5388 srcs: ["foo/bar/MyClass.java"],
5389 unsafe_ignore_missing_latest_api: true,
5390 apex_available: ["myapex"],
5391 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005392 `
5393
Paul Duffin89f570a2021-06-16 01:42:33 +01005394 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005395 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5396 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005397
Paul Duffin537ea3d2021-05-14 10:38:00 +01005398 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005399 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005400 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005401 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005402 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5403 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005404 })
5405}
5406
Roland Levillain630846d2019-06-26 12:48:34 +01005407func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005408 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005409 apex_test {
5410 name: "myapex",
5411 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005412 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005413 tests: [
5414 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005415 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005416 ],
5417 }
5418
5419 apex_key {
5420 name: "myapex.key",
5421 public_key: "testkey.avbpubkey",
5422 private_key: "testkey.pem",
5423 }
5424
Liz Kammer1c14a212020-05-12 15:26:55 -07005425 filegroup {
5426 name: "fg",
5427 srcs: [
5428 "baz",
5429 "bar/baz"
5430 ],
5431 }
5432
Roland Levillain630846d2019-06-26 12:48:34 +01005433 cc_test {
5434 name: "mytest",
5435 gtest: false,
5436 srcs: ["mytest.cpp"],
5437 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005438 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005439 system_shared_libs: [],
5440 static_executable: true,
5441 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005442 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005443 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005444
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005445 cc_library {
5446 name: "mylib",
5447 srcs: ["mylib.cpp"],
5448 system_shared_libs: [],
5449 stl: "none",
5450 }
5451
Liz Kammer5bd365f2020-05-27 15:15:11 -07005452 filegroup {
5453 name: "fg2",
5454 srcs: [
5455 "testdata/baz"
5456 ],
5457 }
5458
Roland Levillain9b5fde92019-06-28 15:41:19 +01005459 cc_test {
5460 name: "mytests",
5461 gtest: false,
5462 srcs: [
5463 "mytest1.cpp",
5464 "mytest2.cpp",
5465 "mytest3.cpp",
5466 ],
5467 test_per_src: true,
5468 relative_install_path: "test",
5469 system_shared_libs: [],
5470 static_executable: true,
5471 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005472 data: [
5473 ":fg",
5474 ":fg2",
5475 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005476 }
Roland Levillain630846d2019-06-26 12:48:34 +01005477 `)
5478
Sundong Ahnabb64432019-10-22 13:58:29 +09005479 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005480 copyCmds := apexRule.Args["copy_commands"]
5481
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005482 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005483 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005484 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005485
Liz Kammer1c14a212020-05-12 15:26:55 -07005486 //Ensure that test data are copied into apex.
5487 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5488 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5489
Roland Levillain9b5fde92019-06-28 15:41:19 +01005490 // Ensure that test deps built with `test_per_src` are copied into apex.
5491 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5492 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5493 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005494
5495 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005496 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005497 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005498 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005499 prefix := "TARGET_"
5500 var builder strings.Builder
5501 data.Custom(&builder, name, prefix, "", data)
5502 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005503 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5504 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5505 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5506 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005507 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005508 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005509 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005510
5511 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005512 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005513 data.Custom(&builder, name, prefix, "", data)
5514 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005515 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5516 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005517}
5518
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005519func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005520 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005521 apex {
5522 name: "myapex",
5523 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005524 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005525 }
5526 apex_key {
5527 name: "myapex.key",
5528 public_key: "testkey.avbpubkey",
5529 private_key: "testkey.pem",
5530 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005531 `,
5532 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5533 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5534 }),
5535 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005536 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005537 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005538 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005539 var builder strings.Builder
5540 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5541 androidMk := builder.String()
5542 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5543}
5544
Jooyung Hand48f3c32019-08-23 11:18:57 +09005545func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5546 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5547 apex {
5548 name: "myapex",
5549 key: "myapex.key",
5550 native_shared_libs: ["libfoo"],
5551 }
5552
5553 apex_key {
5554 name: "myapex.key",
5555 public_key: "testkey.avbpubkey",
5556 private_key: "testkey.pem",
5557 }
5558
5559 cc_library {
5560 name: "libfoo",
5561 stl: "none",
5562 system_shared_libs: [],
5563 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005564 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005565 }
5566 `)
5567 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5568 apex {
5569 name: "myapex",
5570 key: "myapex.key",
5571 java_libs: ["myjar"],
5572 }
5573
5574 apex_key {
5575 name: "myapex.key",
5576 public_key: "testkey.avbpubkey",
5577 private_key: "testkey.pem",
5578 }
5579
5580 java_library {
5581 name: "myjar",
5582 srcs: ["foo/bar/MyClass.java"],
5583 sdk_version: "none",
5584 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005585 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005586 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005587 }
5588 `)
5589}
5590
Bill Peckhama41a6962021-01-11 10:58:54 -08005591func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005592 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005593 apex {
5594 name: "myapex",
5595 key: "myapex.key",
5596 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005597 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005598 }
5599
5600 apex_key {
5601 name: "myapex.key",
5602 public_key: "testkey.avbpubkey",
5603 private_key: "testkey.pem",
5604 }
5605
5606 java_import {
5607 name: "myjavaimport",
5608 apex_available: ["myapex"],
5609 jars: ["my.jar"],
5610 compile_dex: true,
5611 }
5612 `)
5613
5614 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5615 apexRule := module.Rule("apexRule")
5616 copyCmds := apexRule.Args["copy_commands"]
5617 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5618}
5619
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005620func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005621 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005622 apex {
5623 name: "myapex",
5624 key: "myapex.key",
5625 apps: [
5626 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005627 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005628 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005629 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005630 }
5631
5632 apex_key {
5633 name: "myapex.key",
5634 public_key: "testkey.avbpubkey",
5635 private_key: "testkey.pem",
5636 }
5637
5638 android_app {
5639 name: "AppFoo",
5640 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005641 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005642 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005643 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005645 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005646 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005647
5648 android_app {
5649 name: "AppFooPriv",
5650 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005651 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005652 system_modules: "none",
5653 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005654 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005655 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005656 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005657
5658 cc_library_shared {
5659 name: "libjni",
5660 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005661 shared_libs: ["libfoo"],
5662 stl: "none",
5663 system_shared_libs: [],
5664 apex_available: [ "myapex" ],
5665 sdk_version: "current",
5666 }
5667
5668 cc_library_shared {
5669 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005670 stl: "none",
5671 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005672 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005673 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005674 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005675 `)
5676
Sundong Ahnabb64432019-10-22 13:58:29 +09005677 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005678 apexRule := module.Rule("apexRule")
5679 copyCmds := apexRule.Args["copy_commands"]
5680
5681 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005682 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005683
Colin Crossaede88c2020-08-11 12:17:01 -07005684 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005685 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005686 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005687 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005688 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005689 // JNI libraries including transitive deps are
5690 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005691 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005692 // ... embedded inside APK (jnilibs.zip)
5693 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5694 // ... and not directly inside the APEX
5695 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5696 }
Dario Frenicde2a032019-10-27 00:29:22 +01005697}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005698
Dario Frenicde2a032019-10-27 00:29:22 +01005699func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005700 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005701 apex {
5702 name: "myapex",
5703 key: "myapex.key",
5704 apps: [
5705 "AppFooPrebuilt",
5706 "AppFooPrivPrebuilt",
5707 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005708 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005709 }
5710
5711 apex_key {
5712 name: "myapex.key",
5713 public_key: "testkey.avbpubkey",
5714 private_key: "testkey.pem",
5715 }
5716
5717 android_app_import {
5718 name: "AppFooPrebuilt",
5719 apk: "PrebuiltAppFoo.apk",
5720 presigned: true,
5721 dex_preopt: {
5722 enabled: false,
5723 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005724 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005725 }
5726
5727 android_app_import {
5728 name: "AppFooPrivPrebuilt",
5729 apk: "PrebuiltAppFooPriv.apk",
5730 privileged: true,
5731 presigned: true,
5732 dex_preopt: {
5733 enabled: false,
5734 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005735 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005736 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005737 }
5738 `)
5739
Sundong Ahnabb64432019-10-22 13:58:29 +09005740 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005741 apexRule := module.Rule("apexRule")
5742 copyCmds := apexRule.Args["copy_commands"]
5743
5744 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005745 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5746}
5747
5748func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005749 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005750 apex {
5751 name: "myapex",
5752 key: "myapex.key",
5753 apps: [
5754 "AppFoo",
5755 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005756 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005757 }
5758
5759 apex_key {
5760 name: "myapex.key",
5761 public_key: "testkey.avbpubkey",
5762 private_key: "testkey.pem",
5763 }
5764
5765 android_app {
5766 name: "AppFoo",
5767 srcs: ["foo/bar/MyClass.java"],
5768 sdk_version: "none",
5769 system_modules: "none",
5770 apex_available: [ "myapex" ],
5771 }
5772
5773 android_app_import {
5774 name: "AppFoo",
5775 apk: "AppFooPrebuilt.apk",
5776 filename: "AppFooPrebuilt.apk",
5777 presigned: true,
5778 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005779 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005780 }
5781 `, withFiles(map[string][]byte{
5782 "AppFooPrebuilt.apk": nil,
5783 }))
5784
5785 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005786 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005787 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005788}
5789
Dario Freni6f3937c2019-12-20 22:58:03 +00005790func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005791 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005792 apex {
5793 name: "myapex",
5794 key: "myapex.key",
5795 apps: [
5796 "TesterHelpAppFoo",
5797 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005798 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005799 }
5800
5801 apex_key {
5802 name: "myapex.key",
5803 public_key: "testkey.avbpubkey",
5804 private_key: "testkey.pem",
5805 }
5806
5807 android_test_helper_app {
5808 name: "TesterHelpAppFoo",
5809 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005810 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005811 }
5812
5813 `)
5814
5815 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5816 apexRule := module.Rule("apexRule")
5817 copyCmds := apexRule.Args["copy_commands"]
5818
5819 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5820}
5821
Jooyung Han18020ea2019-11-13 10:50:48 +09005822func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5823 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005824 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005825 apex {
5826 name: "myapex",
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 apex_key {
5833 name: "myapex.key",
5834 public_key: "testkey.avbpubkey",
5835 private_key: "testkey.pem",
5836 }
5837
5838 apex {
5839 name: "otherapex",
5840 key: "myapex.key",
5841 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005842 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005843 }
5844
5845 cc_defaults {
5846 name: "libfoo-defaults",
5847 apex_available: ["otherapex"],
5848 }
5849
5850 cc_library {
5851 name: "libfoo",
5852 defaults: ["libfoo-defaults"],
5853 stl: "none",
5854 system_shared_libs: [],
5855 }`)
5856}
5857
Paul Duffine52e66f2020-03-30 17:54:29 +01005858func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005859 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005860 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005861 apex {
5862 name: "myapex",
5863 key: "myapex.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: "myapex.key",
5870 public_key: "testkey.avbpubkey",
5871 private_key: "testkey.pem",
5872 }
5873
5874 apex {
5875 name: "otherapex",
5876 key: "otherapex.key",
5877 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005878 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005879 }
5880
5881 apex_key {
5882 name: "otherapex.key",
5883 public_key: "testkey.avbpubkey",
5884 private_key: "testkey.pem",
5885 }
5886
5887 cc_library {
5888 name: "libfoo",
5889 stl: "none",
5890 system_shared_libs: [],
5891 apex_available: ["otherapex"],
5892 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005893}
Jiyong Park127b40b2019-09-30 16:04:35 +09005894
Paul Duffine52e66f2020-03-30 17:54:29 +01005895func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005896 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005897 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005898.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005899.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005900.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005901.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005902.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005903.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005904 apex {
5905 name: "myapex",
5906 key: "myapex.key",
5907 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005908 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005909 }
5910
5911 apex_key {
5912 name: "myapex.key",
5913 public_key: "testkey.avbpubkey",
5914 private_key: "testkey.pem",
5915 }
5916
Jiyong Park127b40b2019-09-30 16:04:35 +09005917 cc_library {
5918 name: "libfoo",
5919 stl: "none",
5920 shared_libs: ["libbar"],
5921 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005922 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005923 }
5924
5925 cc_library {
5926 name: "libbar",
5927 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005928 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005929 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005930 apex_available: ["myapex"],
5931 }
5932
5933 cc_library {
5934 name: "libbaz",
5935 stl: "none",
5936 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005937 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005938}
Jiyong Park127b40b2019-09-30 16:04:35 +09005939
Paul Duffine52e66f2020-03-30 17:54:29 +01005940func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005941 testApexError(t, "\"otherapex\" is not a valid module name", `
5942 apex {
5943 name: "myapex",
5944 key: "myapex.key",
5945 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005946 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005947 }
5948
5949 apex_key {
5950 name: "myapex.key",
5951 public_key: "testkey.avbpubkey",
5952 private_key: "testkey.pem",
5953 }
5954
5955 cc_library {
5956 name: "libfoo",
5957 stl: "none",
5958 system_shared_libs: [],
5959 apex_available: ["otherapex"],
5960 }`)
5961
Paul Duffine52e66f2020-03-30 17:54:29 +01005962 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005963 apex {
5964 name: "myapex",
5965 key: "myapex.key",
5966 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005967 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005968 }
5969
5970 apex_key {
5971 name: "myapex.key",
5972 public_key: "testkey.avbpubkey",
5973 private_key: "testkey.pem",
5974 }
5975
5976 cc_library {
5977 name: "libfoo",
5978 stl: "none",
5979 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005980 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005981 apex_available: ["myapex"],
5982 }
5983
5984 cc_library {
5985 name: "libbar",
5986 stl: "none",
5987 system_shared_libs: [],
5988 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005989 }
5990
5991 cc_library {
5992 name: "libbaz",
5993 stl: "none",
5994 system_shared_libs: [],
5995 stubs: {
5996 versions: ["10", "20", "30"],
5997 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005998 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005999}
Jiyong Park127b40b2019-09-30 16:04:35 +09006000
Jiyong Park89e850a2020-04-07 16:37:39 +09006001func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006002 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006003 apex {
6004 name: "myapex",
6005 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006006 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006007 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006008 }
6009
6010 apex_key {
6011 name: "myapex.key",
6012 public_key: "testkey.avbpubkey",
6013 private_key: "testkey.pem",
6014 }
6015
6016 cc_library {
6017 name: "libfoo",
6018 stl: "none",
6019 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006020 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006021 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006022 }
6023
6024 cc_library {
6025 name: "libfoo2",
6026 stl: "none",
6027 system_shared_libs: [],
6028 shared_libs: ["libbaz"],
6029 apex_available: ["//apex_available:platform"],
6030 }
6031
6032 cc_library {
6033 name: "libbar",
6034 stl: "none",
6035 system_shared_libs: [],
6036 apex_available: ["myapex"],
6037 }
6038
6039 cc_library {
6040 name: "libbaz",
6041 stl: "none",
6042 system_shared_libs: [],
6043 apex_available: ["myapex"],
6044 stubs: {
6045 versions: ["1"],
6046 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006047 }`)
6048
Jiyong Park89e850a2020-04-07 16:37:39 +09006049 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6050 // because it depends on libbar which isn't available to platform
6051 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6052 if libfoo.NotAvailableForPlatform() != true {
6053 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6054 }
6055
6056 // libfoo2 however can be available to platform because it depends on libbaz which provides
6057 // stubs
6058 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6059 if libfoo2.NotAvailableForPlatform() == true {
6060 t.Errorf("%q should be available to platform", libfoo2.String())
6061 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006062}
Jiyong Parka90ca002019-10-07 15:47:24 +09006063
Paul Duffine52e66f2020-03-30 17:54:29 +01006064func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006065 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006066 apex {
6067 name: "myapex",
6068 key: "myapex.key",
6069 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006070 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006071 }
6072
6073 apex_key {
6074 name: "myapex.key",
6075 public_key: "testkey.avbpubkey",
6076 private_key: "testkey.pem",
6077 }
6078
6079 cc_library {
6080 name: "libfoo",
6081 stl: "none",
6082 system_shared_libs: [],
6083 apex_available: ["myapex"],
6084 static: {
6085 apex_available: ["//apex_available:platform"],
6086 },
6087 }`)
6088
Jiyong Park89e850a2020-04-07 16:37:39 +09006089 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6090 if libfooShared.NotAvailableForPlatform() != true {
6091 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6092 }
6093 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6094 if libfooStatic.NotAvailableForPlatform() != false {
6095 t.Errorf("%q should be available to platform", libfooStatic.String())
6096 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006097}
6098
Jiyong Park5d790c32019-11-15 18:40:32 +09006099func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006100 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006101 apex {
6102 name: "myapex",
6103 key: "myapex.key",
6104 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006105 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006106 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006107 bootclasspath_fragments: ["mybootclasspath_fragment"],
6108 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6109 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006110 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006111 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006112 }
6113
6114 override_apex {
6115 name: "override_myapex",
6116 base: "myapex",
6117 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08006118 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006119 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006120 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6121 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6122 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006123 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006124 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006125 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006126 key: "mynewapex.key",
6127 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006128 }
6129
6130 apex_key {
6131 name: "myapex.key",
6132 public_key: "testkey.avbpubkey",
6133 private_key: "testkey.pem",
6134 }
6135
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006136 apex_key {
6137 name: "mynewapex.key",
6138 public_key: "testkey2.avbpubkey",
6139 private_key: "testkey2.pem",
6140 }
6141
6142 android_app_certificate {
6143 name: "myapex.certificate",
6144 certificate: "testkey",
6145 }
6146
Jiyong Park5d790c32019-11-15 18:40:32 +09006147 android_app {
6148 name: "app",
6149 srcs: ["foo/bar/MyClass.java"],
6150 package_name: "foo",
6151 sdk_version: "none",
6152 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006153 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006154 }
6155
6156 override_android_app {
6157 name: "override_app",
6158 base: "app",
6159 package_name: "bar",
6160 }
markchien7c803b82021-08-26 22:10:06 +08006161
6162 bpf {
6163 name: "bpf",
6164 srcs: ["bpf.c"],
6165 }
6166
6167 bpf {
6168 name: "override_bpf",
6169 srcs: ["override_bpf.c"],
6170 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006171
6172 prebuilt_etc {
6173 name: "myetc",
6174 src: "myprebuilt",
6175 }
6176
6177 prebuilt_etc {
6178 name: "override_myetc",
6179 src: "override_myprebuilt",
6180 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006181
6182 java_library {
6183 name: "bcplib",
6184 srcs: ["a.java"],
6185 compile_dex: true,
6186 apex_available: ["myapex"],
6187 permitted_packages: ["bcp.lib"],
6188 }
6189
6190 bootclasspath_fragment {
6191 name: "mybootclasspath_fragment",
6192 contents: ["bcplib"],
6193 apex_available: ["myapex"],
6194 }
6195
6196 java_library {
6197 name: "override_bcplib",
6198 srcs: ["a.java"],
6199 compile_dex: true,
6200 apex_available: ["myapex"],
6201 permitted_packages: ["override.bcp.lib"],
6202 }
6203
6204 bootclasspath_fragment {
6205 name: "override_bootclasspath_fragment",
6206 contents: ["override_bcplib"],
6207 apex_available: ["myapex"],
6208 }
6209
6210 java_library {
6211 name: "systemserverlib",
6212 srcs: ["a.java"],
6213 apex_available: ["myapex"],
6214 }
6215
6216 systemserverclasspath_fragment {
6217 name: "mysystemserverclasspath_fragment",
6218 standalone_contents: ["systemserverlib"],
6219 apex_available: ["myapex"],
6220 }
6221
6222 java_library {
6223 name: "override_systemserverlib",
6224 srcs: ["a.java"],
6225 apex_available: ["myapex"],
6226 }
6227
6228 systemserverclasspath_fragment {
6229 name: "override_systemserverclasspath_fragment",
6230 standalone_contents: ["override_systemserverlib"],
6231 apex_available: ["myapex"],
6232 }
6233
6234 java_library {
6235 name: "myjava_library",
6236 srcs: ["a.java"],
6237 compile_dex: true,
6238 apex_available: ["myapex"],
6239 }
6240
6241 java_library {
6242 name: "override_java_library",
6243 srcs: ["a.java"],
6244 compile_dex: true,
6245 apex_available: ["myapex"],
6246 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006247 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006248
Jiyong Park317645e2019-12-05 13:20:58 +09006249 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6250 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6251 if originalVariant.GetOverriddenBy() != "" {
6252 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6253 }
6254 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6255 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6256 }
6257
Jiyong Park5d790c32019-11-15 18:40:32 +09006258 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6259 apexRule := module.Rule("apexRule")
6260 copyCmds := apexRule.Args["copy_commands"]
6261
6262 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006263 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006264
markchien7c803b82021-08-26 22:10:06 +08006265 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6266 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6267
Daniel Norman5a3ce132021-08-26 15:44:43 -07006268 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6269 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6270
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006271 apexBundle := module.Module().(*apexBundle)
6272 name := apexBundle.Name()
6273 if name != "override_myapex" {
6274 t.Errorf("name should be \"override_myapex\", but was %q", name)
6275 }
6276
Baligh Uddin004d7172020-02-19 21:29:28 -08006277 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6278 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6279 }
6280
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006281 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6282 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6283 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6284 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6285 android.AssertArrayString(t, "Java_libs does not match",
6286 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6287
Jiyong Park20bacab2020-03-03 11:45:41 +09006288 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006289 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006290 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6291
6292 signApkRule := module.Rule("signapk")
6293 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006294
Colin Crossaa255532020-07-03 13:18:24 -07006295 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006296 var builder strings.Builder
6297 data.Custom(&builder, name, "TARGET_", "", data)
6298 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006299 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006300 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006301 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006302 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6303 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6304 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006305 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006306 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006307 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006308 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006309 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006310 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006311 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6312 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6313 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006314 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006315}
6316
Jooyung Han214bf372019-11-12 13:03:50 +09006317func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006318 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006319 apex {
6320 name: "myapex",
6321 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006322 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006323 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006324 }
6325
6326 apex_key {
6327 name: "myapex.key",
6328 public_key: "testkey.avbpubkey",
6329 private_key: "testkey.pem",
6330 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006331
6332 cc_library {
6333 name: "mylib",
6334 srcs: ["mylib.cpp"],
6335 stl: "libc++",
6336 system_shared_libs: [],
6337 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006338 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006339 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006340 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006341
6342 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6343 args := module.Rule("apexRule").Args
6344 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006345 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006346
6347 // The copies of the libraries in the apex should have one more dependency than
6348 // the ones outside the apex, namely the unwinder. Ideally we should check
6349 // the dependency names directly here but for some reason the names are blank in
6350 // this test.
6351 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006352 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006353 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6354 if len(apexImplicits) != len(nonApexImplicits)+1 {
6355 t.Errorf("%q missing unwinder dep", lib)
6356 }
6357 }
Jooyung Han214bf372019-11-12 13:03:50 +09006358}
6359
Paul Duffine05480a2021-03-08 15:07:14 +00006360var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006361 "api/current.txt": nil,
6362 "api/removed.txt": nil,
6363 "api/system-current.txt": nil,
6364 "api/system-removed.txt": nil,
6365 "api/test-current.txt": nil,
6366 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006367
Anton Hanssondff2c782020-12-21 17:10:01 +00006368 "100/public/api/foo.txt": nil,
6369 "100/public/api/foo-removed.txt": nil,
6370 "100/system/api/foo.txt": nil,
6371 "100/system/api/foo-removed.txt": nil,
6372
Paul Duffineedc5d52020-06-12 17:46:39 +01006373 // For java_sdk_library_import
6374 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006375}
6376
Jooyung Han58f26ab2019-12-18 15:34:32 +09006377func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006378 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006379 apex {
6380 name: "myapex",
6381 key: "myapex.key",
6382 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006383 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006384 }
6385
6386 apex_key {
6387 name: "myapex.key",
6388 public_key: "testkey.avbpubkey",
6389 private_key: "testkey.pem",
6390 }
6391
6392 java_sdk_library {
6393 name: "foo",
6394 srcs: ["a.java"],
6395 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006396 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006397 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006398
6399 prebuilt_apis {
6400 name: "sdk",
6401 api_dirs: ["100"],
6402 }
Paul Duffin9b879592020-05-26 13:21:35 +01006403 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006404
6405 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006406 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006407 "javalib/foo.jar",
6408 "etc/permissions/foo.xml",
6409 })
6410 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006411 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006412 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 +09006413}
6414
Paul Duffin9b879592020-05-26 13:21:35 +01006415func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006416 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006417 apex {
6418 name: "myapex",
6419 key: "myapex.key",
6420 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006421 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006422 }
6423
6424 apex_key {
6425 name: "myapex.key",
6426 public_key: "testkey.avbpubkey",
6427 private_key: "testkey.pem",
6428 }
6429
6430 java_sdk_library {
6431 name: "foo",
6432 srcs: ["a.java"],
6433 api_packages: ["foo"],
6434 apex_available: ["myapex"],
6435 sdk_version: "none",
6436 system_modules: "none",
6437 }
6438
6439 java_library {
6440 name: "bar",
6441 srcs: ["a.java"],
6442 libs: ["foo"],
6443 apex_available: ["myapex"],
6444 sdk_version: "none",
6445 system_modules: "none",
6446 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006447
6448 prebuilt_apis {
6449 name: "sdk",
6450 api_dirs: ["100"],
6451 }
Paul Duffin9b879592020-05-26 13:21:35 +01006452 `, withFiles(filesForSdkLibrary))
6453
6454 // java_sdk_library installs both impl jar and permission XML
6455 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6456 "javalib/bar.jar",
6457 "javalib/foo.jar",
6458 "etc/permissions/foo.xml",
6459 })
6460
6461 // The bar library should depend on the implementation jar.
6462 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006463 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006464 t.Errorf("expected %q, found %#q", expected, actual)
6465 }
6466}
6467
6468func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006469 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006470 apex {
6471 name: "myapex",
6472 key: "myapex.key",
6473 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006474 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006475 }
6476
6477 apex_key {
6478 name: "myapex.key",
6479 public_key: "testkey.avbpubkey",
6480 private_key: "testkey.pem",
6481 }
6482
6483 java_sdk_library {
6484 name: "foo",
6485 srcs: ["a.java"],
6486 api_packages: ["foo"],
6487 apex_available: ["myapex"],
6488 sdk_version: "none",
6489 system_modules: "none",
6490 }
6491
6492 java_library {
6493 name: "bar",
6494 srcs: ["a.java"],
6495 libs: ["foo"],
6496 sdk_version: "none",
6497 system_modules: "none",
6498 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006499
6500 prebuilt_apis {
6501 name: "sdk",
6502 api_dirs: ["100"],
6503 }
Paul Duffin9b879592020-05-26 13:21:35 +01006504 `, withFiles(filesForSdkLibrary))
6505
6506 // java_sdk_library installs both impl jar and permission XML
6507 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6508 "javalib/foo.jar",
6509 "etc/permissions/foo.xml",
6510 })
6511
6512 // The bar library should depend on the stubs jar.
6513 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006514 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006515 t.Errorf("expected %q, found %#q", expected, actual)
6516 }
6517}
6518
Paul Duffineedc5d52020-06-12 17:46:39 +01006519func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006520 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006521 prebuilt_apis {
6522 name: "sdk",
6523 api_dirs: ["100"],
6524 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006525 withFiles(map[string][]byte{
6526 "apex/a.java": nil,
6527 "apex/apex_manifest.json": nil,
6528 "apex/Android.bp": []byte(`
6529 package {
6530 default_visibility: ["//visibility:private"],
6531 }
6532
6533 apex {
6534 name: "myapex",
6535 key: "myapex.key",
6536 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006537 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006538 }
6539
6540 apex_key {
6541 name: "myapex.key",
6542 public_key: "testkey.avbpubkey",
6543 private_key: "testkey.pem",
6544 }
6545
6546 java_library {
6547 name: "bar",
6548 srcs: ["a.java"],
6549 libs: ["foo"],
6550 apex_available: ["myapex"],
6551 sdk_version: "none",
6552 system_modules: "none",
6553 }
6554`),
6555 "source/a.java": nil,
6556 "source/api/current.txt": nil,
6557 "source/api/removed.txt": nil,
6558 "source/Android.bp": []byte(`
6559 package {
6560 default_visibility: ["//visibility:private"],
6561 }
6562
6563 java_sdk_library {
6564 name: "foo",
6565 visibility: ["//apex"],
6566 srcs: ["a.java"],
6567 api_packages: ["foo"],
6568 apex_available: ["myapex"],
6569 sdk_version: "none",
6570 system_modules: "none",
6571 public: {
6572 enabled: true,
6573 },
6574 }
6575`),
6576 "prebuilt/a.jar": nil,
6577 "prebuilt/Android.bp": []byte(`
6578 package {
6579 default_visibility: ["//visibility:private"],
6580 }
6581
6582 java_sdk_library_import {
6583 name: "foo",
6584 visibility: ["//apex", "//source"],
6585 apex_available: ["myapex"],
6586 prefer: true,
6587 public: {
6588 jars: ["a.jar"],
6589 },
6590 }
6591`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006592 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006593 )
6594
6595 // java_sdk_library installs both impl jar and permission XML
6596 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6597 "javalib/bar.jar",
6598 "javalib/foo.jar",
6599 "etc/permissions/foo.xml",
6600 })
6601
6602 // The bar library should depend on the implementation jar.
6603 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006604 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006605 t.Errorf("expected %q, found %#q", expected, actual)
6606 }
6607}
6608
6609func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6610 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6611 apex {
6612 name: "myapex",
6613 key: "myapex.key",
6614 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006615 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006616 }
6617
6618 apex_key {
6619 name: "myapex.key",
6620 public_key: "testkey.avbpubkey",
6621 private_key: "testkey.pem",
6622 }
6623
6624 java_sdk_library_import {
6625 name: "foo",
6626 apex_available: ["myapex"],
6627 prefer: true,
6628 public: {
6629 jars: ["a.jar"],
6630 },
6631 }
6632
6633 `, withFiles(filesForSdkLibrary))
6634}
6635
atrost6e126252020-01-27 17:01:16 +00006636func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006637 result := android.GroupFixturePreparers(
6638 prepareForApexTest,
6639 java.PrepareForTestWithPlatformCompatConfig,
6640 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006641 apex {
6642 name: "myapex",
6643 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006644 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006645 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006646 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006647 }
6648
6649 apex_key {
6650 name: "myapex.key",
6651 public_key: "testkey.avbpubkey",
6652 private_key: "testkey.pem",
6653 }
6654
6655 platform_compat_config {
6656 name: "myjar-platform-compat-config",
6657 src: ":myjar",
6658 }
6659
6660 java_library {
6661 name: "myjar",
6662 srcs: ["foo/bar/MyClass.java"],
6663 sdk_version: "none",
6664 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006665 apex_available: [ "myapex" ],
6666 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006667
6668 // Make sure that a preferred prebuilt does not affect the apex contents.
6669 prebuilt_platform_compat_config {
6670 name: "myjar-platform-compat-config",
6671 metadata: "compat-config/metadata.xml",
6672 prefer: true,
6673 }
atrost6e126252020-01-27 17:01:16 +00006674 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006675 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006676 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6677 "etc/compatconfig/myjar-platform-compat-config.xml",
6678 "javalib/myjar.jar",
6679 })
6680}
6681
Jiyong Park479321d2019-12-16 11:47:12 +09006682func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6683 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6684 apex {
6685 name: "myapex",
6686 key: "myapex.key",
6687 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006688 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006689 }
6690
6691 apex_key {
6692 name: "myapex.key",
6693 public_key: "testkey.avbpubkey",
6694 private_key: "testkey.pem",
6695 }
6696
6697 java_library {
6698 name: "myjar",
6699 srcs: ["foo/bar/MyClass.java"],
6700 sdk_version: "none",
6701 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006702 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006703 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006704 }
6705 `)
6706}
6707
Jiyong Park7afd1072019-12-30 16:56:33 +09006708func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006709 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006710 apex {
6711 name: "myapex",
6712 key: "myapex.key",
6713 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006714 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006715 }
6716
6717 apex_key {
6718 name: "myapex.key",
6719 public_key: "testkey.avbpubkey",
6720 private_key: "testkey.pem",
6721 }
6722
6723 cc_library {
6724 name: "mylib",
6725 srcs: ["mylib.cpp"],
6726 system_shared_libs: [],
6727 stl: "none",
6728 required: ["a", "b"],
6729 host_required: ["c", "d"],
6730 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006731 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006732 }
6733 `)
6734
6735 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006736 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006737 name := apexBundle.BaseModuleName()
6738 prefix := "TARGET_"
6739 var builder strings.Builder
6740 data.Custom(&builder, name, prefix, "", data)
6741 androidMk := builder.String()
6742 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6743 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6744 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6745}
6746
Jiyong Park7cd10e32020-01-14 09:22:18 +09006747func TestSymlinksFromApexToSystem(t *testing.T) {
6748 bp := `
6749 apex {
6750 name: "myapex",
6751 key: "myapex.key",
6752 native_shared_libs: ["mylib"],
6753 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006754 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006755 }
6756
Jiyong Park9d677202020-02-19 16:29:35 +09006757 apex {
6758 name: "myapex.updatable",
6759 key: "myapex.key",
6760 native_shared_libs: ["mylib"],
6761 java_libs: ["myjar"],
6762 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006763 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006764 }
6765
Jiyong Park7cd10e32020-01-14 09:22:18 +09006766 apex_key {
6767 name: "myapex.key",
6768 public_key: "testkey.avbpubkey",
6769 private_key: "testkey.pem",
6770 }
6771
6772 cc_library {
6773 name: "mylib",
6774 srcs: ["mylib.cpp"],
6775 shared_libs: ["myotherlib"],
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 cc_library {
6787 name: "myotherlib",
6788 srcs: ["mylib.cpp"],
6789 system_shared_libs: [],
6790 stl: "none",
6791 apex_available: [
6792 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006793 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006794 "//apex_available:platform",
6795 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006796 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006797 }
6798
6799 java_library {
6800 name: "myjar",
6801 srcs: ["foo/bar/MyClass.java"],
6802 sdk_version: "none",
6803 system_modules: "none",
6804 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006805 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 java_library {
6814 name: "myotherjar",
6815 srcs: ["foo/bar/MyClass.java"],
6816 sdk_version: "none",
6817 system_modules: "none",
6818 apex_available: [
6819 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006820 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006821 "//apex_available:platform",
6822 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006823 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006824 }
6825 `
6826
6827 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6828 for _, f := range files {
6829 if f.path == file {
6830 if f.isLink {
6831 t.Errorf("%q is not a real file", file)
6832 }
6833 return
6834 }
6835 }
6836 t.Errorf("%q is not found", file)
6837 }
6838
6839 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6840 for _, f := range files {
6841 if f.path == file {
6842 if !f.isLink {
6843 t.Errorf("%q is not a symlink", file)
6844 }
6845 return
6846 }
6847 }
6848 t.Errorf("%q is not found", file)
6849 }
6850
Jiyong Park9d677202020-02-19 16:29:35 +09006851 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6852 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006853 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006854 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006855 ensureRealfileExists(t, files, "javalib/myjar.jar")
6856 ensureRealfileExists(t, files, "lib64/mylib.so")
6857 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6858
Jiyong Park9d677202020-02-19 16:29:35 +09006859 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6860 ensureRealfileExists(t, files, "javalib/myjar.jar")
6861 ensureRealfileExists(t, files, "lib64/mylib.so")
6862 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6863
6864 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006865 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006866 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006867 ensureRealfileExists(t, files, "javalib/myjar.jar")
6868 ensureRealfileExists(t, files, "lib64/mylib.so")
6869 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006870
6871 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6872 ensureRealfileExists(t, files, "javalib/myjar.jar")
6873 ensureRealfileExists(t, files, "lib64/mylib.so")
6874 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006875}
6876
Yo Chiange8128052020-07-23 20:09:18 +08006877func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006878 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006879 apex {
6880 name: "myapex",
6881 key: "myapex.key",
6882 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006883 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006884 }
6885
6886 apex_key {
6887 name: "myapex.key",
6888 public_key: "testkey.avbpubkey",
6889 private_key: "testkey.pem",
6890 }
6891
6892 cc_library_shared {
6893 name: "mylib",
6894 srcs: ["mylib.cpp"],
6895 shared_libs: ["myotherlib"],
6896 system_shared_libs: [],
6897 stl: "none",
6898 apex_available: [
6899 "myapex",
6900 "//apex_available:platform",
6901 ],
6902 }
6903
6904 cc_prebuilt_library_shared {
6905 name: "myotherlib",
6906 srcs: ["prebuilt.so"],
6907 system_shared_libs: [],
6908 stl: "none",
6909 apex_available: [
6910 "myapex",
6911 "//apex_available:platform",
6912 ],
6913 }
6914 `)
6915
6916 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006917 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006918 var builder strings.Builder
6919 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6920 androidMk := builder.String()
6921 // `myotherlib` is added to `myapex` as symlink
6922 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6923 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6924 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6925 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006926 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 +08006927}
6928
Jooyung Han643adc42020-02-27 13:50:06 +09006929func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006930 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006931 apex {
6932 name: "myapex",
6933 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09006934 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006935 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006936 }
6937
6938 apex_key {
6939 name: "myapex.key",
6940 public_key: "testkey.avbpubkey",
6941 private_key: "testkey.pem",
6942 }
6943
6944 cc_library {
6945 name: "mylib",
6946 srcs: ["mylib.cpp"],
6947 shared_libs: ["mylib2"],
6948 system_shared_libs: [],
6949 stl: "none",
6950 apex_available: [ "myapex" ],
6951 }
6952
6953 cc_library {
6954 name: "mylib2",
6955 srcs: ["mylib.cpp"],
6956 system_shared_libs: [],
6957 stl: "none",
6958 apex_available: [ "myapex" ],
6959 }
Jiyong Park34d5c332022-02-24 18:02:44 +09006960
6961 rust_ffi_shared {
6962 name: "libfoo.rust",
6963 crate_name: "foo",
6964 srcs: ["foo.rs"],
6965 shared_libs: ["libfoo.shared_from_rust"],
6966 prefer_rlib: true,
6967 apex_available: ["myapex"],
6968 }
6969
6970 cc_library_shared {
6971 name: "libfoo.shared_from_rust",
6972 srcs: ["mylib.cpp"],
6973 system_shared_libs: [],
6974 stl: "none",
6975 stubs: {
6976 versions: ["10", "11", "12"],
6977 },
6978 }
6979
Jooyung Han643adc42020-02-27 13:50:06 +09006980 `)
6981
6982 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6983 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09006984 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09006985 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6986 "lib64/mylib.so",
6987 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09006988 "lib64/libfoo.rust.so",
6989 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
6990 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09006991 })
Jiyong Park34d5c332022-02-24 18:02:44 +09006992
6993 // b/220397949
6994 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09006995}
6996
Jooyung Han49f67012020-04-17 13:43:10 +09006997func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006998 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006999 apex {
7000 name: "myapex",
7001 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007002 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007003 }
7004 apex_key {
7005 name: "myapex.key",
7006 public_key: "testkey.avbpubkey",
7007 private_key: "testkey.pem",
7008 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007009 `,
7010 android.FixtureModifyConfig(func(config android.Config) {
7011 delete(config.Targets, android.Android)
7012 config.AndroidCommonTarget = android.Target{}
7013 }),
7014 )
Jooyung Han49f67012020-04-17 13:43:10 +09007015
7016 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7017 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7018 }
7019}
7020
Jiyong Parkbd159612020-02-28 15:22:21 +09007021func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007022 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007023 apex {
7024 name: "myapex",
7025 key: "myapex.key",
7026 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007027 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007028 }
7029
7030 apex_key {
7031 name: "myapex.key",
7032 public_key: "testkey.avbpubkey",
7033 private_key: "testkey.pem",
7034 }
7035
7036 android_app {
7037 name: "AppFoo",
7038 srcs: ["foo/bar/MyClass.java"],
7039 sdk_version: "none",
7040 system_modules: "none",
7041 apex_available: [ "myapex" ],
7042 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007043 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007044
Colin Crosscf371cc2020-11-13 11:48:42 -08007045 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007046 content := bundleConfigRule.Args["content"]
7047
7048 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007049 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 +09007050}
7051
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007052func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007053 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007054 apex {
7055 name: "myapex",
7056 key: "myapex.key",
7057 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007058 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007059 }
7060
7061 apex_key {
7062 name: "myapex.key",
7063 public_key: "testkey.avbpubkey",
7064 private_key: "testkey.pem",
7065 }
7066
7067 android_app_set {
7068 name: "AppSet",
7069 set: "AppSet.apks",
7070 }`)
7071 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007072 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007073 content := bundleConfigRule.Args["content"]
7074 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7075 s := mod.Rule("apexRule").Args["copy_commands"]
7076 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
7077 if len(copyCmds) != 3 {
7078 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
7079 }
7080 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
7081 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
7082 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
7083}
7084
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007085func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007086 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007087 apex_set {
7088 name: "myapex",
7089 filename: "foo_v2.apex",
7090 sanitized: {
7091 none: { set: "myapex.apks", },
7092 hwaddress: { set: "myapex.hwasan.apks", },
7093 },
Paul Duffin24704672021-04-06 16:09:30 +01007094 }
7095 `
7096 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007097
Paul Duffin24704672021-04-06 16:09:30 +01007098 // Check that the extractor produces the correct output file from the correct input file.
7099 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007100
Paul Duffin24704672021-04-06 16:09:30 +01007101 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7102 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007103
Paul Duffin24704672021-04-06 16:09:30 +01007104 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7105
7106 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007107 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7108 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007109
7110 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007111}
7112
Paul Duffin89f570a2021-06-16 01:42:33 +01007113func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007114 t.Helper()
7115
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007116 bp := `
7117 java_library {
7118 name: "some-updatable-apex-lib",
7119 srcs: ["a.java"],
7120 sdk_version: "current",
7121 apex_available: [
7122 "some-updatable-apex",
7123 ],
satayevabcd5972021-08-06 17:49:46 +01007124 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007125 }
7126
7127 java_library {
7128 name: "some-non-updatable-apex-lib",
7129 srcs: ["a.java"],
7130 apex_available: [
7131 "some-non-updatable-apex",
7132 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007133 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007134 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007135 }
7136
7137 bootclasspath_fragment {
7138 name: "some-non-updatable-fragment",
7139 contents: ["some-non-updatable-apex-lib"],
7140 apex_available: [
7141 "some-non-updatable-apex",
7142 ],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007143 }
7144
7145 java_library {
7146 name: "some-platform-lib",
7147 srcs: ["a.java"],
7148 sdk_version: "current",
7149 installable: true,
7150 }
7151
7152 java_library {
7153 name: "some-art-lib",
7154 srcs: ["a.java"],
7155 sdk_version: "current",
7156 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007157 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007158 ],
7159 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007160 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007161 }
7162
7163 apex {
7164 name: "some-updatable-apex",
7165 key: "some-updatable-apex.key",
7166 java_libs: ["some-updatable-apex-lib"],
7167 updatable: true,
7168 min_sdk_version: "current",
7169 }
7170
7171 apex {
7172 name: "some-non-updatable-apex",
7173 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007174 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007175 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007176 }
7177
7178 apex_key {
7179 name: "some-updatable-apex.key",
7180 }
7181
7182 apex_key {
7183 name: "some-non-updatable-apex.key",
7184 }
7185
7186 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007187 name: "com.android.art.debug",
7188 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007189 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007190 updatable: true,
7191 min_sdk_version: "current",
7192 }
7193
Paul Duffinf23bc472021-04-27 12:42:20 +01007194 bootclasspath_fragment {
7195 name: "art-bootclasspath-fragment",
7196 image_name: "art",
7197 contents: ["some-art-lib"],
7198 apex_available: [
7199 "com.android.art.debug",
7200 ],
7201 }
7202
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007203 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007204 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007205 }
7206
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007207 filegroup {
7208 name: "some-updatable-apex-file_contexts",
7209 srcs: [
7210 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7211 ],
7212 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007213
7214 filegroup {
7215 name: "some-non-updatable-apex-file_contexts",
7216 srcs: [
7217 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7218 ],
7219 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007220 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007221
Paul Duffin89f570a2021-06-16 01:42:33 +01007222 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007223}
7224
Paul Duffin89f570a2021-06-16 01:42:33 +01007225func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007226 t.Helper()
7227
Paul Duffin55607122021-03-30 23:32:51 +01007228 fs := android.MockFS{
7229 "a.java": nil,
7230 "a.jar": nil,
7231 "apex_manifest.json": nil,
7232 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007233 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007234 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7235 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7236 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007237 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007238 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007239
Paul Duffin55607122021-03-30 23:32:51 +01007240 errorHandler := android.FixtureExpectsNoErrors
7241 if errmsg != "" {
7242 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007243 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007244
Paul Duffin55607122021-03-30 23:32:51 +01007245 result := android.GroupFixturePreparers(
7246 cc.PrepareForTestWithCcDefaultModules,
7247 java.PrepareForTestWithHiddenApiBuildComponents,
7248 java.PrepareForTestWithJavaDefaultModules,
7249 java.PrepareForTestWithJavaSdkLibraryFiles,
7250 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007251 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007252 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007253 android.FixtureModifyMockFS(func(fs android.MockFS) {
7254 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7255 insert := ""
7256 for _, fragment := range fragments {
7257 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7258 }
7259 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7260 platform_bootclasspath {
7261 name: "platform-bootclasspath",
7262 fragments: [
7263 %s
7264 ],
7265 }
7266 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007267 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007268 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007269 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007270 ).
7271 ExtendWithErrorHandler(errorHandler).
7272 RunTestWithBp(t, bp)
7273
7274 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007275}
7276
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007277func TestDuplicateDeapexeresFromPrebuiltApexes(t *testing.T) {
7278 preparers := android.GroupFixturePreparers(
7279 java.PrepareForTestWithJavaDefaultModules,
7280 PrepareForTestWithApexBuildComponents,
7281 ).
7282 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7283 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7284
7285 bpBase := `
7286 apex_set {
7287 name: "com.android.myapex",
7288 installable: true,
7289 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7290 set: "myapex.apks",
7291 }
7292
7293 apex_set {
7294 name: "com.mycompany.android.myapex",
7295 apex_name: "com.android.myapex",
7296 installable: true,
7297 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7298 set: "company-myapex.apks",
7299 }
7300
7301 prebuilt_bootclasspath_fragment {
7302 name: "my-bootclasspath-fragment",
7303 apex_available: ["com.android.myapex"],
7304 %s
7305 }
7306 `
7307
7308 t.Run("java_import", func(t *testing.T) {
7309 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7310 java_import {
7311 name: "libfoo",
7312 jars: ["libfoo.jar"],
7313 apex_available: ["com.android.myapex"],
7314 }
7315 `)
7316 })
7317
7318 t.Run("java_sdk_library_import", func(t *testing.T) {
7319 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7320 java_sdk_library_import {
7321 name: "libfoo",
7322 public: {
7323 jars: ["libbar.jar"],
7324 },
7325 apex_available: ["com.android.myapex"],
7326 }
7327 `)
7328 })
7329
7330 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7331 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7332 image_name: "art",
7333 contents: ["libfoo"],
7334 `)+`
7335 java_sdk_library_import {
7336 name: "libfoo",
7337 public: {
7338 jars: ["libbar.jar"],
7339 },
7340 apex_available: ["com.android.myapex"],
7341 }
7342 `)
7343 })
7344}
7345
Jooyung Han548640b2020-04-27 12:10:30 +09007346func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7347 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7348 apex {
7349 name: "myapex",
7350 key: "myapex.key",
7351 updatable: true,
7352 }
7353
7354 apex_key {
7355 name: "myapex.key",
7356 public_key: "testkey.avbpubkey",
7357 private_key: "testkey.pem",
7358 }
7359 `)
7360}
7361
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007362func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7363 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7364 apex {
7365 name: "myapex",
7366 key: "myapex.key",
7367 }
7368
7369 apex_key {
7370 name: "myapex.key",
7371 public_key: "testkey.avbpubkey",
7372 private_key: "testkey.pem",
7373 }
7374 `)
7375}
7376
Daniel Norman69109112021-12-02 12:52:42 -08007377func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7378 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7379 apex {
7380 name: "myapex",
7381 key: "myapex.key",
7382 updatable: true,
7383 soc_specific: true,
7384 }
7385
7386 apex_key {
7387 name: "myapex.key",
7388 public_key: "testkey.avbpubkey",
7389 private_key: "testkey.pem",
7390 }
7391 `)
7392}
7393
satayevb98371c2021-06-15 16:49:50 +01007394func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7395 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7396 apex {
7397 name: "myapex",
7398 key: "myapex.key",
7399 systemserverclasspath_fragments: [
7400 "mysystemserverclasspathfragment",
7401 ],
7402 min_sdk_version: "29",
7403 updatable: true,
7404 }
7405
7406 apex_key {
7407 name: "myapex.key",
7408 public_key: "testkey.avbpubkey",
7409 private_key: "testkey.pem",
7410 }
7411
7412 java_library {
7413 name: "foo",
7414 srcs: ["b.java"],
7415 min_sdk_version: "29",
7416 installable: true,
7417 apex_available: [
7418 "myapex",
7419 ],
7420 }
7421
7422 systemserverclasspath_fragment {
7423 name: "mysystemserverclasspathfragment",
7424 generate_classpaths_proto: false,
7425 contents: [
7426 "foo",
7427 ],
7428 apex_available: [
7429 "myapex",
7430 ],
7431 }
satayevabcd5972021-08-06 17:49:46 +01007432 `,
7433 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7434 )
satayevb98371c2021-06-15 16:49:50 +01007435}
7436
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007437func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007438 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7439 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7440 // modules to be included in the BootJars.
7441 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7442 return android.GroupFixturePreparers(
7443 dexpreopt.FixtureSetBootJars(bootJars...),
7444 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7445 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7446 }),
7447 )
7448 }
7449
7450 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7451 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7452 // specified in the ArtApexJars configuration.
7453 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7454 return android.GroupFixturePreparers(
7455 dexpreopt.FixtureSetArtBootJars(bootJars...),
7456 dexpreopt.FixtureSetBootJars(bootJars...),
7457 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7458 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7459 }),
7460 )
7461 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007462
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007463 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007464 preparer := android.GroupFixturePreparers(
7465 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7466 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7467 )
7468 fragments := []java.ApexVariantReference{
7469 {
7470 Apex: proptools.StringPtr("com.android.art.debug"),
7471 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7472 },
7473 {
7474 Apex: proptools.StringPtr("some-non-updatable-apex"),
7475 Module: proptools.StringPtr("some-non-updatable-fragment"),
7476 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007477 }
satayevabcd5972021-08-06 17:49:46 +01007478 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007479 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007480
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007481 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007482 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7483 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007484 preparer := android.GroupFixturePreparers(
7485 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7486 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7487 )
Paul Duffin60264a02021-04-12 20:02:36 +01007488 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007489 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007490
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007491 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 +01007492 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 +01007493 // Update the dexpreopt ArtApexJars directly.
7494 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7495 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007496 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007497
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007498 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 +01007499 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 +01007500 // Update the dexpreopt ArtApexJars directly.
7501 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7502 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007503 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007504
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007505 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 +01007506 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 +01007507 preparer := android.GroupFixturePreparers(
7508 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7509 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7510 )
Paul Duffin60264a02021-04-12 20:02:36 +01007511 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007512 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007513
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007514 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 +01007515 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007516 fragment := java.ApexVariantReference{
7517 Apex: proptools.StringPtr("some-non-updatable-apex"),
7518 Module: proptools.StringPtr("some-non-updatable-fragment"),
7519 }
7520 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007521 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007522
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007523 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007524 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007525 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
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("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007530 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007531 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7532 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007533 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007534
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007535 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007536 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007537 // Update the dexpreopt ArtApexJars directly.
7538 preparer := prepareSetArtJars("platform:some-platform-lib")
7539 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007540 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007541
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007542 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007543 preparer := android.GroupFixturePreparers(
7544 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7545 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7546 )
7547 fragments := []java.ApexVariantReference{
7548 {
7549 Apex: proptools.StringPtr("some-non-updatable-apex"),
7550 Module: proptools.StringPtr("some-non-updatable-fragment"),
7551 },
7552 }
7553 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007554 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007555}
7556
7557func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007558 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007559 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007560 fragment := java.ApexVariantReference{
7561 Apex: proptools.StringPtr("myapex"),
7562 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7563 }
7564
Paul Duffin064b70c2020-11-02 17:32:38 +00007565 testDexpreoptWithApexes(t, `
7566 prebuilt_apex {
7567 name: "myapex" ,
7568 arch: {
7569 arm64: {
7570 src: "myapex-arm64.apex",
7571 },
7572 arm: {
7573 src: "myapex-arm.apex",
7574 },
7575 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007576 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7577 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007578
Paul Duffin89f570a2021-06-16 01:42:33 +01007579 prebuilt_bootclasspath_fragment {
7580 name: "my-bootclasspath-fragment",
7581 contents: ["libfoo"],
7582 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007583 hidden_api: {
7584 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7585 metadata: "my-bootclasspath-fragment/metadata.csv",
7586 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007587 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7588 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7589 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007590 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007591 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007592
Paul Duffin89f570a2021-06-16 01:42:33 +01007593 java_import {
7594 name: "libfoo",
7595 jars: ["libfoo.jar"],
7596 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007597 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007598 }
7599 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007600 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007601}
7602
Spandan Dasf14e2542021-11-12 00:01:37 +00007603func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007604 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007605 bp += `
7606 apex_key {
7607 name: "myapex.key",
7608 public_key: "testkey.avbpubkey",
7609 private_key: "testkey.pem",
7610 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007611 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007612 "lib1/src/A.java": nil,
7613 "lib2/src/B.java": nil,
7614 "system/sepolicy/apex/myapex-file_contexts": nil,
7615 }
7616
Paul Duffin45338f02021-03-30 23:07:52 +01007617 errorHandler := android.FixtureExpectsNoErrors
7618 if errmsg != "" {
7619 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007620 }
Colin Crossae8600b2020-10-29 17:09:13 -07007621
Paul Duffin45338f02021-03-30 23:07:52 +01007622 android.GroupFixturePreparers(
7623 android.PrepareForTestWithAndroidBuildComponents,
7624 java.PrepareForTestWithJavaBuildComponents,
7625 PrepareForTestWithApexBuildComponents,
7626 android.PrepareForTestWithNeverallowRules(rules),
7627 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007628 apexBootJars := make([]string, 0, len(bootJars))
7629 for _, apexBootJar := range bootJars {
7630 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007631 }
satayevd604b212021-07-21 14:23:52 +01007632 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007633 }),
7634 fs.AddToFixture(),
7635 ).
7636 ExtendWithErrorHandler(errorHandler).
7637 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007638}
7639
7640func TestApexPermittedPackagesRules(t *testing.T) {
7641 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00007642 name string
7643 expectedError string
7644 bp string
7645 bootJars []string
7646 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01007647 }{
7648
7649 {
7650 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7651 expectedError: "",
7652 bp: `
7653 java_library {
7654 name: "bcp_lib1",
7655 srcs: ["lib1/src/*.java"],
7656 permitted_packages: ["foo.bar"],
7657 apex_available: ["myapex"],
7658 sdk_version: "none",
7659 system_modules: "none",
7660 }
7661 java_library {
7662 name: "nonbcp_lib2",
7663 srcs: ["lib2/src/*.java"],
7664 apex_available: ["myapex"],
7665 permitted_packages: ["a.b"],
7666 sdk_version: "none",
7667 system_modules: "none",
7668 }
7669 apex {
7670 name: "myapex",
7671 key: "myapex.key",
7672 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007673 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007674 }`,
7675 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007676 bcpPermittedPackages: map[string][]string{
7677 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007678 "foo.bar",
7679 },
7680 },
7681 },
7682 {
Anton Hanssone1b18362021-12-23 15:05:38 +00007683 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00007684 expectedError: `(?s)module "bcp_lib2" .* which is restricted because bcp_lib2 bootjar may only use these package prefixes: foo.bar. 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 +01007685 bp: `
7686 java_library {
7687 name: "bcp_lib1",
7688 srcs: ["lib1/src/*.java"],
7689 apex_available: ["myapex"],
7690 permitted_packages: ["foo.bar"],
7691 sdk_version: "none",
7692 system_modules: "none",
7693 }
7694 java_library {
7695 name: "bcp_lib2",
7696 srcs: ["lib2/src/*.java"],
7697 apex_available: ["myapex"],
7698 permitted_packages: ["foo.bar", "bar.baz"],
7699 sdk_version: "none",
7700 system_modules: "none",
7701 }
7702 apex {
7703 name: "myapex",
7704 key: "myapex.key",
7705 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007706 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007707 }
7708 `,
7709 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00007710 bcpPermittedPackages: map[string][]string{
7711 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01007712 "foo.bar",
7713 },
Spandan Dasf14e2542021-11-12 00:01:37 +00007714 "bcp_lib2": []string{
7715 "foo.bar",
7716 },
7717 },
7718 },
7719 {
7720 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
7721 expectedError: "",
7722 bp: `
7723 java_library {
7724 name: "bcp_lib_restricted",
7725 srcs: ["lib1/src/*.java"],
7726 apex_available: ["myapex"],
7727 permitted_packages: ["foo.bar"],
7728 sdk_version: "none",
7729 min_sdk_version: "29",
7730 system_modules: "none",
7731 }
7732 java_library {
7733 name: "bcp_lib_unrestricted",
7734 srcs: ["lib2/src/*.java"],
7735 apex_available: ["myapex"],
7736 permitted_packages: ["foo.bar", "bar.baz"],
7737 sdk_version: "none",
7738 min_sdk_version: "29",
7739 system_modules: "none",
7740 }
7741 apex {
7742 name: "myapex",
7743 key: "myapex.key",
7744 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
7745 updatable: true,
7746 min_sdk_version: "29",
7747 }
7748 `,
7749 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7750 bcpPermittedPackages: map[string][]string{
7751 "bcp_lib1_non_updateable": []string{
7752 "foo.bar",
7753 },
7754 // bcp_lib2_updateable has no entry here since updateable bcp can contain new packages - tracking via an allowlist is not necessary
Andrei Onea115e7e72020-06-05 21:14:03 +01007755 },
7756 },
7757 }
7758 for _, tc := range testcases {
7759 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00007760 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
7761 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01007762 })
7763 }
7764}
7765
Jiyong Park62304bb2020-04-13 16:19:48 +09007766func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007767 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09007768 apex {
7769 name: "myapex",
7770 key: "myapex.key",
7771 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007772 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09007773 }
7774
7775 apex_key {
7776 name: "myapex.key",
7777 public_key: "testkey.avbpubkey",
7778 private_key: "testkey.pem",
7779 }
7780
7781 cc_library {
7782 name: "mylib",
7783 srcs: ["mylib.cpp"],
7784 system_shared_libs: [],
7785 stl: "none",
7786 stubs: {
7787 versions: ["1"],
7788 },
7789 apex_available: ["myapex"],
7790 }
7791
7792 cc_library {
7793 name: "myprivlib",
7794 srcs: ["mylib.cpp"],
7795 system_shared_libs: [],
7796 stl: "none",
7797 apex_available: ["myapex"],
7798 }
7799
7800
7801 cc_test {
7802 name: "mytest",
7803 gtest: false,
7804 srcs: ["mylib.cpp"],
7805 system_shared_libs: [],
7806 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09007807 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09007808 test_for: ["myapex"]
7809 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007810
7811 cc_library {
7812 name: "mytestlib",
7813 srcs: ["mylib.cpp"],
7814 system_shared_libs: [],
7815 shared_libs: ["mylib", "myprivlib"],
7816 stl: "none",
7817 test_for: ["myapex"],
7818 }
7819
7820 cc_benchmark {
7821 name: "mybench",
7822 srcs: ["mylib.cpp"],
7823 system_shared_libs: [],
7824 shared_libs: ["mylib", "myprivlib"],
7825 stl: "none",
7826 test_for: ["myapex"],
7827 }
Jiyong Park62304bb2020-04-13 16:19:48 +09007828 `)
7829
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007830 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007831 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007832 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7833 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7834 }
7835
7836 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09007837 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007838 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7839 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7840 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7841}
Jiyong Park46a512f2020-12-04 18:02:13 +09007842
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007843func TestIndirectTestFor(t *testing.T) {
7844 ctx := testApex(t, `
7845 apex {
7846 name: "myapex",
7847 key: "myapex.key",
7848 native_shared_libs: ["mylib", "myprivlib"],
7849 updatable: false,
7850 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007851
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007852 apex_key {
7853 name: "myapex.key",
7854 public_key: "testkey.avbpubkey",
7855 private_key: "testkey.pem",
7856 }
7857
7858 cc_library {
7859 name: "mylib",
7860 srcs: ["mylib.cpp"],
7861 system_shared_libs: [],
7862 stl: "none",
7863 stubs: {
7864 versions: ["1"],
7865 },
7866 apex_available: ["myapex"],
7867 }
7868
7869 cc_library {
7870 name: "myprivlib",
7871 srcs: ["mylib.cpp"],
7872 system_shared_libs: [],
7873 stl: "none",
7874 shared_libs: ["mylib"],
7875 apex_available: ["myapex"],
7876 }
7877
7878 cc_library {
7879 name: "mytestlib",
7880 srcs: ["mylib.cpp"],
7881 system_shared_libs: [],
7882 shared_libs: ["myprivlib"],
7883 stl: "none",
7884 test_for: ["myapex"],
7885 }
7886 `)
7887
7888 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007889 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007890 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7891 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7892 }
7893
7894 // The platform variant of mytestlib links to the platform variant of the
7895 // internal myprivlib.
7896 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
7897
7898 // The platform variant of myprivlib links to the platform variant of mylib
7899 // and bypasses its stubs.
7900 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 +09007901}
7902
Martin Stjernholmec009002021-03-27 15:18:31 +00007903func TestTestForForLibInOtherApex(t *testing.T) {
7904 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
7905 _ = testApex(t, `
7906 apex {
7907 name: "com.android.art",
7908 key: "myapex.key",
7909 native_shared_libs: ["mylib"],
7910 updatable: false,
7911 }
7912
7913 apex {
7914 name: "com.android.art.debug",
7915 key: "myapex.key",
7916 native_shared_libs: ["mylib", "mytestlib"],
7917 updatable: false,
7918 }
7919
7920 apex_key {
7921 name: "myapex.key",
7922 public_key: "testkey.avbpubkey",
7923 private_key: "testkey.pem",
7924 }
7925
7926 cc_library {
7927 name: "mylib",
7928 srcs: ["mylib.cpp"],
7929 system_shared_libs: [],
7930 stl: "none",
7931 stubs: {
7932 versions: ["1"],
7933 },
7934 apex_available: ["com.android.art", "com.android.art.debug"],
7935 }
7936
7937 cc_library {
7938 name: "mytestlib",
7939 srcs: ["mylib.cpp"],
7940 system_shared_libs: [],
7941 shared_libs: ["mylib"],
7942 stl: "none",
7943 apex_available: ["com.android.art.debug"],
7944 test_for: ["com.android.art"],
7945 }
7946 `,
7947 android.MockFS{
7948 "system/sepolicy/apex/com.android.art-file_contexts": nil,
7949 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
7950 }.AddToFixture())
7951}
7952
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007953// TODO(jungjw): Move this to proptools
7954func intPtr(i int) *int {
7955 return &i
7956}
7957
7958func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007959 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007960 apex_set {
7961 name: "myapex",
7962 set: "myapex.apks",
7963 filename: "foo_v2.apex",
7964 overrides: ["foo"],
7965 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007966 `,
7967 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7968 variables.Platform_sdk_version = intPtr(30)
7969 }),
7970 android.FixtureModifyConfig(func(config android.Config) {
7971 config.Targets[android.Android] = []android.Target{
7972 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
7973 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
7974 }
7975 }),
7976 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007977
Paul Duffin24704672021-04-06 16:09:30 +01007978 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007979
7980 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01007981 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007982 actual := extractedApex.Args["abis"]
7983 expected := "ARMEABI_V7A,ARM64_V8A"
7984 if actual != expected {
7985 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7986 }
7987 actual = extractedApex.Args["sdk-version"]
7988 expected = "30"
7989 if actual != expected {
7990 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7991 }
7992
Paul Duffin6717d882021-06-15 19:09:41 +01007993 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007994 a := m.Module().(*ApexSet)
7995 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07007996 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007997 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
7998 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
7999 }
8000}
8001
Jiyong Park7d95a512020-05-10 15:16:24 +09008002func TestNoStaticLinkingToStubsLib(t *testing.T) {
8003 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8004 apex {
8005 name: "myapex",
8006 key: "myapex.key",
8007 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008008 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008009 }
8010
8011 apex_key {
8012 name: "myapex.key",
8013 public_key: "testkey.avbpubkey",
8014 private_key: "testkey.pem",
8015 }
8016
8017 cc_library {
8018 name: "mylib",
8019 srcs: ["mylib.cpp"],
8020 static_libs: ["otherlib"],
8021 system_shared_libs: [],
8022 stl: "none",
8023 apex_available: [ "myapex" ],
8024 }
8025
8026 cc_library {
8027 name: "otherlib",
8028 srcs: ["mylib.cpp"],
8029 system_shared_libs: [],
8030 stl: "none",
8031 stubs: {
8032 versions: ["1", "2", "3"],
8033 },
8034 apex_available: [ "myapex" ],
8035 }
8036 `)
8037}
8038
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008039func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008040 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008041 apex {
8042 name: "myapex",
8043 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008044 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008045 custom_sign_tool: "sign_myapex",
8046 }
8047
8048 apex_key {
8049 name: "myapex.key",
8050 public_key: "testkey.avbpubkey",
8051 private_key: "testkey.pem",
8052 }
8053 `)
8054
8055 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8056 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8057 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"`)
8058}
8059
8060func TestApexKeysTxtOverrides(t *testing.T) {
8061 ctx := testApex(t, `
8062 apex {
8063 name: "myapex",
8064 key: "myapex.key",
8065 updatable: false,
8066 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008067 }
8068
8069 apex_key {
8070 name: "myapex.key",
8071 public_key: "testkey.avbpubkey",
8072 private_key: "testkey.pem",
8073 }
8074
8075 prebuilt_apex {
8076 name: "myapex",
8077 prefer: true,
8078 arch: {
8079 arm64: {
8080 src: "myapex-arm64.apex",
8081 },
8082 arm: {
8083 src: "myapex-arm.apex",
8084 },
8085 },
8086 }
8087
8088 apex_set {
8089 name: "myapex_set",
8090 set: "myapex.apks",
8091 filename: "myapex_set.apex",
8092 overrides: ["myapex"],
8093 }
8094 `)
8095
8096 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8097 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8098 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 +09008099 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 +09008100}
8101
Jooyung Han938b5932020-06-20 12:47:47 +09008102func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008103 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008104 apex {
8105 name: "myapex",
8106 key: "myapex.key",
8107 apps: ["app"],
8108 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008109 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008110 }
8111
8112 apex_key {
8113 name: "myapex.key",
8114 public_key: "testkey.avbpubkey",
8115 private_key: "testkey.pem",
8116 }
8117
8118 android_app {
8119 name: "app",
8120 srcs: ["foo/bar/MyClass.java"],
8121 package_name: "foo",
8122 sdk_version: "none",
8123 system_modules: "none",
8124 apex_available: [ "myapex" ],
8125 }
8126 `, withFiles(map[string][]byte{
8127 "sub/Android.bp": []byte(`
8128 override_apex {
8129 name: "override_myapex",
8130 base: "myapex",
8131 apps: ["override_app"],
8132 allowed_files: ":allowed",
8133 }
8134 // Overridable "path" property should be referenced indirectly
8135 filegroup {
8136 name: "allowed",
8137 srcs: ["allowed.txt"],
8138 }
8139 override_android_app {
8140 name: "override_app",
8141 base: "app",
8142 package_name: "bar",
8143 }
8144 `),
8145 }))
8146
8147 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8148 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8149 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8150 }
8151
8152 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8153 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8154 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8155 }
8156}
8157
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008158func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008159 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008160 apex {
8161 name: "myapex",
8162 key: "myapex.key",
8163 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008164 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008165 }
8166
8167 apex_key {
8168 name: "myapex.key",
8169 public_key: "testkey.avbpubkey",
8170 private_key: "testkey.pem",
8171 }
8172
8173 cc_library {
8174 name: "mylib",
8175 srcs: ["mylib.cpp"],
8176 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008177 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008178 },
8179 apex_available: ["myapex"],
8180 }
8181
8182 cc_prebuilt_library_shared {
8183 name: "mylib",
8184 prefer: false,
8185 srcs: ["prebuilt.so"],
8186 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008187 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008188 },
8189 apex_available: ["myapex"],
8190 }
8191 `)
8192}
8193
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008194func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008195 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008196 apex {
8197 name: "myapex",
8198 key: "myapex.key",
8199 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008200 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008201 }
8202 apex_key {
8203 name: "myapex.key",
8204 public_key: "testkey.avbpubkey",
8205 private_key: "testkey.pem",
8206 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008207 `,
8208 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8209 variables.CompressedApex = proptools.BoolPtr(true)
8210 }),
8211 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008212
8213 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8214 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8215
8216 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8217 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8218
8219 // Make sure output of bundle is .capex
8220 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8221 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8222
8223 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008224 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008225 var builder strings.Builder
8226 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8227 androidMk := builder.String()
8228 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8229}
8230
Martin Stjernholm2856c662020-12-02 15:03:42 +00008231func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008232 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008233 apex {
8234 name: "myapex",
8235 key: "myapex.key",
8236 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008237 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008238 }
8239
8240 apex_key {
8241 name: "myapex.key",
8242 public_key: "testkey.avbpubkey",
8243 private_key: "testkey.pem",
8244 }
8245
8246 cc_library {
8247 name: "mylib",
8248 srcs: ["mylib.cpp"],
8249 apex_available: ["myapex"],
8250 shared_libs: ["otherlib"],
8251 system_shared_libs: [],
8252 }
8253
8254 cc_library {
8255 name: "otherlib",
8256 srcs: ["mylib.cpp"],
8257 stubs: {
8258 versions: ["current"],
8259 },
8260 }
8261
8262 cc_prebuilt_library_shared {
8263 name: "otherlib",
8264 prefer: true,
8265 srcs: ["prebuilt.so"],
8266 stubs: {
8267 versions: ["current"],
8268 },
8269 }
8270 `)
8271
8272 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008273 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008274 var builder strings.Builder
8275 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8276 androidMk := builder.String()
8277
8278 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8279 // a thing there.
8280 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8281}
8282
Jiyong Parke3867542020-12-03 17:28:25 +09008283func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008284 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008285 apex {
8286 name: "myapex",
8287 key: "myapex.key",
8288 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008289 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008290 }
8291
8292 apex_key {
8293 name: "myapex.key",
8294 public_key: "testkey.avbpubkey",
8295 private_key: "testkey.pem",
8296 }
8297
8298 cc_library {
8299 name: "mylib",
8300 srcs: ["mylib.cpp"],
8301 system_shared_libs: [],
8302 stl: "none",
8303 apex_available: ["myapex"],
8304 shared_libs: ["mylib2"],
8305 target: {
8306 apex: {
8307 exclude_shared_libs: ["mylib2"],
8308 },
8309 },
8310 }
8311
8312 cc_library {
8313 name: "mylib2",
8314 srcs: ["mylib.cpp"],
8315 system_shared_libs: [],
8316 stl: "none",
8317 }
8318 `)
8319
8320 // Check if mylib is linked to mylib2 for the non-apex target
8321 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8322 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8323
8324 // Make sure that the link doesn't occur for the apex target
8325 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8326 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8327
8328 // It shouldn't appear in the copy cmd as well.
8329 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8330 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8331}
8332
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008333func TestPrebuiltStubLibDep(t *testing.T) {
8334 bpBase := `
8335 apex {
8336 name: "myapex",
8337 key: "myapex.key",
8338 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008339 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008340 }
8341 apex_key {
8342 name: "myapex.key",
8343 public_key: "testkey.avbpubkey",
8344 private_key: "testkey.pem",
8345 }
8346 cc_library {
8347 name: "mylib",
8348 srcs: ["mylib.cpp"],
8349 apex_available: ["myapex"],
8350 shared_libs: ["stublib"],
8351 system_shared_libs: [],
8352 }
8353 apex {
8354 name: "otherapex",
8355 enabled: %s,
8356 key: "myapex.key",
8357 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008358 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008359 }
8360 `
8361
8362 stublibSourceBp := `
8363 cc_library {
8364 name: "stublib",
8365 srcs: ["mylib.cpp"],
8366 apex_available: ["otherapex"],
8367 system_shared_libs: [],
8368 stl: "none",
8369 stubs: {
8370 versions: ["1"],
8371 },
8372 }
8373 `
8374
8375 stublibPrebuiltBp := `
8376 cc_prebuilt_library_shared {
8377 name: "stublib",
8378 srcs: ["prebuilt.so"],
8379 apex_available: ["otherapex"],
8380 stubs: {
8381 versions: ["1"],
8382 },
8383 %s
8384 }
8385 `
8386
8387 tests := []struct {
8388 name string
8389 stublibBp string
8390 usePrebuilt bool
8391 modNames []string // Modules to collect AndroidMkEntries for
8392 otherApexEnabled []string
8393 }{
8394 {
8395 name: "only_source",
8396 stublibBp: stublibSourceBp,
8397 usePrebuilt: false,
8398 modNames: []string{"stublib"},
8399 otherApexEnabled: []string{"true", "false"},
8400 },
8401 {
8402 name: "source_preferred",
8403 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8404 usePrebuilt: false,
8405 modNames: []string{"stublib", "prebuilt_stublib"},
8406 otherApexEnabled: []string{"true", "false"},
8407 },
8408 {
8409 name: "prebuilt_preferred",
8410 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8411 usePrebuilt: true,
8412 modNames: []string{"stublib", "prebuilt_stublib"},
8413 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8414 },
8415 {
8416 name: "only_prebuilt",
8417 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8418 usePrebuilt: true,
8419 modNames: []string{"stublib"},
8420 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8421 },
8422 }
8423
8424 for _, test := range tests {
8425 t.Run(test.name, func(t *testing.T) {
8426 for _, otherApexEnabled := range test.otherApexEnabled {
8427 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008428 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008429
8430 type modAndMkEntries struct {
8431 mod *cc.Module
8432 mkEntries android.AndroidMkEntries
8433 }
8434 entries := []*modAndMkEntries{}
8435
8436 // Gather shared lib modules that are installable
8437 for _, modName := range test.modNames {
8438 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8439 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8440 continue
8441 }
8442 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008443 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008444 continue
8445 }
Colin Crossaa255532020-07-03 13:18:24 -07008446 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008447 if ent.Disabled {
8448 continue
8449 }
8450 entries = append(entries, &modAndMkEntries{
8451 mod: mod,
8452 mkEntries: ent,
8453 })
8454 }
8455 }
8456 }
8457
8458 var entry *modAndMkEntries = nil
8459 for _, ent := range entries {
8460 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8461 if entry != nil {
8462 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8463 } else {
8464 entry = ent
8465 }
8466 }
8467 }
8468
8469 if entry == nil {
8470 t.Errorf("AndroidMk entry for \"stublib\" missing")
8471 } else {
8472 isPrebuilt := entry.mod.Prebuilt() != nil
8473 if isPrebuilt != test.usePrebuilt {
8474 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8475 }
8476 if !entry.mod.IsStubs() {
8477 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8478 }
8479 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8480 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8481 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008482 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008483 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008484 if !android.InList(expected, cflags) {
8485 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8486 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008487 }
8488 })
8489 }
8490 })
8491 }
8492}
8493
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008494func TestHostApexInHostOnlyBuild(t *testing.T) {
8495 testApex(t, `
8496 apex {
8497 name: "myapex",
8498 host_supported: true,
8499 key: "myapex.key",
8500 updatable: false,
8501 payload_type: "zip",
8502 }
8503 apex_key {
8504 name: "myapex.key",
8505 public_key: "testkey.avbpubkey",
8506 private_key: "testkey.pem",
8507 }
8508 `,
8509 android.FixtureModifyConfig(func(config android.Config) {
8510 // We may not have device targets in all builds, e.g. in
8511 // prebuilts/build-tools/build-prebuilts.sh
8512 config.Targets[android.Android] = []android.Target{}
8513 }))
8514}
8515
Colin Crossc33e5212021-05-25 18:16:02 -07008516func TestApexJavaCoverage(t *testing.T) {
8517 bp := `
8518 apex {
8519 name: "myapex",
8520 key: "myapex.key",
8521 java_libs: ["mylib"],
8522 bootclasspath_fragments: ["mybootclasspathfragment"],
8523 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8524 updatable: false,
8525 }
8526
8527 apex_key {
8528 name: "myapex.key",
8529 public_key: "testkey.avbpubkey",
8530 private_key: "testkey.pem",
8531 }
8532
8533 java_library {
8534 name: "mylib",
8535 srcs: ["mylib.java"],
8536 apex_available: ["myapex"],
8537 compile_dex: true,
8538 }
8539
8540 bootclasspath_fragment {
8541 name: "mybootclasspathfragment",
8542 contents: ["mybootclasspathlib"],
8543 apex_available: ["myapex"],
8544 }
8545
8546 java_library {
8547 name: "mybootclasspathlib",
8548 srcs: ["mybootclasspathlib.java"],
8549 apex_available: ["myapex"],
8550 compile_dex: true,
8551 }
8552
8553 systemserverclasspath_fragment {
8554 name: "mysystemserverclasspathfragment",
8555 contents: ["mysystemserverclasspathlib"],
8556 apex_available: ["myapex"],
8557 }
8558
8559 java_library {
8560 name: "mysystemserverclasspathlib",
8561 srcs: ["mysystemserverclasspathlib.java"],
8562 apex_available: ["myapex"],
8563 compile_dex: true,
8564 }
8565 `
8566
8567 result := android.GroupFixturePreparers(
8568 PrepareForTestWithApexBuildComponents,
8569 prepareForTestWithMyapex,
8570 java.PrepareForTestWithJavaDefaultModules,
8571 android.PrepareForTestWithAndroidBuildComponents,
8572 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008573 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8574 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008575 android.FixtureMergeEnv(map[string]string{
8576 "EMMA_INSTRUMENT": "true",
8577 }),
8578 ).RunTest(t)
8579
8580 // Make sure jacoco ran on both mylib and mybootclasspathlib
8581 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8582 t.Errorf("Failed to find jacoco rule for mylib")
8583 }
8584 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8585 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8586 }
8587 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8588 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8589 }
8590}
8591
Jiyong Park192600a2021-08-03 07:52:17 +00008592func TestProhibitStaticExecutable(t *testing.T) {
8593 testApexError(t, `executable mybin is static`, `
8594 apex {
8595 name: "myapex",
8596 key: "myapex.key",
8597 binaries: ["mybin"],
8598 min_sdk_version: "29",
8599 }
8600
8601 apex_key {
8602 name: "myapex.key",
8603 public_key: "testkey.avbpubkey",
8604 private_key: "testkey.pem",
8605 }
8606
8607 cc_binary {
8608 name: "mybin",
8609 srcs: ["mylib.cpp"],
8610 relative_install_path: "foo/bar",
8611 static_executable: true,
8612 system_shared_libs: [],
8613 stl: "none",
8614 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008615 min_sdk_version: "29",
8616 }
8617 `)
8618
8619 testApexError(t, `executable mybin.rust is static`, `
8620 apex {
8621 name: "myapex",
8622 key: "myapex.key",
8623 binaries: ["mybin.rust"],
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 rust_binary {
8634 name: "mybin.rust",
8635 srcs: ["foo.rs"],
8636 static_executable: true,
8637 apex_available: ["myapex"],
8638 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008639 }
8640 `)
8641}
8642
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008643func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8644 ctx := testApex(t, `
8645 apex {
8646 name: "myapex",
8647 key: "myapex.key",
8648 updatable: false,
8649 java_libs: ["foo"],
8650 }
8651
8652 apex_key {
8653 name: "myapex.key",
8654 public_key: "testkey.avbpubkey",
8655 private_key: "testkey.pem",
8656 }
8657
8658 java_library {
8659 name: "foo",
8660 srcs: ["foo.java"],
8661 apex_available: ["myapex"],
8662 installable: true,
8663 }
8664 `,
8665 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8666 )
8667
8668 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8669 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8670 var builder strings.Builder
8671 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8672 androidMk := builder.String()
8673 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")
8674}
8675
8676func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8677 ctx := testApex(t, `
8678 prebuilt_apex {
8679 name: "myapex",
8680 arch: {
8681 arm64: {
8682 src: "myapex-arm64.apex",
8683 },
8684 arm: {
8685 src: "myapex-arm.apex",
8686 },
8687 },
8688 exported_java_libs: ["foo"],
8689 }
8690
8691 java_import {
8692 name: "foo",
8693 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008694 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008695 }
8696 `,
8697 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8698 )
8699
8700 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8701 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8702 mainModuleEntries := entriesList[0]
8703 android.AssertArrayString(t,
8704 "LOCAL_REQUIRED_MODULES",
8705 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8706 []string{
8707 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8708 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8709 })
8710}
8711
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008712func TestAndroidMk_RequiredModules(t *testing.T) {
8713 ctx := testApex(t, `
8714 apex {
8715 name: "myapex",
8716 key: "myapex.key",
8717 updatable: false,
8718 java_libs: ["foo"],
8719 required: ["otherapex"],
8720 }
8721
8722 apex {
8723 name: "otherapex",
8724 key: "myapex.key",
8725 updatable: false,
8726 java_libs: ["foo"],
8727 required: ["otherapex"],
8728 }
8729
8730 apex_key {
8731 name: "myapex.key",
8732 public_key: "testkey.avbpubkey",
8733 private_key: "testkey.pem",
8734 }
8735
8736 java_library {
8737 name: "foo",
8738 srcs: ["foo.java"],
8739 apex_available: ["myapex", "otherapex"],
8740 installable: true,
8741 }
8742 `)
8743
8744 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8745 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8746 var builder strings.Builder
8747 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8748 androidMk := builder.String()
8749 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
8750}
8751
Jiakai Zhangd70dff72022-02-24 15:06:05 +00008752func TestAndroidMk_RequiredDeps(t *testing.T) {
8753 ctx := testApex(t, `
8754 apex {
8755 name: "myapex",
8756 key: "myapex.key",
8757 updatable: false,
8758 }
8759
8760 apex_key {
8761 name: "myapex.key",
8762 public_key: "testkey.avbpubkey",
8763 private_key: "testkey.pem",
8764 }
8765 `)
8766
8767 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8768 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
8769 data := android.AndroidMkDataForTest(t, ctx, bundle)
8770 var builder strings.Builder
8771 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
8772 androidMk := builder.String()
8773 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
8774
8775 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
8776 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
8777 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
8778 var flattenedBuilder strings.Builder
8779 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
8780 flattenedAndroidMk := flattenedBuilder.String()
8781 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
8782}
8783
Jooyung Hana6d36672022-02-24 13:58:07 +09008784func TestApexOutputFileProducer(t *testing.T) {
8785 for _, tc := range []struct {
8786 name string
8787 ref string
8788 expected_data []string
8789 }{
8790 {
8791 name: "test_using_output",
8792 ref: ":myapex",
8793 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
8794 },
8795 {
8796 name: "test_using_apex",
8797 ref: ":myapex{.apex}",
8798 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
8799 },
8800 } {
8801 t.Run(tc.name, func(t *testing.T) {
8802 ctx := testApex(t, `
8803 apex {
8804 name: "myapex",
8805 key: "myapex.key",
8806 compressible: true,
8807 updatable: false,
8808 }
8809
8810 apex_key {
8811 name: "myapex.key",
8812 public_key: "testkey.avbpubkey",
8813 private_key: "testkey.pem",
8814 }
8815
8816 java_test {
8817 name: "`+tc.name+`",
8818 srcs: ["a.java"],
8819 data: ["`+tc.ref+`"],
8820 }
8821 `,
8822 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8823 variables.CompressedApex = proptools.BoolPtr(true)
8824 }))
8825 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
8826 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
8827 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
8828 })
8829 }
8830}
8831
satayev758968a2021-12-06 11:42:40 +00008832func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
8833 preparer := android.GroupFixturePreparers(
8834 PrepareForTestWithApexBuildComponents,
8835 prepareForTestWithMyapex,
8836 java.PrepareForTestWithJavaSdkLibraryFiles,
8837 java.PrepareForTestWithJavaDefaultModules,
8838 android.PrepareForTestWithAndroidBuildComponents,
8839 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8840 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
8841 )
8842
8843 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
8844 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8845 preparer.RunTestWithBp(t, `
8846 apex {
8847 name: "myapex",
8848 key: "myapex.key",
8849 bootclasspath_fragments: ["mybootclasspathfragment"],
8850 min_sdk_version: "30",
8851 updatable: false,
8852 }
8853
8854 apex_key {
8855 name: "myapex.key",
8856 public_key: "testkey.avbpubkey",
8857 private_key: "testkey.pem",
8858 }
8859
8860 bootclasspath_fragment {
8861 name: "mybootclasspathfragment",
8862 contents: ["mybootclasspathlib"],
8863 apex_available: ["myapex"],
8864 }
8865
8866 java_sdk_library {
8867 name: "mybootclasspathlib",
8868 srcs: ["mybootclasspathlib.java"],
8869 apex_available: ["myapex"],
8870 compile_dex: true,
8871 unsafe_ignore_missing_latest_api: true,
8872 min_sdk_version: "31",
8873 static_libs: ["util"],
8874 }
8875
8876 java_library {
8877 name: "util",
8878 srcs: ["a.java"],
8879 apex_available: ["myapex"],
8880 min_sdk_version: "31",
8881 static_libs: ["another_util"],
8882 }
8883
8884 java_library {
8885 name: "another_util",
8886 srcs: ["a.java"],
8887 min_sdk_version: "31",
8888 apex_available: ["myapex"],
8889 }
8890 `)
8891 })
8892
8893 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
8894 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8895 preparer.RunTestWithBp(t, `
8896 apex {
8897 name: "myapex",
8898 key: "myapex.key",
8899 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8900 min_sdk_version: "30",
8901 updatable: false,
8902 }
8903
8904 apex_key {
8905 name: "myapex.key",
8906 public_key: "testkey.avbpubkey",
8907 private_key: "testkey.pem",
8908 }
8909
8910 systemserverclasspath_fragment {
8911 name: "mysystemserverclasspathfragment",
8912 contents: ["mysystemserverclasspathlib"],
8913 apex_available: ["myapex"],
8914 }
8915
8916 java_sdk_library {
8917 name: "mysystemserverclasspathlib",
8918 srcs: ["mysystemserverclasspathlib.java"],
8919 apex_available: ["myapex"],
8920 compile_dex: true,
8921 min_sdk_version: "32",
8922 unsafe_ignore_missing_latest_api: true,
8923 static_libs: ["util"],
8924 }
8925
8926 java_library {
8927 name: "util",
8928 srcs: ["a.java"],
8929 apex_available: ["myapex"],
8930 min_sdk_version: "31",
8931 static_libs: ["another_util"],
8932 }
8933
8934 java_library {
8935 name: "another_util",
8936 srcs: ["a.java"],
8937 min_sdk_version: "31",
8938 apex_available: ["myapex"],
8939 }
8940 `)
8941 })
8942
8943 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8944 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
8945 RunTestWithBp(t, `
8946 apex {
8947 name: "myapex",
8948 key: "myapex.key",
8949 bootclasspath_fragments: ["mybootclasspathfragment"],
8950 min_sdk_version: "30",
8951 updatable: false,
8952 }
8953
8954 apex_key {
8955 name: "myapex.key",
8956 public_key: "testkey.avbpubkey",
8957 private_key: "testkey.pem",
8958 }
8959
8960 bootclasspath_fragment {
8961 name: "mybootclasspathfragment",
8962 contents: ["mybootclasspathlib"],
8963 apex_available: ["myapex"],
8964 }
8965
8966 java_sdk_library {
8967 name: "mybootclasspathlib",
8968 srcs: ["mybootclasspathlib.java"],
8969 apex_available: ["myapex"],
8970 compile_dex: true,
8971 unsafe_ignore_missing_latest_api: true,
8972 }
8973 `)
8974 })
8975
8976 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8977 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
8978 RunTestWithBp(t, `
8979 apex {
8980 name: "myapex",
8981 key: "myapex.key",
8982 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8983 min_sdk_version: "30",
8984 updatable: false,
8985 }
8986
8987 apex_key {
8988 name: "myapex.key",
8989 public_key: "testkey.avbpubkey",
8990 private_key: "testkey.pem",
8991 }
8992
8993 systemserverclasspath_fragment {
8994 name: "mysystemserverclasspathfragment",
8995 contents: ["mysystemserverclasspathlib"],
8996 apex_available: ["myapex"],
8997 }
8998
8999 java_sdk_library {
9000 name: "mysystemserverclasspathlib",
9001 srcs: ["mysystemserverclasspathlib.java"],
9002 apex_available: ["myapex"],
9003 compile_dex: true,
9004 unsafe_ignore_missing_latest_api: true,
9005 }
9006 `)
9007 })
9008}
9009
Jiakai Zhang6decef92022-01-12 17:56:19 +00009010// Verifies that the APEX depends on all the Make modules in the list.
9011func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9012 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9013 for _, dep := range deps {
9014 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9015 }
9016}
9017
9018// Verifies that the APEX does not depend on any of the Make modules in the list.
9019func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9020 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9021 for _, dep := range deps {
9022 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9023 }
9024}
9025
Spandan Das66773252022-01-15 00:23:18 +00009026func TestApexStrictUpdtabilityLint(t *testing.T) {
9027 bpTemplate := `
9028 apex {
9029 name: "myapex",
9030 key: "myapex.key",
9031 java_libs: ["myjavalib"],
9032 updatable: %v,
9033 min_sdk_version: "29",
9034 }
9035 apex_key {
9036 name: "myapex.key",
9037 }
9038 java_library {
9039 name: "myjavalib",
9040 srcs: ["MyClass.java"],
9041 apex_available: [ "myapex" ],
9042 lint: {
9043 strict_updatability_linting: %v,
9044 },
9045 sdk_version: "current",
9046 min_sdk_version: "29",
9047 }
9048 `
9049 fs := android.MockFS{
9050 "lint-baseline.xml": nil,
9051 }
9052
9053 testCases := []struct {
9054 testCaseName string
9055 apexUpdatable bool
9056 javaStrictUpdtabilityLint bool
9057 lintFileExists bool
9058 disallowedFlagExpected bool
9059 }{
9060 {
9061 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9062 apexUpdatable: true,
9063 javaStrictUpdtabilityLint: true,
9064 lintFileExists: false,
9065 disallowedFlagExpected: false,
9066 },
9067 {
9068 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9069 apexUpdatable: false,
9070 javaStrictUpdtabilityLint: false,
9071 lintFileExists: true,
9072 disallowedFlagExpected: false,
9073 },
9074 {
9075 testCaseName: "non-updatable apex respects strict updatability of javalib",
9076 apexUpdatable: false,
9077 javaStrictUpdtabilityLint: true,
9078 lintFileExists: true,
9079 disallowedFlagExpected: true,
9080 },
9081 {
9082 testCaseName: "updatable apex sets strict updatability of javalib to true",
9083 apexUpdatable: true,
9084 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9085 lintFileExists: true,
9086 disallowedFlagExpected: true,
9087 },
9088 }
9089
9090 for _, testCase := range testCases {
9091 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9092 fixtures := []android.FixturePreparer{}
9093 if testCase.lintFileExists {
9094 fixtures = append(fixtures, fs.AddToFixture())
9095 }
9096
9097 result := testApex(t, bp, fixtures...)
9098 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9099 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9100 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9101
9102 if disallowedFlagActual != testCase.disallowedFlagExpected {
9103 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9104 }
9105 }
9106}
9107
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009108func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9109 bp := `
9110 apex {
9111 name: "myapex",
9112 key: "myapex.key",
9113 java_libs: ["myjavalib"],
9114 updatable: true,
9115 min_sdk_version: "29",
9116 }
9117 apex_key {
9118 name: "myapex.key",
9119 }
9120 java_library {
9121 name: "myjavalib",
9122 srcs: ["MyClass.java"],
9123 apex_available: [ "myapex" ],
9124 sdk_version: "current",
9125 min_sdk_version: "29",
9126 }
9127 `
9128
9129 testCases := []struct {
9130 testCaseName string
9131 moduleDirectory string
9132 disallowedFlagExpected bool
9133 }{
9134 {
9135 testCaseName: "lintable module defined outside libcore",
9136 moduleDirectory: "",
9137 disallowedFlagExpected: true,
9138 },
9139 {
9140 testCaseName: "lintable module defined in libcore root directory",
9141 moduleDirectory: "libcore/",
9142 disallowedFlagExpected: false,
9143 },
9144 {
9145 testCaseName: "lintable module defined in libcore child directory",
9146 moduleDirectory: "libcore/childdir/",
9147 disallowedFlagExpected: true,
9148 },
9149 }
9150
9151 for _, testCase := range testCases {
9152 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9153 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9154 result := testApex(t, "", lintFileCreator, bpFileCreator)
9155 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9156 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9157 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9158 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9159
9160 if disallowedFlagActual != testCase.disallowedFlagExpected {
9161 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9162 }
9163 }
9164}
9165
Spandan Das66773252022-01-15 00:23:18 +00009166// checks transtive deps of an apex coming from bootclasspath_fragment
9167func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9168 bp := `
9169 apex {
9170 name: "myapex",
9171 key: "myapex.key",
9172 bootclasspath_fragments: ["mybootclasspathfragment"],
9173 updatable: true,
9174 min_sdk_version: "29",
9175 }
9176 apex_key {
9177 name: "myapex.key",
9178 }
9179 bootclasspath_fragment {
9180 name: "mybootclasspathfragment",
9181 contents: ["myjavalib"],
9182 apex_available: ["myapex"],
9183 }
9184 java_library {
9185 name: "myjavalib",
9186 srcs: ["MyClass.java"],
9187 apex_available: [ "myapex" ],
9188 sdk_version: "current",
9189 min_sdk_version: "29",
9190 compile_dex: true,
9191 }
9192 `
9193 fs := android.MockFS{
9194 "lint-baseline.xml": nil,
9195 }
9196
9197 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9198 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9199 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9200 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9201 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9202 }
9203}
9204
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009205func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009206 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009207}