blob: ec815c4c73c74073807ada5975f2cbb24251a7e4 [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{
3892 android.Android: []android.Target{
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
Paul Duffin6717d882021-06-15 19:09:41 +01004573 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004574
Jiyong Parkc95714e2019-03-29 14:23:10 +09004575 expectedInput := "myapex-arm64.apex"
4576 if prebuilt.inputApex.String() != expectedInput {
4577 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4578 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004579}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004580
Paul Duffinc0609c62021-03-01 17:27:16 +00004581func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004582 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004583 prebuilt_apex {
4584 name: "myapex",
4585 }
4586 `)
4587}
4588
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004589func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004590 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004591 prebuilt_apex {
4592 name: "myapex",
4593 src: "myapex-arm.apex",
4594 filename: "notmyapex.apex",
4595 }
4596 `)
4597
Paul Duffin6717d882021-06-15 19:09:41 +01004598 p := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004599
4600 expected := "notmyapex.apex"
4601 if p.installFilename != expected {
4602 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4603 }
4604}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004605
Samiul Islam7c02e262021-09-08 17:48:28 +01004606func TestApexSetFilenameOverride(t *testing.T) {
4607 testApex(t, `
4608 apex_set {
4609 name: "com.company.android.myapex",
4610 apex_name: "com.android.myapex",
4611 set: "company-myapex.apks",
4612 filename: "com.company.android.myapex.apex"
4613 }
4614 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4615
4616 testApex(t, `
4617 apex_set {
4618 name: "com.company.android.myapex",
4619 apex_name: "com.android.myapex",
4620 set: "company-myapex.apks",
4621 filename: "com.company.android.myapex.capex"
4622 }
4623 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4624
4625 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4626 apex_set {
4627 name: "com.company.android.myapex",
4628 apex_name: "com.android.myapex",
4629 set: "company-myapex.apks",
4630 filename: "some-random-suffix"
4631 }
4632 `)
4633}
4634
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004635func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004636 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004637 prebuilt_apex {
4638 name: "myapex.prebuilt",
4639 src: "myapex-arm.apex",
4640 overrides: [
4641 "myapex",
4642 ],
4643 }
4644 `)
4645
Paul Duffin6717d882021-06-15 19:09:41 +01004646 p := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt").Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004647
4648 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004649 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004650 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004651 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004652 }
4653}
4654
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004655func TestPrebuiltApexName(t *testing.T) {
4656 testApex(t, `
4657 prebuilt_apex {
4658 name: "com.company.android.myapex",
4659 apex_name: "com.android.myapex",
4660 src: "company-myapex-arm.apex",
4661 }
4662 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4663
4664 testApex(t, `
4665 apex_set {
4666 name: "com.company.android.myapex",
4667 apex_name: "com.android.myapex",
4668 set: "company-myapex.apks",
4669 }
4670 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4671}
4672
4673func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4674 _ = android.GroupFixturePreparers(
4675 java.PrepareForTestWithJavaDefaultModules,
4676 PrepareForTestWithApexBuildComponents,
4677 android.FixtureWithRootAndroidBp(`
4678 platform_bootclasspath {
4679 name: "platform-bootclasspath",
4680 fragments: [
4681 {
4682 apex: "com.android.art",
4683 module: "art-bootclasspath-fragment",
4684 },
4685 ],
4686 }
4687
4688 prebuilt_apex {
4689 name: "com.company.android.art",
4690 apex_name: "com.android.art",
4691 src: "com.company.android.art-arm.apex",
4692 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4693 }
4694
4695 prebuilt_bootclasspath_fragment {
4696 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004697 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004698 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004699 hidden_api: {
4700 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4701 metadata: "my-bootclasspath-fragment/metadata.csv",
4702 index: "my-bootclasspath-fragment/index.csv",
4703 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4704 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4705 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004706 }
4707
4708 java_import {
4709 name: "core-oj",
4710 jars: ["prebuilt.jar"],
4711 }
4712 `),
4713 ).RunTest(t)
4714}
4715
Paul Duffin092153d2021-01-26 11:42:39 +00004716// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4717// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004718func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004719 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004720
Paul Duffin89886cb2021-02-05 16:44:03 +00004721 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004722 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004723 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004724 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004725 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004726 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004727 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4728 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4729 android.NormalizePathForTesting(dexJarBuildPath))
4730 }
4731
4732 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004733 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004734 // Make sure the import has been given the correct path to the dex jar.
4735 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4736 dexJarBuildPath := p.DexJarInstallPath()
4737 stem := android.RemoveOptionalPrebuiltPrefix(name)
4738 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4739 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4740 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004741 }
4742
Paul Duffin39853512021-02-26 11:09:39 +00004743 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004744 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004745 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004746 android.AssertArrayString(t, "Check if there is no source variant",
4747 []string{"android_common"},
4748 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004749 }
4750
4751 t.Run("prebuilt only", func(t *testing.T) {
4752 bp := `
4753 prebuilt_apex {
4754 name: "myapex",
4755 arch: {
4756 arm64: {
4757 src: "myapex-arm64.apex",
4758 },
4759 arm: {
4760 src: "myapex-arm.apex",
4761 },
4762 },
Paul Duffin39853512021-02-26 11:09:39 +00004763 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004764 }
4765
4766 java_import {
4767 name: "libfoo",
4768 jars: ["libfoo.jar"],
4769 }
Paul Duffin39853512021-02-26 11:09:39 +00004770
4771 java_sdk_library_import {
4772 name: "libbar",
4773 public: {
4774 jars: ["libbar.jar"],
4775 },
4776 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004777 `
4778
4779 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4780 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4781
Martin Stjernholm44825602021-09-17 01:44:12 +01004782 deapexerName := deapexerModuleName("myapex")
4783 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4784
Paul Duffinf6932af2021-02-26 18:21:56 +00004785 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004786 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004787 rule := deapexer.Rule("deapexer")
4788 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4789 t.Errorf("expected: %q, found: %q", expected, actual)
4790 }
4791
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004792 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004793 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004794 rule = prebuiltApex.Rule("android/soong/android.Cp")
4795 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4796 t.Errorf("expected: %q, found: %q", expected, actual)
4797 }
4798
Paul Duffin89886cb2021-02-05 16:44:03 +00004799 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004800 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004801
4802 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004803 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004804 })
4805
4806 t.Run("prebuilt with source preferred", func(t *testing.T) {
4807
4808 bp := `
4809 prebuilt_apex {
4810 name: "myapex",
4811 arch: {
4812 arm64: {
4813 src: "myapex-arm64.apex",
4814 },
4815 arm: {
4816 src: "myapex-arm.apex",
4817 },
4818 },
Paul Duffin39853512021-02-26 11:09:39 +00004819 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004820 }
4821
4822 java_import {
4823 name: "libfoo",
4824 jars: ["libfoo.jar"],
4825 }
4826
4827 java_library {
4828 name: "libfoo",
4829 }
Paul Duffin39853512021-02-26 11:09:39 +00004830
4831 java_sdk_library_import {
4832 name: "libbar",
4833 public: {
4834 jars: ["libbar.jar"],
4835 },
4836 }
4837
4838 java_sdk_library {
4839 name: "libbar",
4840 srcs: ["foo/bar/MyClass.java"],
4841 unsafe_ignore_missing_latest_api: true,
4842 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004843 `
4844
4845 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4846 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4847
Paul Duffin89886cb2021-02-05 16:44:03 +00004848 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004849 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004850 ensureNoSourceVariant(t, ctx, "libfoo")
4851
4852 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004853 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004854 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004855 })
4856
4857 t.Run("prebuilt preferred with source", func(t *testing.T) {
4858 bp := `
4859 prebuilt_apex {
4860 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004861 arch: {
4862 arm64: {
4863 src: "myapex-arm64.apex",
4864 },
4865 arm: {
4866 src: "myapex-arm.apex",
4867 },
4868 },
Paul Duffin39853512021-02-26 11:09:39 +00004869 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004870 }
4871
4872 java_import {
4873 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004874 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004875 jars: ["libfoo.jar"],
4876 }
4877
4878 java_library {
4879 name: "libfoo",
4880 }
Paul Duffin39853512021-02-26 11:09:39 +00004881
4882 java_sdk_library_import {
4883 name: "libbar",
4884 prefer: true,
4885 public: {
4886 jars: ["libbar.jar"],
4887 },
4888 }
4889
4890 java_sdk_library {
4891 name: "libbar",
4892 srcs: ["foo/bar/MyClass.java"],
4893 unsafe_ignore_missing_latest_api: true,
4894 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004895 `
4896
4897 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4898 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4899
Paul Duffin89886cb2021-02-05 16:44:03 +00004900 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004901 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004902 ensureNoSourceVariant(t, ctx, "libfoo")
4903
4904 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004905 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004906 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004907 })
4908}
4909
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004910func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004911 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004912 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004913 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4914 // is disabled.
4915 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4916 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004917
Paul Duffin37856732021-02-26 14:24:15 +00004918 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4919 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004920 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004921 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004922 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004923 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004924 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004925 foundLibfooJar = true
4926 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004927 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004928 }
4929 }
4930 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004931 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 +00004932 }
4933 }
4934
Paul Duffin40a3f652021-07-19 13:11:24 +01004935 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004936 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004937 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004938 var rule android.TestingBuildParams
4939
4940 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4941 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004942 }
4943
Paul Duffin40a3f652021-07-19 13:11:24 +01004944 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4945 t.Helper()
4946 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4947 var rule android.TestingBuildParams
4948
4949 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4950 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4951 }
4952
Paul Duffin89f570a2021-06-16 01:42:33 +01004953 fragment := java.ApexVariantReference{
4954 Apex: proptools.StringPtr("myapex"),
4955 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4956 }
4957
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004958 t.Run("prebuilt only", func(t *testing.T) {
4959 bp := `
4960 prebuilt_apex {
4961 name: "myapex",
4962 arch: {
4963 arm64: {
4964 src: "myapex-arm64.apex",
4965 },
4966 arm: {
4967 src: "myapex-arm.apex",
4968 },
4969 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004970 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4971 }
4972
4973 prebuilt_bootclasspath_fragment {
4974 name: "my-bootclasspath-fragment",
4975 contents: ["libfoo", "libbar"],
4976 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004977 hidden_api: {
4978 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4979 metadata: "my-bootclasspath-fragment/metadata.csv",
4980 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004981 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4982 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4983 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004984 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004985 }
4986
4987 java_import {
4988 name: "libfoo",
4989 jars: ["libfoo.jar"],
4990 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004991 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004992 }
Paul Duffin37856732021-02-26 14:24:15 +00004993
4994 java_sdk_library_import {
4995 name: "libbar",
4996 public: {
4997 jars: ["libbar.jar"],
4998 },
4999 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005000 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005001 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005002 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005003 `
5004
Paul Duffin89f570a2021-06-16 01:42:33 +01005005 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005006 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5007 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005008
Paul Duffin537ea3d2021-05-14 10:38:00 +01005009 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005010 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005011 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005012 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005013 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5014 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005015 })
5016
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005017 t.Run("apex_set only", func(t *testing.T) {
5018 bp := `
5019 apex_set {
5020 name: "myapex",
5021 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005022 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5023 }
5024
5025 prebuilt_bootclasspath_fragment {
5026 name: "my-bootclasspath-fragment",
5027 contents: ["libfoo", "libbar"],
5028 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005029 hidden_api: {
5030 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5031 metadata: "my-bootclasspath-fragment/metadata.csv",
5032 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005033 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5034 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5035 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005036 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005037 }
5038
5039 java_import {
5040 name: "libfoo",
5041 jars: ["libfoo.jar"],
5042 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005043 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005044 }
5045
5046 java_sdk_library_import {
5047 name: "libbar",
5048 public: {
5049 jars: ["libbar.jar"],
5050 },
5051 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005052 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005053 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005054 }
5055 `
5056
Paul Duffin89f570a2021-06-16 01:42:33 +01005057 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005058 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5059 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5060
Paul Duffin537ea3d2021-05-14 10:38:00 +01005061 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005062 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005063 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005064 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005065 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5066 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005067 })
5068
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005069 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5070 bp := `
5071 prebuilt_apex {
5072 name: "myapex",
5073 arch: {
5074 arm64: {
5075 src: "myapex-arm64.apex",
5076 },
5077 arm: {
5078 src: "myapex-arm.apex",
5079 },
5080 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005081 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5082 }
5083
5084 prebuilt_bootclasspath_fragment {
5085 name: "my-bootclasspath-fragment",
5086 contents: ["libfoo", "libbar"],
5087 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005088 hidden_api: {
5089 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5090 metadata: "my-bootclasspath-fragment/metadata.csv",
5091 index: "my-bootclasspath-fragment/index.csv",
5092 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5093 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5094 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005095 }
5096
5097 java_import {
5098 name: "libfoo",
5099 jars: ["libfoo.jar"],
5100 apex_available: ["myapex"],
5101 }
5102
5103 java_library {
5104 name: "libfoo",
5105 srcs: ["foo/bar/MyClass.java"],
5106 apex_available: ["myapex"],
5107 }
Paul Duffin37856732021-02-26 14:24:15 +00005108
5109 java_sdk_library_import {
5110 name: "libbar",
5111 public: {
5112 jars: ["libbar.jar"],
5113 },
5114 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005115 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005116 }
5117
5118 java_sdk_library {
5119 name: "libbar",
5120 srcs: ["foo/bar/MyClass.java"],
5121 unsafe_ignore_missing_latest_api: true,
5122 apex_available: ["myapex"],
5123 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005124 `
5125
5126 // In this test the source (java_library) libfoo is active since the
5127 // prebuilt (java_import) defaults to prefer:false. However the
5128 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5129 // find the dex boot jar in it. We either need to disable the source libfoo
5130 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005131 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005132 // dexbootjar check is skipped if AllowMissingDependencies is true
5133 preparerAllowMissingDeps := android.GroupFixturePreparers(
5134 preparer,
5135 android.PrepareForTestWithAllowMissingDependencies,
5136 )
5137 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005138 })
5139
5140 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5141 bp := `
5142 prebuilt_apex {
5143 name: "myapex",
5144 arch: {
5145 arm64: {
5146 src: "myapex-arm64.apex",
5147 },
5148 arm: {
5149 src: "myapex-arm.apex",
5150 },
5151 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005152 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5153 }
5154
5155 prebuilt_bootclasspath_fragment {
5156 name: "my-bootclasspath-fragment",
5157 contents: ["libfoo", "libbar"],
5158 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005159 hidden_api: {
5160 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5161 metadata: "my-bootclasspath-fragment/metadata.csv",
5162 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005163 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5164 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5165 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005166 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005167 }
5168
5169 java_import {
5170 name: "libfoo",
5171 prefer: true,
5172 jars: ["libfoo.jar"],
5173 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005174 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005175 }
5176
5177 java_library {
5178 name: "libfoo",
5179 srcs: ["foo/bar/MyClass.java"],
5180 apex_available: ["myapex"],
5181 }
Paul Duffin37856732021-02-26 14:24:15 +00005182
5183 java_sdk_library_import {
5184 name: "libbar",
5185 prefer: true,
5186 public: {
5187 jars: ["libbar.jar"],
5188 },
5189 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005190 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005191 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005192 }
5193
5194 java_sdk_library {
5195 name: "libbar",
5196 srcs: ["foo/bar/MyClass.java"],
5197 unsafe_ignore_missing_latest_api: true,
5198 apex_available: ["myapex"],
5199 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005200 `
5201
Paul Duffin89f570a2021-06-16 01:42:33 +01005202 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005203 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5204 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005205
Paul Duffin537ea3d2021-05-14 10:38:00 +01005206 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005207 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005208 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005209 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005210 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5211 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005212 })
5213
5214 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5215 bp := `
5216 apex {
5217 name: "myapex",
5218 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005219 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005220 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005221 }
5222
5223 apex_key {
5224 name: "myapex.key",
5225 public_key: "testkey.avbpubkey",
5226 private_key: "testkey.pem",
5227 }
5228
5229 prebuilt_apex {
5230 name: "myapex",
5231 arch: {
5232 arm64: {
5233 src: "myapex-arm64.apex",
5234 },
5235 arm: {
5236 src: "myapex-arm.apex",
5237 },
5238 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005239 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5240 }
5241
5242 prebuilt_bootclasspath_fragment {
5243 name: "my-bootclasspath-fragment",
5244 contents: ["libfoo", "libbar"],
5245 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005246 hidden_api: {
5247 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5248 metadata: "my-bootclasspath-fragment/metadata.csv",
5249 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005250 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5251 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5252 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005253 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005254 }
5255
5256 java_import {
5257 name: "libfoo",
5258 jars: ["libfoo.jar"],
5259 apex_available: ["myapex"],
5260 }
5261
5262 java_library {
5263 name: "libfoo",
5264 srcs: ["foo/bar/MyClass.java"],
5265 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005266 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005267 }
Paul Duffin37856732021-02-26 14:24:15 +00005268
5269 java_sdk_library_import {
5270 name: "libbar",
5271 public: {
5272 jars: ["libbar.jar"],
5273 },
5274 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005275 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005276 }
5277
5278 java_sdk_library {
5279 name: "libbar",
5280 srcs: ["foo/bar/MyClass.java"],
5281 unsafe_ignore_missing_latest_api: true,
5282 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005283 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005284 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005285 `
5286
Paul Duffin89f570a2021-06-16 01:42:33 +01005287 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005288 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5289 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005290
Paul Duffin537ea3d2021-05-14 10:38:00 +01005291 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005292 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005293 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005294 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005295 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5296 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005297 })
5298
5299 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5300 bp := `
5301 apex {
5302 name: "myapex",
5303 enabled: false,
5304 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005305 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005306 }
5307
5308 apex_key {
5309 name: "myapex.key",
5310 public_key: "testkey.avbpubkey",
5311 private_key: "testkey.pem",
5312 }
5313
5314 prebuilt_apex {
5315 name: "myapex",
5316 arch: {
5317 arm64: {
5318 src: "myapex-arm64.apex",
5319 },
5320 arm: {
5321 src: "myapex-arm.apex",
5322 },
5323 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005324 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5325 }
5326
5327 prebuilt_bootclasspath_fragment {
5328 name: "my-bootclasspath-fragment",
5329 contents: ["libfoo", "libbar"],
5330 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005331 hidden_api: {
5332 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5333 metadata: "my-bootclasspath-fragment/metadata.csv",
5334 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005335 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5336 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5337 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005338 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005339 }
5340
5341 java_import {
5342 name: "libfoo",
5343 prefer: true,
5344 jars: ["libfoo.jar"],
5345 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005346 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005347 }
5348
5349 java_library {
5350 name: "libfoo",
5351 srcs: ["foo/bar/MyClass.java"],
5352 apex_available: ["myapex"],
5353 }
Paul Duffin37856732021-02-26 14:24:15 +00005354
5355 java_sdk_library_import {
5356 name: "libbar",
5357 prefer: true,
5358 public: {
5359 jars: ["libbar.jar"],
5360 },
5361 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005362 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005363 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005364 }
5365
5366 java_sdk_library {
5367 name: "libbar",
5368 srcs: ["foo/bar/MyClass.java"],
5369 unsafe_ignore_missing_latest_api: true,
5370 apex_available: ["myapex"],
5371 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005372 `
5373
Paul Duffin89f570a2021-06-16 01:42:33 +01005374 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005375 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5376 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005377
Paul Duffin537ea3d2021-05-14 10:38:00 +01005378 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005379 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005380 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005381 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005382 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5383 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005384 })
5385}
5386
Roland Levillain630846d2019-06-26 12:48:34 +01005387func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005388 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005389 apex_test {
5390 name: "myapex",
5391 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005392 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005393 tests: [
5394 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005395 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005396 ],
5397 }
5398
5399 apex_key {
5400 name: "myapex.key",
5401 public_key: "testkey.avbpubkey",
5402 private_key: "testkey.pem",
5403 }
5404
Liz Kammer1c14a212020-05-12 15:26:55 -07005405 filegroup {
5406 name: "fg",
5407 srcs: [
5408 "baz",
5409 "bar/baz"
5410 ],
5411 }
5412
Roland Levillain630846d2019-06-26 12:48:34 +01005413 cc_test {
5414 name: "mytest",
5415 gtest: false,
5416 srcs: ["mytest.cpp"],
5417 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005418 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005419 system_shared_libs: [],
5420 static_executable: true,
5421 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005422 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005423 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005424
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005425 cc_library {
5426 name: "mylib",
5427 srcs: ["mylib.cpp"],
5428 system_shared_libs: [],
5429 stl: "none",
5430 }
5431
Liz Kammer5bd365f2020-05-27 15:15:11 -07005432 filegroup {
5433 name: "fg2",
5434 srcs: [
5435 "testdata/baz"
5436 ],
5437 }
5438
Roland Levillain9b5fde92019-06-28 15:41:19 +01005439 cc_test {
5440 name: "mytests",
5441 gtest: false,
5442 srcs: [
5443 "mytest1.cpp",
5444 "mytest2.cpp",
5445 "mytest3.cpp",
5446 ],
5447 test_per_src: true,
5448 relative_install_path: "test",
5449 system_shared_libs: [],
5450 static_executable: true,
5451 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005452 data: [
5453 ":fg",
5454 ":fg2",
5455 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005456 }
Roland Levillain630846d2019-06-26 12:48:34 +01005457 `)
5458
Sundong Ahnabb64432019-10-22 13:58:29 +09005459 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005460 copyCmds := apexRule.Args["copy_commands"]
5461
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005462 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005463 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005464 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005465
Liz Kammer1c14a212020-05-12 15:26:55 -07005466 //Ensure that test data are copied into apex.
5467 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5468 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5469
Roland Levillain9b5fde92019-06-28 15:41:19 +01005470 // Ensure that test deps built with `test_per_src` are copied into apex.
5471 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5472 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5473 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005474
5475 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005476 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005477 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005478 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005479 prefix := "TARGET_"
5480 var builder strings.Builder
5481 data.Custom(&builder, name, prefix, "", data)
5482 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005483 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5484 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5485 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5486 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005487 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005488 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005489 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005490
5491 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005492 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005493 data.Custom(&builder, name, prefix, "", data)
5494 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005495 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5496 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005497}
5498
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005499func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005500 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005501 apex {
5502 name: "myapex",
5503 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005504 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005505 }
5506 apex_key {
5507 name: "myapex.key",
5508 public_key: "testkey.avbpubkey",
5509 private_key: "testkey.pem",
5510 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005511 `,
5512 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5513 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5514 }),
5515 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005516 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005517 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005518 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005519 var builder strings.Builder
5520 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5521 androidMk := builder.String()
5522 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5523}
5524
Jooyung Hand48f3c32019-08-23 11:18:57 +09005525func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5526 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5527 apex {
5528 name: "myapex",
5529 key: "myapex.key",
5530 native_shared_libs: ["libfoo"],
5531 }
5532
5533 apex_key {
5534 name: "myapex.key",
5535 public_key: "testkey.avbpubkey",
5536 private_key: "testkey.pem",
5537 }
5538
5539 cc_library {
5540 name: "libfoo",
5541 stl: "none",
5542 system_shared_libs: [],
5543 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005544 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005545 }
5546 `)
5547 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5548 apex {
5549 name: "myapex",
5550 key: "myapex.key",
5551 java_libs: ["myjar"],
5552 }
5553
5554 apex_key {
5555 name: "myapex.key",
5556 public_key: "testkey.avbpubkey",
5557 private_key: "testkey.pem",
5558 }
5559
5560 java_library {
5561 name: "myjar",
5562 srcs: ["foo/bar/MyClass.java"],
5563 sdk_version: "none",
5564 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005565 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005566 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005567 }
5568 `)
5569}
5570
Bill Peckhama41a6962021-01-11 10:58:54 -08005571func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005572 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005573 apex {
5574 name: "myapex",
5575 key: "myapex.key",
5576 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005577 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005578 }
5579
5580 apex_key {
5581 name: "myapex.key",
5582 public_key: "testkey.avbpubkey",
5583 private_key: "testkey.pem",
5584 }
5585
5586 java_import {
5587 name: "myjavaimport",
5588 apex_available: ["myapex"],
5589 jars: ["my.jar"],
5590 compile_dex: true,
5591 }
5592 `)
5593
5594 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5595 apexRule := module.Rule("apexRule")
5596 copyCmds := apexRule.Args["copy_commands"]
5597 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5598}
5599
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005600func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005601 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005602 apex {
5603 name: "myapex",
5604 key: "myapex.key",
5605 apps: [
5606 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005607 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005608 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005609 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005610 }
5611
5612 apex_key {
5613 name: "myapex.key",
5614 public_key: "testkey.avbpubkey",
5615 private_key: "testkey.pem",
5616 }
5617
5618 android_app {
5619 name: "AppFoo",
5620 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005621 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005622 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005623 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005624 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005625 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005626 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005627
5628 android_app {
5629 name: "AppFooPriv",
5630 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005631 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005632 system_modules: "none",
5633 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005634 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005635 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005636 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005637
5638 cc_library_shared {
5639 name: "libjni",
5640 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005641 shared_libs: ["libfoo"],
5642 stl: "none",
5643 system_shared_libs: [],
5644 apex_available: [ "myapex" ],
5645 sdk_version: "current",
5646 }
5647
5648 cc_library_shared {
5649 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005650 stl: "none",
5651 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005652 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005653 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005654 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005655 `)
5656
Sundong Ahnabb64432019-10-22 13:58:29 +09005657 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005658 apexRule := module.Rule("apexRule")
5659 copyCmds := apexRule.Args["copy_commands"]
5660
5661 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005662 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005663
Colin Crossaede88c2020-08-11 12:17:01 -07005664 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005665 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005666 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005667 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005668 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005669 // JNI libraries including transitive deps are
5670 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005671 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005672 // ... embedded inside APK (jnilibs.zip)
5673 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5674 // ... and not directly inside the APEX
5675 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5676 }
Dario Frenicde2a032019-10-27 00:29:22 +01005677}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005678
Dario Frenicde2a032019-10-27 00:29:22 +01005679func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005680 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005681 apex {
5682 name: "myapex",
5683 key: "myapex.key",
5684 apps: [
5685 "AppFooPrebuilt",
5686 "AppFooPrivPrebuilt",
5687 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005688 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005689 }
5690
5691 apex_key {
5692 name: "myapex.key",
5693 public_key: "testkey.avbpubkey",
5694 private_key: "testkey.pem",
5695 }
5696
5697 android_app_import {
5698 name: "AppFooPrebuilt",
5699 apk: "PrebuiltAppFoo.apk",
5700 presigned: true,
5701 dex_preopt: {
5702 enabled: false,
5703 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005704 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005705 }
5706
5707 android_app_import {
5708 name: "AppFooPrivPrebuilt",
5709 apk: "PrebuiltAppFooPriv.apk",
5710 privileged: true,
5711 presigned: true,
5712 dex_preopt: {
5713 enabled: false,
5714 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005715 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005716 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005717 }
5718 `)
5719
Sundong Ahnabb64432019-10-22 13:58:29 +09005720 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005721 apexRule := module.Rule("apexRule")
5722 copyCmds := apexRule.Args["copy_commands"]
5723
5724 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005725 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5726}
5727
5728func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005729 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005730 apex {
5731 name: "myapex",
5732 key: "myapex.key",
5733 apps: [
5734 "AppFoo",
5735 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005736 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005737 }
5738
5739 apex_key {
5740 name: "myapex.key",
5741 public_key: "testkey.avbpubkey",
5742 private_key: "testkey.pem",
5743 }
5744
5745 android_app {
5746 name: "AppFoo",
5747 srcs: ["foo/bar/MyClass.java"],
5748 sdk_version: "none",
5749 system_modules: "none",
5750 apex_available: [ "myapex" ],
5751 }
5752
5753 android_app_import {
5754 name: "AppFoo",
5755 apk: "AppFooPrebuilt.apk",
5756 filename: "AppFooPrebuilt.apk",
5757 presigned: true,
5758 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005759 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005760 }
5761 `, withFiles(map[string][]byte{
5762 "AppFooPrebuilt.apk": nil,
5763 }))
5764
5765 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005766 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005767 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005768}
5769
Dario Freni6f3937c2019-12-20 22:58:03 +00005770func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005771 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005772 apex {
5773 name: "myapex",
5774 key: "myapex.key",
5775 apps: [
5776 "TesterHelpAppFoo",
5777 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005778 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005779 }
5780
5781 apex_key {
5782 name: "myapex.key",
5783 public_key: "testkey.avbpubkey",
5784 private_key: "testkey.pem",
5785 }
5786
5787 android_test_helper_app {
5788 name: "TesterHelpAppFoo",
5789 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005790 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005791 }
5792
5793 `)
5794
5795 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5796 apexRule := module.Rule("apexRule")
5797 copyCmds := apexRule.Args["copy_commands"]
5798
5799 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5800}
5801
Jooyung Han18020ea2019-11-13 10:50:48 +09005802func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5803 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005804 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005805 apex {
5806 name: "myapex",
5807 key: "myapex.key",
5808 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005809 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005810 }
5811
5812 apex_key {
5813 name: "myapex.key",
5814 public_key: "testkey.avbpubkey",
5815 private_key: "testkey.pem",
5816 }
5817
5818 apex {
5819 name: "otherapex",
5820 key: "myapex.key",
5821 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005822 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005823 }
5824
5825 cc_defaults {
5826 name: "libfoo-defaults",
5827 apex_available: ["otherapex"],
5828 }
5829
5830 cc_library {
5831 name: "libfoo",
5832 defaults: ["libfoo-defaults"],
5833 stl: "none",
5834 system_shared_libs: [],
5835 }`)
5836}
5837
Paul Duffine52e66f2020-03-30 17:54:29 +01005838func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005839 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005840 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005841 apex {
5842 name: "myapex",
5843 key: "myapex.key",
5844 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005845 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005846 }
5847
5848 apex_key {
5849 name: "myapex.key",
5850 public_key: "testkey.avbpubkey",
5851 private_key: "testkey.pem",
5852 }
5853
5854 apex {
5855 name: "otherapex",
5856 key: "otherapex.key",
5857 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005858 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005859 }
5860
5861 apex_key {
5862 name: "otherapex.key",
5863 public_key: "testkey.avbpubkey",
5864 private_key: "testkey.pem",
5865 }
5866
5867 cc_library {
5868 name: "libfoo",
5869 stl: "none",
5870 system_shared_libs: [],
5871 apex_available: ["otherapex"],
5872 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005873}
Jiyong Park127b40b2019-09-30 16:04:35 +09005874
Paul Duffine52e66f2020-03-30 17:54:29 +01005875func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005876 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005877 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005878.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005879.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005880.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005881.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005882.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005883.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005884 apex {
5885 name: "myapex",
5886 key: "myapex.key",
5887 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005888 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005889 }
5890
5891 apex_key {
5892 name: "myapex.key",
5893 public_key: "testkey.avbpubkey",
5894 private_key: "testkey.pem",
5895 }
5896
Jiyong Park127b40b2019-09-30 16:04:35 +09005897 cc_library {
5898 name: "libfoo",
5899 stl: "none",
5900 shared_libs: ["libbar"],
5901 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005902 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005903 }
5904
5905 cc_library {
5906 name: "libbar",
5907 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005908 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005909 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005910 apex_available: ["myapex"],
5911 }
5912
5913 cc_library {
5914 name: "libbaz",
5915 stl: "none",
5916 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005917 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005918}
Jiyong Park127b40b2019-09-30 16:04:35 +09005919
Paul Duffine52e66f2020-03-30 17:54:29 +01005920func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005921 testApexError(t, "\"otherapex\" is not a valid module name", `
5922 apex {
5923 name: "myapex",
5924 key: "myapex.key",
5925 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005926 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005927 }
5928
5929 apex_key {
5930 name: "myapex.key",
5931 public_key: "testkey.avbpubkey",
5932 private_key: "testkey.pem",
5933 }
5934
5935 cc_library {
5936 name: "libfoo",
5937 stl: "none",
5938 system_shared_libs: [],
5939 apex_available: ["otherapex"],
5940 }`)
5941
Paul Duffine52e66f2020-03-30 17:54:29 +01005942 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005943 apex {
5944 name: "myapex",
5945 key: "myapex.key",
5946 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005947 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005948 }
5949
5950 apex_key {
5951 name: "myapex.key",
5952 public_key: "testkey.avbpubkey",
5953 private_key: "testkey.pem",
5954 }
5955
5956 cc_library {
5957 name: "libfoo",
5958 stl: "none",
5959 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005960 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005961 apex_available: ["myapex"],
5962 }
5963
5964 cc_library {
5965 name: "libbar",
5966 stl: "none",
5967 system_shared_libs: [],
5968 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005969 }
5970
5971 cc_library {
5972 name: "libbaz",
5973 stl: "none",
5974 system_shared_libs: [],
5975 stubs: {
5976 versions: ["10", "20", "30"],
5977 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005978 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005979}
Jiyong Park127b40b2019-09-30 16:04:35 +09005980
Jiyong Park89e850a2020-04-07 16:37:39 +09005981func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005982 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005983 apex {
5984 name: "myapex",
5985 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005986 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005987 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005988 }
5989
5990 apex_key {
5991 name: "myapex.key",
5992 public_key: "testkey.avbpubkey",
5993 private_key: "testkey.pem",
5994 }
5995
5996 cc_library {
5997 name: "libfoo",
5998 stl: "none",
5999 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006000 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006001 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006002 }
6003
6004 cc_library {
6005 name: "libfoo2",
6006 stl: "none",
6007 system_shared_libs: [],
6008 shared_libs: ["libbaz"],
6009 apex_available: ["//apex_available:platform"],
6010 }
6011
6012 cc_library {
6013 name: "libbar",
6014 stl: "none",
6015 system_shared_libs: [],
6016 apex_available: ["myapex"],
6017 }
6018
6019 cc_library {
6020 name: "libbaz",
6021 stl: "none",
6022 system_shared_libs: [],
6023 apex_available: ["myapex"],
6024 stubs: {
6025 versions: ["1"],
6026 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006027 }`)
6028
Jiyong Park89e850a2020-04-07 16:37:39 +09006029 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6030 // because it depends on libbar which isn't available to platform
6031 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6032 if libfoo.NotAvailableForPlatform() != true {
6033 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6034 }
6035
6036 // libfoo2 however can be available to platform because it depends on libbaz which provides
6037 // stubs
6038 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6039 if libfoo2.NotAvailableForPlatform() == true {
6040 t.Errorf("%q should be available to platform", libfoo2.String())
6041 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006042}
Jiyong Parka90ca002019-10-07 15:47:24 +09006043
Paul Duffine52e66f2020-03-30 17:54:29 +01006044func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006045 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006046 apex {
6047 name: "myapex",
6048 key: "myapex.key",
6049 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006050 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006051 }
6052
6053 apex_key {
6054 name: "myapex.key",
6055 public_key: "testkey.avbpubkey",
6056 private_key: "testkey.pem",
6057 }
6058
6059 cc_library {
6060 name: "libfoo",
6061 stl: "none",
6062 system_shared_libs: [],
6063 apex_available: ["myapex"],
6064 static: {
6065 apex_available: ["//apex_available:platform"],
6066 },
6067 }`)
6068
Jiyong Park89e850a2020-04-07 16:37:39 +09006069 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6070 if libfooShared.NotAvailableForPlatform() != true {
6071 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6072 }
6073 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6074 if libfooStatic.NotAvailableForPlatform() != false {
6075 t.Errorf("%q should be available to platform", libfooStatic.String())
6076 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006077}
6078
Jiyong Park5d790c32019-11-15 18:40:32 +09006079func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006080 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006081 apex {
6082 name: "myapex",
6083 key: "myapex.key",
6084 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006085 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006086 prebuilts: ["myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006087 bootclasspath_fragments: ["mybootclasspath_fragment"],
6088 systemserverclasspath_fragments: ["mysystemserverclasspath_fragment"],
6089 java_libs: ["myjava_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006090 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006091 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006092 }
6093
6094 override_apex {
6095 name: "override_myapex",
6096 base: "myapex",
6097 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08006098 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006099 prebuilts: ["override_myetc"],
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006100 bootclasspath_fragments: ["override_bootclasspath_fragment"],
6101 systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"],
6102 java_libs: ["override_java_library"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006103 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006104 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006105 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006106 key: "mynewapex.key",
6107 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006108 }
6109
6110 apex_key {
6111 name: "myapex.key",
6112 public_key: "testkey.avbpubkey",
6113 private_key: "testkey.pem",
6114 }
6115
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006116 apex_key {
6117 name: "mynewapex.key",
6118 public_key: "testkey2.avbpubkey",
6119 private_key: "testkey2.pem",
6120 }
6121
6122 android_app_certificate {
6123 name: "myapex.certificate",
6124 certificate: "testkey",
6125 }
6126
Jiyong Park5d790c32019-11-15 18:40:32 +09006127 android_app {
6128 name: "app",
6129 srcs: ["foo/bar/MyClass.java"],
6130 package_name: "foo",
6131 sdk_version: "none",
6132 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006133 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006134 }
6135
6136 override_android_app {
6137 name: "override_app",
6138 base: "app",
6139 package_name: "bar",
6140 }
markchien7c803b82021-08-26 22:10:06 +08006141
6142 bpf {
6143 name: "bpf",
6144 srcs: ["bpf.c"],
6145 }
6146
6147 bpf {
6148 name: "override_bpf",
6149 srcs: ["override_bpf.c"],
6150 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006151
6152 prebuilt_etc {
6153 name: "myetc",
6154 src: "myprebuilt",
6155 }
6156
6157 prebuilt_etc {
6158 name: "override_myetc",
6159 src: "override_myprebuilt",
6160 }
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006161
6162 java_library {
6163 name: "bcplib",
6164 srcs: ["a.java"],
6165 compile_dex: true,
6166 apex_available: ["myapex"],
6167 permitted_packages: ["bcp.lib"],
6168 }
6169
6170 bootclasspath_fragment {
6171 name: "mybootclasspath_fragment",
6172 contents: ["bcplib"],
6173 apex_available: ["myapex"],
6174 }
6175
6176 java_library {
6177 name: "override_bcplib",
6178 srcs: ["a.java"],
6179 compile_dex: true,
6180 apex_available: ["myapex"],
6181 permitted_packages: ["override.bcp.lib"],
6182 }
6183
6184 bootclasspath_fragment {
6185 name: "override_bootclasspath_fragment",
6186 contents: ["override_bcplib"],
6187 apex_available: ["myapex"],
6188 }
6189
6190 java_library {
6191 name: "systemserverlib",
6192 srcs: ["a.java"],
6193 apex_available: ["myapex"],
6194 }
6195
6196 systemserverclasspath_fragment {
6197 name: "mysystemserverclasspath_fragment",
6198 standalone_contents: ["systemserverlib"],
6199 apex_available: ["myapex"],
6200 }
6201
6202 java_library {
6203 name: "override_systemserverlib",
6204 srcs: ["a.java"],
6205 apex_available: ["myapex"],
6206 }
6207
6208 systemserverclasspath_fragment {
6209 name: "override_systemserverclasspath_fragment",
6210 standalone_contents: ["override_systemserverlib"],
6211 apex_available: ["myapex"],
6212 }
6213
6214 java_library {
6215 name: "myjava_library",
6216 srcs: ["a.java"],
6217 compile_dex: true,
6218 apex_available: ["myapex"],
6219 }
6220
6221 java_library {
6222 name: "override_java_library",
6223 srcs: ["a.java"],
6224 compile_dex: true,
6225 apex_available: ["myapex"],
6226 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006227 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006228
Jiyong Park317645e2019-12-05 13:20:58 +09006229 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6230 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6231 if originalVariant.GetOverriddenBy() != "" {
6232 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6233 }
6234 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6235 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6236 }
6237
Jiyong Park5d790c32019-11-15 18:40:32 +09006238 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6239 apexRule := module.Rule("apexRule")
6240 copyCmds := apexRule.Args["copy_commands"]
6241
6242 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006243 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006244
markchien7c803b82021-08-26 22:10:06 +08006245 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6246 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6247
Daniel Norman5a3ce132021-08-26 15:44:43 -07006248 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6249 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6250
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006251 apexBundle := module.Module().(*apexBundle)
6252 name := apexBundle.Name()
6253 if name != "override_myapex" {
6254 t.Errorf("name should be \"override_myapex\", but was %q", name)
6255 }
6256
Baligh Uddin004d7172020-02-19 21:29:28 -08006257 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6258 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6259 }
6260
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006261 android.AssertArrayString(t, "Bootclasspath_fragments does not match",
6262 []string{"override_bootclasspath_fragment"}, apexBundle.overridableProperties.Bootclasspath_fragments)
6263 android.AssertArrayString(t, "Systemserverclasspath_fragments does not match",
6264 []string{"override_systemserverclasspath_fragment"}, apexBundle.overridableProperties.Systemserverclasspath_fragments)
6265 android.AssertArrayString(t, "Java_libs does not match",
6266 []string{"override_java_library"}, apexBundle.overridableProperties.Java_libs)
6267
Jiyong Park20bacab2020-03-03 11:45:41 +09006268 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006269 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006270 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6271
6272 signApkRule := module.Rule("signapk")
6273 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006274
Colin Crossaa255532020-07-03 13:18:24 -07006275 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006276 var builder strings.Builder
6277 data.Custom(&builder, name, "TARGET_", "", data)
6278 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006279 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006280 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006281 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006282 ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex")
6283 ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex")
6284 ensureContains(t, androidMk, "LOCAL_MODULE := override_java_library.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006285 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006286 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006287 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006288 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006289 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006290 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
Remi NGUYEN VANbe901722022-03-02 21:00:33 +09006291 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_bcplib.myapex")
6292 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.myapex")
6293 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_java_library.pb.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006294 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006295}
6296
Jooyung Han214bf372019-11-12 13:03:50 +09006297func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006298 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006299 apex {
6300 name: "myapex",
6301 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006302 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006303 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006304 }
6305
6306 apex_key {
6307 name: "myapex.key",
6308 public_key: "testkey.avbpubkey",
6309 private_key: "testkey.pem",
6310 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006311
6312 cc_library {
6313 name: "mylib",
6314 srcs: ["mylib.cpp"],
6315 stl: "libc++",
6316 system_shared_libs: [],
6317 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006318 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006319 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006320 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006321
6322 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6323 args := module.Rule("apexRule").Args
6324 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006325 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006326
6327 // The copies of the libraries in the apex should have one more dependency than
6328 // the ones outside the apex, namely the unwinder. Ideally we should check
6329 // the dependency names directly here but for some reason the names are blank in
6330 // this test.
6331 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006332 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006333 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6334 if len(apexImplicits) != len(nonApexImplicits)+1 {
6335 t.Errorf("%q missing unwinder dep", lib)
6336 }
6337 }
Jooyung Han214bf372019-11-12 13:03:50 +09006338}
6339
Paul Duffine05480a2021-03-08 15:07:14 +00006340var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006341 "api/current.txt": nil,
6342 "api/removed.txt": nil,
6343 "api/system-current.txt": nil,
6344 "api/system-removed.txt": nil,
6345 "api/test-current.txt": nil,
6346 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006347
Anton Hanssondff2c782020-12-21 17:10:01 +00006348 "100/public/api/foo.txt": nil,
6349 "100/public/api/foo-removed.txt": nil,
6350 "100/system/api/foo.txt": nil,
6351 "100/system/api/foo-removed.txt": nil,
6352
Paul Duffineedc5d52020-06-12 17:46:39 +01006353 // For java_sdk_library_import
6354 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006355}
6356
Jooyung Han58f26ab2019-12-18 15:34:32 +09006357func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006358 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006359 apex {
6360 name: "myapex",
6361 key: "myapex.key",
6362 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006363 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006364 }
6365
6366 apex_key {
6367 name: "myapex.key",
6368 public_key: "testkey.avbpubkey",
6369 private_key: "testkey.pem",
6370 }
6371
6372 java_sdk_library {
6373 name: "foo",
6374 srcs: ["a.java"],
6375 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006376 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006377 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006378
6379 prebuilt_apis {
6380 name: "sdk",
6381 api_dirs: ["100"],
6382 }
Paul Duffin9b879592020-05-26 13:21:35 +01006383 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006384
6385 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006386 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006387 "javalib/foo.jar",
6388 "etc/permissions/foo.xml",
6389 })
6390 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006391 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006392 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 +09006393}
6394
Paul Duffin9b879592020-05-26 13:21:35 +01006395func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006396 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006397 apex {
6398 name: "myapex",
6399 key: "myapex.key",
6400 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006401 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006402 }
6403
6404 apex_key {
6405 name: "myapex.key",
6406 public_key: "testkey.avbpubkey",
6407 private_key: "testkey.pem",
6408 }
6409
6410 java_sdk_library {
6411 name: "foo",
6412 srcs: ["a.java"],
6413 api_packages: ["foo"],
6414 apex_available: ["myapex"],
6415 sdk_version: "none",
6416 system_modules: "none",
6417 }
6418
6419 java_library {
6420 name: "bar",
6421 srcs: ["a.java"],
6422 libs: ["foo"],
6423 apex_available: ["myapex"],
6424 sdk_version: "none",
6425 system_modules: "none",
6426 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006427
6428 prebuilt_apis {
6429 name: "sdk",
6430 api_dirs: ["100"],
6431 }
Paul Duffin9b879592020-05-26 13:21:35 +01006432 `, withFiles(filesForSdkLibrary))
6433
6434 // java_sdk_library installs both impl jar and permission XML
6435 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6436 "javalib/bar.jar",
6437 "javalib/foo.jar",
6438 "etc/permissions/foo.xml",
6439 })
6440
6441 // The bar library should depend on the implementation jar.
6442 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006443 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006444 t.Errorf("expected %q, found %#q", expected, actual)
6445 }
6446}
6447
6448func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006449 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006450 apex {
6451 name: "myapex",
6452 key: "myapex.key",
6453 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006454 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006455 }
6456
6457 apex_key {
6458 name: "myapex.key",
6459 public_key: "testkey.avbpubkey",
6460 private_key: "testkey.pem",
6461 }
6462
6463 java_sdk_library {
6464 name: "foo",
6465 srcs: ["a.java"],
6466 api_packages: ["foo"],
6467 apex_available: ["myapex"],
6468 sdk_version: "none",
6469 system_modules: "none",
6470 }
6471
6472 java_library {
6473 name: "bar",
6474 srcs: ["a.java"],
6475 libs: ["foo"],
6476 sdk_version: "none",
6477 system_modules: "none",
6478 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006479
6480 prebuilt_apis {
6481 name: "sdk",
6482 api_dirs: ["100"],
6483 }
Paul Duffin9b879592020-05-26 13:21:35 +01006484 `, withFiles(filesForSdkLibrary))
6485
6486 // java_sdk_library installs both impl jar and permission XML
6487 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6488 "javalib/foo.jar",
6489 "etc/permissions/foo.xml",
6490 })
6491
6492 // The bar library should depend on the stubs jar.
6493 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006494 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006495 t.Errorf("expected %q, found %#q", expected, actual)
6496 }
6497}
6498
Paul Duffineedc5d52020-06-12 17:46:39 +01006499func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006500 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006501 prebuilt_apis {
6502 name: "sdk",
6503 api_dirs: ["100"],
6504 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006505 withFiles(map[string][]byte{
6506 "apex/a.java": nil,
6507 "apex/apex_manifest.json": nil,
6508 "apex/Android.bp": []byte(`
6509 package {
6510 default_visibility: ["//visibility:private"],
6511 }
6512
6513 apex {
6514 name: "myapex",
6515 key: "myapex.key",
6516 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006517 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006518 }
6519
6520 apex_key {
6521 name: "myapex.key",
6522 public_key: "testkey.avbpubkey",
6523 private_key: "testkey.pem",
6524 }
6525
6526 java_library {
6527 name: "bar",
6528 srcs: ["a.java"],
6529 libs: ["foo"],
6530 apex_available: ["myapex"],
6531 sdk_version: "none",
6532 system_modules: "none",
6533 }
6534`),
6535 "source/a.java": nil,
6536 "source/api/current.txt": nil,
6537 "source/api/removed.txt": nil,
6538 "source/Android.bp": []byte(`
6539 package {
6540 default_visibility: ["//visibility:private"],
6541 }
6542
6543 java_sdk_library {
6544 name: "foo",
6545 visibility: ["//apex"],
6546 srcs: ["a.java"],
6547 api_packages: ["foo"],
6548 apex_available: ["myapex"],
6549 sdk_version: "none",
6550 system_modules: "none",
6551 public: {
6552 enabled: true,
6553 },
6554 }
6555`),
6556 "prebuilt/a.jar": nil,
6557 "prebuilt/Android.bp": []byte(`
6558 package {
6559 default_visibility: ["//visibility:private"],
6560 }
6561
6562 java_sdk_library_import {
6563 name: "foo",
6564 visibility: ["//apex", "//source"],
6565 apex_available: ["myapex"],
6566 prefer: true,
6567 public: {
6568 jars: ["a.jar"],
6569 },
6570 }
6571`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006572 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006573 )
6574
6575 // java_sdk_library installs both impl jar and permission XML
6576 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6577 "javalib/bar.jar",
6578 "javalib/foo.jar",
6579 "etc/permissions/foo.xml",
6580 })
6581
6582 // The bar library should depend on the implementation jar.
6583 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006584 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006585 t.Errorf("expected %q, found %#q", expected, actual)
6586 }
6587}
6588
6589func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6590 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6591 apex {
6592 name: "myapex",
6593 key: "myapex.key",
6594 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006595 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006596 }
6597
6598 apex_key {
6599 name: "myapex.key",
6600 public_key: "testkey.avbpubkey",
6601 private_key: "testkey.pem",
6602 }
6603
6604 java_sdk_library_import {
6605 name: "foo",
6606 apex_available: ["myapex"],
6607 prefer: true,
6608 public: {
6609 jars: ["a.jar"],
6610 },
6611 }
6612
6613 `, withFiles(filesForSdkLibrary))
6614}
6615
atrost6e126252020-01-27 17:01:16 +00006616func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006617 result := android.GroupFixturePreparers(
6618 prepareForApexTest,
6619 java.PrepareForTestWithPlatformCompatConfig,
6620 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006621 apex {
6622 name: "myapex",
6623 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006624 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006625 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006626 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006627 }
6628
6629 apex_key {
6630 name: "myapex.key",
6631 public_key: "testkey.avbpubkey",
6632 private_key: "testkey.pem",
6633 }
6634
6635 platform_compat_config {
6636 name: "myjar-platform-compat-config",
6637 src: ":myjar",
6638 }
6639
6640 java_library {
6641 name: "myjar",
6642 srcs: ["foo/bar/MyClass.java"],
6643 sdk_version: "none",
6644 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006645 apex_available: [ "myapex" ],
6646 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006647
6648 // Make sure that a preferred prebuilt does not affect the apex contents.
6649 prebuilt_platform_compat_config {
6650 name: "myjar-platform-compat-config",
6651 metadata: "compat-config/metadata.xml",
6652 prefer: true,
6653 }
atrost6e126252020-01-27 17:01:16 +00006654 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006655 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006656 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6657 "etc/compatconfig/myjar-platform-compat-config.xml",
6658 "javalib/myjar.jar",
6659 })
6660}
6661
Jiyong Park479321d2019-12-16 11:47:12 +09006662func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6663 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6664 apex {
6665 name: "myapex",
6666 key: "myapex.key",
6667 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006668 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006669 }
6670
6671 apex_key {
6672 name: "myapex.key",
6673 public_key: "testkey.avbpubkey",
6674 private_key: "testkey.pem",
6675 }
6676
6677 java_library {
6678 name: "myjar",
6679 srcs: ["foo/bar/MyClass.java"],
6680 sdk_version: "none",
6681 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006682 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006683 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006684 }
6685 `)
6686}
6687
Jiyong Park7afd1072019-12-30 16:56:33 +09006688func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006689 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006690 apex {
6691 name: "myapex",
6692 key: "myapex.key",
6693 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006694 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006695 }
6696
6697 apex_key {
6698 name: "myapex.key",
6699 public_key: "testkey.avbpubkey",
6700 private_key: "testkey.pem",
6701 }
6702
6703 cc_library {
6704 name: "mylib",
6705 srcs: ["mylib.cpp"],
6706 system_shared_libs: [],
6707 stl: "none",
6708 required: ["a", "b"],
6709 host_required: ["c", "d"],
6710 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006711 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006712 }
6713 `)
6714
6715 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006716 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006717 name := apexBundle.BaseModuleName()
6718 prefix := "TARGET_"
6719 var builder strings.Builder
6720 data.Custom(&builder, name, prefix, "", data)
6721 androidMk := builder.String()
6722 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6723 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6724 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6725}
6726
Jiyong Park7cd10e32020-01-14 09:22:18 +09006727func TestSymlinksFromApexToSystem(t *testing.T) {
6728 bp := `
6729 apex {
6730 name: "myapex",
6731 key: "myapex.key",
6732 native_shared_libs: ["mylib"],
6733 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006734 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006735 }
6736
Jiyong Park9d677202020-02-19 16:29:35 +09006737 apex {
6738 name: "myapex.updatable",
6739 key: "myapex.key",
6740 native_shared_libs: ["mylib"],
6741 java_libs: ["myjar"],
6742 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006743 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006744 }
6745
Jiyong Park7cd10e32020-01-14 09:22:18 +09006746 apex_key {
6747 name: "myapex.key",
6748 public_key: "testkey.avbpubkey",
6749 private_key: "testkey.pem",
6750 }
6751
6752 cc_library {
6753 name: "mylib",
6754 srcs: ["mylib.cpp"],
6755 shared_libs: ["myotherlib"],
6756 system_shared_libs: [],
6757 stl: "none",
6758 apex_available: [
6759 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006760 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006761 "//apex_available:platform",
6762 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006763 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006764 }
6765
6766 cc_library {
6767 name: "myotherlib",
6768 srcs: ["mylib.cpp"],
6769 system_shared_libs: [],
6770 stl: "none",
6771 apex_available: [
6772 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006773 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006774 "//apex_available:platform",
6775 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006776 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006777 }
6778
6779 java_library {
6780 name: "myjar",
6781 srcs: ["foo/bar/MyClass.java"],
6782 sdk_version: "none",
6783 system_modules: "none",
6784 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006785 apex_available: [
6786 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006787 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006788 "//apex_available:platform",
6789 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006790 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006791 }
6792
6793 java_library {
6794 name: "myotherjar",
6795 srcs: ["foo/bar/MyClass.java"],
6796 sdk_version: "none",
6797 system_modules: "none",
6798 apex_available: [
6799 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006800 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006801 "//apex_available:platform",
6802 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006803 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006804 }
6805 `
6806
6807 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6808 for _, f := range files {
6809 if f.path == file {
6810 if f.isLink {
6811 t.Errorf("%q is not a real file", file)
6812 }
6813 return
6814 }
6815 }
6816 t.Errorf("%q is not found", file)
6817 }
6818
6819 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6820 for _, f := range files {
6821 if f.path == file {
6822 if !f.isLink {
6823 t.Errorf("%q is not a symlink", file)
6824 }
6825 return
6826 }
6827 }
6828 t.Errorf("%q is not found", file)
6829 }
6830
Jiyong Park9d677202020-02-19 16:29:35 +09006831 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6832 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006833 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006834 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006835 ensureRealfileExists(t, files, "javalib/myjar.jar")
6836 ensureRealfileExists(t, files, "lib64/mylib.so")
6837 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6838
Jiyong Park9d677202020-02-19 16:29:35 +09006839 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6840 ensureRealfileExists(t, files, "javalib/myjar.jar")
6841 ensureRealfileExists(t, files, "lib64/mylib.so")
6842 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6843
6844 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006845 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006846 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006847 ensureRealfileExists(t, files, "javalib/myjar.jar")
6848 ensureRealfileExists(t, files, "lib64/mylib.so")
6849 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006850
6851 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6852 ensureRealfileExists(t, files, "javalib/myjar.jar")
6853 ensureRealfileExists(t, files, "lib64/mylib.so")
6854 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006855}
6856
Yo Chiange8128052020-07-23 20:09:18 +08006857func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006858 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006859 apex {
6860 name: "myapex",
6861 key: "myapex.key",
6862 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006863 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006864 }
6865
6866 apex_key {
6867 name: "myapex.key",
6868 public_key: "testkey.avbpubkey",
6869 private_key: "testkey.pem",
6870 }
6871
6872 cc_library_shared {
6873 name: "mylib",
6874 srcs: ["mylib.cpp"],
6875 shared_libs: ["myotherlib"],
6876 system_shared_libs: [],
6877 stl: "none",
6878 apex_available: [
6879 "myapex",
6880 "//apex_available:platform",
6881 ],
6882 }
6883
6884 cc_prebuilt_library_shared {
6885 name: "myotherlib",
6886 srcs: ["prebuilt.so"],
6887 system_shared_libs: [],
6888 stl: "none",
6889 apex_available: [
6890 "myapex",
6891 "//apex_available:platform",
6892 ],
6893 }
6894 `)
6895
6896 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006897 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006898 var builder strings.Builder
6899 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6900 androidMk := builder.String()
6901 // `myotherlib` is added to `myapex` as symlink
6902 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6903 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6904 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6905 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006906 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 +08006907}
6908
Jooyung Han643adc42020-02-27 13:50:06 +09006909func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006910 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006911 apex {
6912 name: "myapex",
6913 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09006914 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006915 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006916 }
6917
6918 apex_key {
6919 name: "myapex.key",
6920 public_key: "testkey.avbpubkey",
6921 private_key: "testkey.pem",
6922 }
6923
6924 cc_library {
6925 name: "mylib",
6926 srcs: ["mylib.cpp"],
6927 shared_libs: ["mylib2"],
6928 system_shared_libs: [],
6929 stl: "none",
6930 apex_available: [ "myapex" ],
6931 }
6932
6933 cc_library {
6934 name: "mylib2",
6935 srcs: ["mylib.cpp"],
6936 system_shared_libs: [],
6937 stl: "none",
6938 apex_available: [ "myapex" ],
6939 }
Jiyong Park34d5c332022-02-24 18:02:44 +09006940
6941 rust_ffi_shared {
6942 name: "libfoo.rust",
6943 crate_name: "foo",
6944 srcs: ["foo.rs"],
6945 shared_libs: ["libfoo.shared_from_rust"],
6946 prefer_rlib: true,
6947 apex_available: ["myapex"],
6948 }
6949
6950 cc_library_shared {
6951 name: "libfoo.shared_from_rust",
6952 srcs: ["mylib.cpp"],
6953 system_shared_libs: [],
6954 stl: "none",
6955 stubs: {
6956 versions: ["10", "11", "12"],
6957 },
6958 }
6959
Jooyung Han643adc42020-02-27 13:50:06 +09006960 `)
6961
6962 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6963 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09006964 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09006965 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6966 "lib64/mylib.so",
6967 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09006968 "lib64/libfoo.rust.so",
6969 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
6970 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09006971 })
Jiyong Park34d5c332022-02-24 18:02:44 +09006972
6973 // b/220397949
6974 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09006975}
6976
Jooyung Han49f67012020-04-17 13:43:10 +09006977func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006978 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006979 apex {
6980 name: "myapex",
6981 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006982 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006983 }
6984 apex_key {
6985 name: "myapex.key",
6986 public_key: "testkey.avbpubkey",
6987 private_key: "testkey.pem",
6988 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006989 `,
6990 android.FixtureModifyConfig(func(config android.Config) {
6991 delete(config.Targets, android.Android)
6992 config.AndroidCommonTarget = android.Target{}
6993 }),
6994 )
Jooyung Han49f67012020-04-17 13:43:10 +09006995
6996 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6997 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6998 }
6999}
7000
Jiyong Parkbd159612020-02-28 15:22:21 +09007001func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007002 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007003 apex {
7004 name: "myapex",
7005 key: "myapex.key",
7006 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007007 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007008 }
7009
7010 apex_key {
7011 name: "myapex.key",
7012 public_key: "testkey.avbpubkey",
7013 private_key: "testkey.pem",
7014 }
7015
7016 android_app {
7017 name: "AppFoo",
7018 srcs: ["foo/bar/MyClass.java"],
7019 sdk_version: "none",
7020 system_modules: "none",
7021 apex_available: [ "myapex" ],
7022 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007023 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007024
Colin Crosscf371cc2020-11-13 11:48:42 -08007025 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007026 content := bundleConfigRule.Args["content"]
7027
7028 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007029 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 +09007030}
7031
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007032func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007033 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007034 apex {
7035 name: "myapex",
7036 key: "myapex.key",
7037 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007038 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007039 }
7040
7041 apex_key {
7042 name: "myapex.key",
7043 public_key: "testkey.avbpubkey",
7044 private_key: "testkey.pem",
7045 }
7046
7047 android_app_set {
7048 name: "AppSet",
7049 set: "AppSet.apks",
7050 }`)
7051 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007052 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007053 content := bundleConfigRule.Args["content"]
7054 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7055 s := mod.Rule("apexRule").Args["copy_commands"]
7056 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
7057 if len(copyCmds) != 3 {
7058 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
7059 }
7060 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
7061 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
7062 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
7063}
7064
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007065func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007066 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007067 apex_set {
7068 name: "myapex",
7069 filename: "foo_v2.apex",
7070 sanitized: {
7071 none: { set: "myapex.apks", },
7072 hwaddress: { set: "myapex.hwasan.apks", },
7073 },
Paul Duffin24704672021-04-06 16:09:30 +01007074 }
7075 `
7076 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007077
Paul Duffin24704672021-04-06 16:09:30 +01007078 // Check that the extractor produces the correct output file from the correct input file.
7079 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007080
Paul Duffin24704672021-04-06 16:09:30 +01007081 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7082 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007083
Paul Duffin24704672021-04-06 16:09:30 +01007084 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7085
7086 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007087 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7088 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007089
7090 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007091}
7092
Paul Duffin89f570a2021-06-16 01:42:33 +01007093func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007094 t.Helper()
7095
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007096 bp := `
7097 java_library {
7098 name: "some-updatable-apex-lib",
7099 srcs: ["a.java"],
7100 sdk_version: "current",
7101 apex_available: [
7102 "some-updatable-apex",
7103 ],
satayevabcd5972021-08-06 17:49:46 +01007104 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007105 }
7106
7107 java_library {
7108 name: "some-non-updatable-apex-lib",
7109 srcs: ["a.java"],
7110 apex_available: [
7111 "some-non-updatable-apex",
7112 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007113 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007114 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007115 }
7116
7117 bootclasspath_fragment {
7118 name: "some-non-updatable-fragment",
7119 contents: ["some-non-updatable-apex-lib"],
7120 apex_available: [
7121 "some-non-updatable-apex",
7122 ],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007123 }
7124
7125 java_library {
7126 name: "some-platform-lib",
7127 srcs: ["a.java"],
7128 sdk_version: "current",
7129 installable: true,
7130 }
7131
7132 java_library {
7133 name: "some-art-lib",
7134 srcs: ["a.java"],
7135 sdk_version: "current",
7136 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007137 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007138 ],
7139 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007140 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007141 }
7142
7143 apex {
7144 name: "some-updatable-apex",
7145 key: "some-updatable-apex.key",
7146 java_libs: ["some-updatable-apex-lib"],
7147 updatable: true,
7148 min_sdk_version: "current",
7149 }
7150
7151 apex {
7152 name: "some-non-updatable-apex",
7153 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007154 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007155 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007156 }
7157
7158 apex_key {
7159 name: "some-updatable-apex.key",
7160 }
7161
7162 apex_key {
7163 name: "some-non-updatable-apex.key",
7164 }
7165
7166 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007167 name: "com.android.art.debug",
7168 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007169 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007170 updatable: true,
7171 min_sdk_version: "current",
7172 }
7173
Paul Duffinf23bc472021-04-27 12:42:20 +01007174 bootclasspath_fragment {
7175 name: "art-bootclasspath-fragment",
7176 image_name: "art",
7177 contents: ["some-art-lib"],
7178 apex_available: [
7179 "com.android.art.debug",
7180 ],
7181 }
7182
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007183 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007184 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007185 }
7186
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007187 filegroup {
7188 name: "some-updatable-apex-file_contexts",
7189 srcs: [
7190 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7191 ],
7192 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007193
7194 filegroup {
7195 name: "some-non-updatable-apex-file_contexts",
7196 srcs: [
7197 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7198 ],
7199 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007200 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007201
Paul Duffin89f570a2021-06-16 01:42:33 +01007202 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007203}
7204
Paul Duffin89f570a2021-06-16 01:42:33 +01007205func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007206 t.Helper()
7207
Paul Duffin55607122021-03-30 23:32:51 +01007208 fs := android.MockFS{
7209 "a.java": nil,
7210 "a.jar": nil,
7211 "apex_manifest.json": nil,
7212 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007213 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007214 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7215 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7216 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007217 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007218 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007219
Paul Duffin55607122021-03-30 23:32:51 +01007220 errorHandler := android.FixtureExpectsNoErrors
7221 if errmsg != "" {
7222 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007223 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007224
Paul Duffin55607122021-03-30 23:32:51 +01007225 result := android.GroupFixturePreparers(
7226 cc.PrepareForTestWithCcDefaultModules,
7227 java.PrepareForTestWithHiddenApiBuildComponents,
7228 java.PrepareForTestWithJavaDefaultModules,
7229 java.PrepareForTestWithJavaSdkLibraryFiles,
7230 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007231 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007232 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007233 android.FixtureModifyMockFS(func(fs android.MockFS) {
7234 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7235 insert := ""
7236 for _, fragment := range fragments {
7237 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7238 }
7239 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7240 platform_bootclasspath {
7241 name: "platform-bootclasspath",
7242 fragments: [
7243 %s
7244 ],
7245 }
7246 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007247 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007248 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007249 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007250 ).
7251 ExtendWithErrorHandler(errorHandler).
7252 RunTestWithBp(t, bp)
7253
7254 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007255}
7256
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007257func TestDuplicateDeapexeresFromPrebuiltApexes(t *testing.T) {
7258 preparers := android.GroupFixturePreparers(
7259 java.PrepareForTestWithJavaDefaultModules,
7260 PrepareForTestWithApexBuildComponents,
7261 ).
7262 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7263 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7264
7265 bpBase := `
7266 apex_set {
7267 name: "com.android.myapex",
7268 installable: true,
7269 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7270 set: "myapex.apks",
7271 }
7272
7273 apex_set {
7274 name: "com.mycompany.android.myapex",
7275 apex_name: "com.android.myapex",
7276 installable: true,
7277 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7278 set: "company-myapex.apks",
7279 }
7280
7281 prebuilt_bootclasspath_fragment {
7282 name: "my-bootclasspath-fragment",
7283 apex_available: ["com.android.myapex"],
7284 %s
7285 }
7286 `
7287
7288 t.Run("java_import", func(t *testing.T) {
7289 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7290 java_import {
7291 name: "libfoo",
7292 jars: ["libfoo.jar"],
7293 apex_available: ["com.android.myapex"],
7294 }
7295 `)
7296 })
7297
7298 t.Run("java_sdk_library_import", func(t *testing.T) {
7299 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7300 java_sdk_library_import {
7301 name: "libfoo",
7302 public: {
7303 jars: ["libbar.jar"],
7304 },
7305 apex_available: ["com.android.myapex"],
7306 }
7307 `)
7308 })
7309
7310 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7311 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7312 image_name: "art",
7313 contents: ["libfoo"],
7314 `)+`
7315 java_sdk_library_import {
7316 name: "libfoo",
7317 public: {
7318 jars: ["libbar.jar"],
7319 },
7320 apex_available: ["com.android.myapex"],
7321 }
7322 `)
7323 })
7324}
7325
Jooyung Han548640b2020-04-27 12:10:30 +09007326func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7327 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7328 apex {
7329 name: "myapex",
7330 key: "myapex.key",
7331 updatable: true,
7332 }
7333
7334 apex_key {
7335 name: "myapex.key",
7336 public_key: "testkey.avbpubkey",
7337 private_key: "testkey.pem",
7338 }
7339 `)
7340}
7341
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007342func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7343 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7344 apex {
7345 name: "myapex",
7346 key: "myapex.key",
7347 }
7348
7349 apex_key {
7350 name: "myapex.key",
7351 public_key: "testkey.avbpubkey",
7352 private_key: "testkey.pem",
7353 }
7354 `)
7355}
7356
Daniel Norman69109112021-12-02 12:52:42 -08007357func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7358 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7359 apex {
7360 name: "myapex",
7361 key: "myapex.key",
7362 updatable: true,
7363 soc_specific: true,
7364 }
7365
7366 apex_key {
7367 name: "myapex.key",
7368 public_key: "testkey.avbpubkey",
7369 private_key: "testkey.pem",
7370 }
7371 `)
7372}
7373
satayevb98371c2021-06-15 16:49:50 +01007374func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7375 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7376 apex {
7377 name: "myapex",
7378 key: "myapex.key",
7379 systemserverclasspath_fragments: [
7380 "mysystemserverclasspathfragment",
7381 ],
7382 min_sdk_version: "29",
7383 updatable: true,
7384 }
7385
7386 apex_key {
7387 name: "myapex.key",
7388 public_key: "testkey.avbpubkey",
7389 private_key: "testkey.pem",
7390 }
7391
7392 java_library {
7393 name: "foo",
7394 srcs: ["b.java"],
7395 min_sdk_version: "29",
7396 installable: true,
7397 apex_available: [
7398 "myapex",
7399 ],
7400 }
7401
7402 systemserverclasspath_fragment {
7403 name: "mysystemserverclasspathfragment",
7404 generate_classpaths_proto: false,
7405 contents: [
7406 "foo",
7407 ],
7408 apex_available: [
7409 "myapex",
7410 ],
7411 }
satayevabcd5972021-08-06 17:49:46 +01007412 `,
7413 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7414 )
satayevb98371c2021-06-15 16:49:50 +01007415}
7416
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007417func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007418 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7419 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7420 // modules to be included in the BootJars.
7421 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7422 return android.GroupFixturePreparers(
7423 dexpreopt.FixtureSetBootJars(bootJars...),
7424 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7425 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7426 }),
7427 )
7428 }
7429
7430 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7431 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7432 // specified in the ArtApexJars configuration.
7433 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7434 return android.GroupFixturePreparers(
7435 dexpreopt.FixtureSetArtBootJars(bootJars...),
7436 dexpreopt.FixtureSetBootJars(bootJars...),
7437 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7438 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7439 }),
7440 )
7441 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007442
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007443 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007444 preparer := android.GroupFixturePreparers(
7445 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7446 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7447 )
7448 fragments := []java.ApexVariantReference{
7449 {
7450 Apex: proptools.StringPtr("com.android.art.debug"),
7451 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7452 },
7453 {
7454 Apex: proptools.StringPtr("some-non-updatable-apex"),
7455 Module: proptools.StringPtr("some-non-updatable-fragment"),
7456 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007457 }
satayevabcd5972021-08-06 17:49:46 +01007458 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007459 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007460
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007461 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007462 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7463 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007464 preparer := android.GroupFixturePreparers(
7465 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7466 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7467 )
Paul Duffin60264a02021-04-12 20:02:36 +01007468 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007469 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007470
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007471 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 +01007472 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 +01007473 // Update the dexpreopt ArtApexJars directly.
7474 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7475 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007476 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007477
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007478 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007479 err := `ArtApexJars expects this to be in apex "some-non-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01007480 // Update the dexpreopt ArtApexJars directly.
7481 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7482 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007483 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007484
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007485 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 +01007486 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 +01007487 preparer := android.GroupFixturePreparers(
7488 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7489 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7490 )
Paul Duffin60264a02021-04-12 20:02:36 +01007491 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007492 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007493
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007494 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 +01007495 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007496 fragment := java.ApexVariantReference{
7497 Apex: proptools.StringPtr("some-non-updatable-apex"),
7498 Module: proptools.StringPtr("some-non-updatable-fragment"),
7499 }
7500 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007501 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007502
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007503 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007504 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007505 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7506 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007507 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007508
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007509 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007510 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007511 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7512 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007513 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007514
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007515 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007516 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007517 // Update the dexpreopt ArtApexJars directly.
7518 preparer := prepareSetArtJars("platform:some-platform-lib")
7519 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007520 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007521
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007522 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007523 preparer := android.GroupFixturePreparers(
7524 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7525 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7526 )
7527 fragments := []java.ApexVariantReference{
7528 {
7529 Apex: proptools.StringPtr("some-non-updatable-apex"),
7530 Module: proptools.StringPtr("some-non-updatable-fragment"),
7531 },
7532 }
7533 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007534 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007535}
7536
7537func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007538 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007539 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007540 fragment := java.ApexVariantReference{
7541 Apex: proptools.StringPtr("myapex"),
7542 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7543 }
7544
Paul Duffin064b70c2020-11-02 17:32:38 +00007545 testDexpreoptWithApexes(t, `
7546 prebuilt_apex {
7547 name: "myapex" ,
7548 arch: {
7549 arm64: {
7550 src: "myapex-arm64.apex",
7551 },
7552 arm: {
7553 src: "myapex-arm.apex",
7554 },
7555 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007556 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7557 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007558
Paul Duffin89f570a2021-06-16 01:42:33 +01007559 prebuilt_bootclasspath_fragment {
7560 name: "my-bootclasspath-fragment",
7561 contents: ["libfoo"],
7562 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007563 hidden_api: {
7564 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7565 metadata: "my-bootclasspath-fragment/metadata.csv",
7566 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007567 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7568 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7569 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007570 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007571 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007572
Paul Duffin89f570a2021-06-16 01:42:33 +01007573 java_import {
7574 name: "libfoo",
7575 jars: ["libfoo.jar"],
7576 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007577 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007578 }
7579 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007580 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007581}
7582
satayevd604b212021-07-21 14:23:52 +01007583func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007584 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007585 bp += `
7586 apex_key {
7587 name: "myapex.key",
7588 public_key: "testkey.avbpubkey",
7589 private_key: "testkey.pem",
7590 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007591 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007592 "lib1/src/A.java": nil,
7593 "lib2/src/B.java": nil,
7594 "system/sepolicy/apex/myapex-file_contexts": nil,
7595 }
7596
Paul Duffin45338f02021-03-30 23:07:52 +01007597 errorHandler := android.FixtureExpectsNoErrors
7598 if errmsg != "" {
7599 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007600 }
Colin Crossae8600b2020-10-29 17:09:13 -07007601
Paul Duffin45338f02021-03-30 23:07:52 +01007602 android.GroupFixturePreparers(
7603 android.PrepareForTestWithAndroidBuildComponents,
7604 java.PrepareForTestWithJavaBuildComponents,
7605 PrepareForTestWithApexBuildComponents,
7606 android.PrepareForTestWithNeverallowRules(rules),
7607 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007608 apexBootJars := make([]string, 0, len(bootJars))
7609 for _, apexBootJar := range bootJars {
7610 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007611 }
satayevd604b212021-07-21 14:23:52 +01007612 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007613 }),
7614 fs.AddToFixture(),
7615 ).
7616 ExtendWithErrorHandler(errorHandler).
7617 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007618}
7619
7620func TestApexPermittedPackagesRules(t *testing.T) {
7621 testcases := []struct {
7622 name string
7623 expectedError string
7624 bp string
7625 bootJars []string
7626 modulesPackages map[string][]string
7627 }{
7628
7629 {
7630 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7631 expectedError: "",
7632 bp: `
7633 java_library {
7634 name: "bcp_lib1",
7635 srcs: ["lib1/src/*.java"],
7636 permitted_packages: ["foo.bar"],
7637 apex_available: ["myapex"],
7638 sdk_version: "none",
7639 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007640 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007641 }
7642 java_library {
7643 name: "nonbcp_lib2",
7644 srcs: ["lib2/src/*.java"],
7645 apex_available: ["myapex"],
7646 permitted_packages: ["a.b"],
7647 sdk_version: "none",
7648 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007649 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007650 }
7651 apex {
7652 name: "myapex",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007653 min_sdk_version: "30",
Andrei Onea115e7e72020-06-05 21:14:03 +01007654 key: "myapex.key",
7655 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007656 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007657 }`,
7658 bootJars: []string{"bcp_lib1"},
7659 modulesPackages: map[string][]string{
7660 "myapex": []string{
7661 "foo.bar",
7662 },
7663 },
7664 },
7665 {
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007666 name: "Bootclasspath apex jar not satisfying allowed module packages on Q.",
Andrei Onead967aee2022-01-19 15:36:40 +00007667 expectedError: `(?s)module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only use these package prefixes: foo.bar with min_sdk < T. Please consider the following alternatives:\n 1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library. 2. Move the offending code into an allowed package.\n 3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`,
Andrei Onea115e7e72020-06-05 21:14:03 +01007668 bp: `
7669 java_library {
7670 name: "bcp_lib1",
7671 srcs: ["lib1/src/*.java"],
7672 apex_available: ["myapex"],
7673 permitted_packages: ["foo.bar"],
7674 sdk_version: "none",
7675 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007676 min_sdk_version: "29",
Andrei Onea115e7e72020-06-05 21:14:03 +01007677 }
7678 java_library {
7679 name: "bcp_lib2",
7680 srcs: ["lib2/src/*.java"],
7681 apex_available: ["myapex"],
7682 permitted_packages: ["foo.bar", "bar.baz"],
7683 sdk_version: "none",
7684 system_modules: "none",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007685 min_sdk_version: "29",
Andrei Onea115e7e72020-06-05 21:14:03 +01007686 }
7687 apex {
7688 name: "myapex",
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007689 min_sdk_version: "29",
7690 key: "myapex.key",
7691 java_libs: ["bcp_lib1", "bcp_lib2"],
7692 updatable: false,
7693 }
7694 `,
7695 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7696 modulesPackages: map[string][]string{
7697 "myapex": []string{
7698 "foo.bar",
7699 },
7700 },
7701 },
7702 {
7703 name: "Bootclasspath apex jar not satisfying allowed module packages on R.",
Andrei Onead967aee2022-01-19 15:36:40 +00007704 expectedError: `(?s)module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only use these package prefixes: foo.bar with min_sdk < T. Please consider the following alternatives:\n 1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library. 2. Move the offending code into an allowed package.\n 3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`,
Remi NGUYEN VAN1fdd6ca2021-12-02 19:39:35 +09007705 bp: `
7706 java_library {
7707 name: "bcp_lib1",
7708 srcs: ["lib1/src/*.java"],
7709 apex_available: ["myapex"],
7710 permitted_packages: ["foo.bar"],
7711 sdk_version: "none",
7712 system_modules: "none",
7713 min_sdk_version: "30",
7714 }
7715 java_library {
7716 name: "bcp_lib2",
7717 srcs: ["lib2/src/*.java"],
7718 apex_available: ["myapex"],
7719 permitted_packages: ["foo.bar", "bar.baz"],
7720 sdk_version: "none",
7721 system_modules: "none",
7722 min_sdk_version: "30",
7723 }
7724 apex {
7725 name: "myapex",
7726 min_sdk_version: "30",
7727 key: "myapex.key",
7728 java_libs: ["bcp_lib1", "bcp_lib2"],
7729 updatable: false,
7730 }
7731 `,
7732 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7733 modulesPackages: map[string][]string{
7734 "myapex": []string{
7735 "foo.bar",
7736 },
7737 },
7738 },
7739 {
7740 name: "Bootclasspath apex jar >= T not satisfying Q/R/S allowed module packages.",
7741 expectedError: "",
7742 bp: `
7743 java_library {
7744 name: "bcp_lib1",
7745 srcs: ["lib1/src/*.java"],
7746 apex_available: ["myapex"],
7747 permitted_packages: ["foo.bar"],
7748 sdk_version: "none",
7749 system_modules: "none",
7750 min_sdk_version: "current",
7751 }
7752 java_library {
7753 name: "bcp_lib2",
7754 srcs: ["lib2/src/*.java"],
7755 apex_available: ["myapex"],
7756 permitted_packages: ["foo.bar", "bar.baz"],
7757 sdk_version: "none",
7758 system_modules: "none",
7759 min_sdk_version: "current",
7760 }
7761 apex {
7762 name: "myapex",
7763 min_sdk_version: "current",
Andrei Onea115e7e72020-06-05 21:14:03 +01007764 key: "myapex.key",
7765 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007766 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007767 }
7768 `,
7769 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7770 modulesPackages: map[string][]string{
7771 "myapex": []string{
7772 "foo.bar",
7773 },
7774 },
7775 },
7776 }
7777 for _, tc := range testcases {
7778 t.Run(tc.name, func(t *testing.T) {
7779 rules := createApexPermittedPackagesRules(tc.modulesPackages)
7780 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
7781 })
7782 }
7783}
7784
Jiyong Park62304bb2020-04-13 16:19:48 +09007785func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007786 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09007787 apex {
7788 name: "myapex",
7789 key: "myapex.key",
7790 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007791 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09007792 }
7793
7794 apex_key {
7795 name: "myapex.key",
7796 public_key: "testkey.avbpubkey",
7797 private_key: "testkey.pem",
7798 }
7799
7800 cc_library {
7801 name: "mylib",
7802 srcs: ["mylib.cpp"],
7803 system_shared_libs: [],
7804 stl: "none",
7805 stubs: {
7806 versions: ["1"],
7807 },
7808 apex_available: ["myapex"],
7809 }
7810
7811 cc_library {
7812 name: "myprivlib",
7813 srcs: ["mylib.cpp"],
7814 system_shared_libs: [],
7815 stl: "none",
7816 apex_available: ["myapex"],
7817 }
7818
7819
7820 cc_test {
7821 name: "mytest",
7822 gtest: false,
7823 srcs: ["mylib.cpp"],
7824 system_shared_libs: [],
7825 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09007826 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09007827 test_for: ["myapex"]
7828 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007829
7830 cc_library {
7831 name: "mytestlib",
7832 srcs: ["mylib.cpp"],
7833 system_shared_libs: [],
7834 shared_libs: ["mylib", "myprivlib"],
7835 stl: "none",
7836 test_for: ["myapex"],
7837 }
7838
7839 cc_benchmark {
7840 name: "mybench",
7841 srcs: ["mylib.cpp"],
7842 system_shared_libs: [],
7843 shared_libs: ["mylib", "myprivlib"],
7844 stl: "none",
7845 test_for: ["myapex"],
7846 }
Jiyong Park62304bb2020-04-13 16:19:48 +09007847 `)
7848
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007849 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007850 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007851 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7852 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7853 }
7854
7855 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09007856 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007857 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7858 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7859 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7860}
Jiyong Park46a512f2020-12-04 18:02:13 +09007861
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007862func TestIndirectTestFor(t *testing.T) {
7863 ctx := testApex(t, `
7864 apex {
7865 name: "myapex",
7866 key: "myapex.key",
7867 native_shared_libs: ["mylib", "myprivlib"],
7868 updatable: false,
7869 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007870
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007871 apex_key {
7872 name: "myapex.key",
7873 public_key: "testkey.avbpubkey",
7874 private_key: "testkey.pem",
7875 }
7876
7877 cc_library {
7878 name: "mylib",
7879 srcs: ["mylib.cpp"],
7880 system_shared_libs: [],
7881 stl: "none",
7882 stubs: {
7883 versions: ["1"],
7884 },
7885 apex_available: ["myapex"],
7886 }
7887
7888 cc_library {
7889 name: "myprivlib",
7890 srcs: ["mylib.cpp"],
7891 system_shared_libs: [],
7892 stl: "none",
7893 shared_libs: ["mylib"],
7894 apex_available: ["myapex"],
7895 }
7896
7897 cc_library {
7898 name: "mytestlib",
7899 srcs: ["mylib.cpp"],
7900 system_shared_libs: [],
7901 shared_libs: ["myprivlib"],
7902 stl: "none",
7903 test_for: ["myapex"],
7904 }
7905 `)
7906
7907 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007908 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007909 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7910 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7911 }
7912
7913 // The platform variant of mytestlib links to the platform variant of the
7914 // internal myprivlib.
7915 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
7916
7917 // The platform variant of myprivlib links to the platform variant of mylib
7918 // and bypasses its stubs.
7919 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 +09007920}
7921
Martin Stjernholmec009002021-03-27 15:18:31 +00007922func TestTestForForLibInOtherApex(t *testing.T) {
7923 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
7924 _ = testApex(t, `
7925 apex {
7926 name: "com.android.art",
7927 key: "myapex.key",
7928 native_shared_libs: ["mylib"],
7929 updatable: false,
7930 }
7931
7932 apex {
7933 name: "com.android.art.debug",
7934 key: "myapex.key",
7935 native_shared_libs: ["mylib", "mytestlib"],
7936 updatable: false,
7937 }
7938
7939 apex_key {
7940 name: "myapex.key",
7941 public_key: "testkey.avbpubkey",
7942 private_key: "testkey.pem",
7943 }
7944
7945 cc_library {
7946 name: "mylib",
7947 srcs: ["mylib.cpp"],
7948 system_shared_libs: [],
7949 stl: "none",
7950 stubs: {
7951 versions: ["1"],
7952 },
7953 apex_available: ["com.android.art", "com.android.art.debug"],
7954 }
7955
7956 cc_library {
7957 name: "mytestlib",
7958 srcs: ["mylib.cpp"],
7959 system_shared_libs: [],
7960 shared_libs: ["mylib"],
7961 stl: "none",
7962 apex_available: ["com.android.art.debug"],
7963 test_for: ["com.android.art"],
7964 }
7965 `,
7966 android.MockFS{
7967 "system/sepolicy/apex/com.android.art-file_contexts": nil,
7968 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
7969 }.AddToFixture())
7970}
7971
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007972// TODO(jungjw): Move this to proptools
7973func intPtr(i int) *int {
7974 return &i
7975}
7976
7977func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007978 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007979 apex_set {
7980 name: "myapex",
7981 set: "myapex.apks",
7982 filename: "foo_v2.apex",
7983 overrides: ["foo"],
7984 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007985 `,
7986 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7987 variables.Platform_sdk_version = intPtr(30)
7988 }),
7989 android.FixtureModifyConfig(func(config android.Config) {
7990 config.Targets[android.Android] = []android.Target{
7991 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
7992 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
7993 }
7994 }),
7995 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007996
Paul Duffin24704672021-04-06 16:09:30 +01007997 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007998
7999 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008000 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008001 actual := extractedApex.Args["abis"]
8002 expected := "ARMEABI_V7A,ARM64_V8A"
8003 if actual != expected {
8004 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8005 }
8006 actual = extractedApex.Args["sdk-version"]
8007 expected = "30"
8008 if actual != expected {
8009 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8010 }
8011
Paul Duffin6717d882021-06-15 19:09:41 +01008012 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008013 a := m.Module().(*ApexSet)
8014 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008015 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008016 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8017 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8018 }
8019}
8020
Jiyong Park7d95a512020-05-10 15:16:24 +09008021func TestNoStaticLinkingToStubsLib(t *testing.T) {
8022 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8023 apex {
8024 name: "myapex",
8025 key: "myapex.key",
8026 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008027 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008028 }
8029
8030 apex_key {
8031 name: "myapex.key",
8032 public_key: "testkey.avbpubkey",
8033 private_key: "testkey.pem",
8034 }
8035
8036 cc_library {
8037 name: "mylib",
8038 srcs: ["mylib.cpp"],
8039 static_libs: ["otherlib"],
8040 system_shared_libs: [],
8041 stl: "none",
8042 apex_available: [ "myapex" ],
8043 }
8044
8045 cc_library {
8046 name: "otherlib",
8047 srcs: ["mylib.cpp"],
8048 system_shared_libs: [],
8049 stl: "none",
8050 stubs: {
8051 versions: ["1", "2", "3"],
8052 },
8053 apex_available: [ "myapex" ],
8054 }
8055 `)
8056}
8057
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008058func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008059 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008060 apex {
8061 name: "myapex",
8062 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008063 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008064 custom_sign_tool: "sign_myapex",
8065 }
8066
8067 apex_key {
8068 name: "myapex.key",
8069 public_key: "testkey.avbpubkey",
8070 private_key: "testkey.pem",
8071 }
8072 `)
8073
8074 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8075 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8076 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"`)
8077}
8078
8079func TestApexKeysTxtOverrides(t *testing.T) {
8080 ctx := testApex(t, `
8081 apex {
8082 name: "myapex",
8083 key: "myapex.key",
8084 updatable: false,
8085 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008086 }
8087
8088 apex_key {
8089 name: "myapex.key",
8090 public_key: "testkey.avbpubkey",
8091 private_key: "testkey.pem",
8092 }
8093
8094 prebuilt_apex {
8095 name: "myapex",
8096 prefer: true,
8097 arch: {
8098 arm64: {
8099 src: "myapex-arm64.apex",
8100 },
8101 arm: {
8102 src: "myapex-arm.apex",
8103 },
8104 },
8105 }
8106
8107 apex_set {
8108 name: "myapex_set",
8109 set: "myapex.apks",
8110 filename: "myapex_set.apex",
8111 overrides: ["myapex"],
8112 }
8113 `)
8114
8115 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8116 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8117 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 +09008118 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 +09008119}
8120
Jooyung Han938b5932020-06-20 12:47:47 +09008121func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008122 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008123 apex {
8124 name: "myapex",
8125 key: "myapex.key",
8126 apps: ["app"],
8127 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008128 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008129 }
8130
8131 apex_key {
8132 name: "myapex.key",
8133 public_key: "testkey.avbpubkey",
8134 private_key: "testkey.pem",
8135 }
8136
8137 android_app {
8138 name: "app",
8139 srcs: ["foo/bar/MyClass.java"],
8140 package_name: "foo",
8141 sdk_version: "none",
8142 system_modules: "none",
8143 apex_available: [ "myapex" ],
8144 }
8145 `, withFiles(map[string][]byte{
8146 "sub/Android.bp": []byte(`
8147 override_apex {
8148 name: "override_myapex",
8149 base: "myapex",
8150 apps: ["override_app"],
8151 allowed_files: ":allowed",
8152 }
8153 // Overridable "path" property should be referenced indirectly
8154 filegroup {
8155 name: "allowed",
8156 srcs: ["allowed.txt"],
8157 }
8158 override_android_app {
8159 name: "override_app",
8160 base: "app",
8161 package_name: "bar",
8162 }
8163 `),
8164 }))
8165
8166 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8167 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8168 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8169 }
8170
8171 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8172 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8173 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8174 }
8175}
8176
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008177func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008178 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008179 apex {
8180 name: "myapex",
8181 key: "myapex.key",
8182 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008183 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008184 }
8185
8186 apex_key {
8187 name: "myapex.key",
8188 public_key: "testkey.avbpubkey",
8189 private_key: "testkey.pem",
8190 }
8191
8192 cc_library {
8193 name: "mylib",
8194 srcs: ["mylib.cpp"],
8195 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008196 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008197 },
8198 apex_available: ["myapex"],
8199 }
8200
8201 cc_prebuilt_library_shared {
8202 name: "mylib",
8203 prefer: false,
8204 srcs: ["prebuilt.so"],
8205 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008206 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008207 },
8208 apex_available: ["myapex"],
8209 }
8210 `)
8211}
8212
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008213func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008214 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008215 apex {
8216 name: "myapex",
8217 key: "myapex.key",
8218 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008219 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008220 }
8221 apex_key {
8222 name: "myapex.key",
8223 public_key: "testkey.avbpubkey",
8224 private_key: "testkey.pem",
8225 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008226 `,
8227 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8228 variables.CompressedApex = proptools.BoolPtr(true)
8229 }),
8230 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008231
8232 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8233 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8234
8235 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8236 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8237
8238 // Make sure output of bundle is .capex
8239 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8240 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8241
8242 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008243 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008244 var builder strings.Builder
8245 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8246 androidMk := builder.String()
8247 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8248}
8249
Martin Stjernholm2856c662020-12-02 15:03:42 +00008250func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008251 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008252 apex {
8253 name: "myapex",
8254 key: "myapex.key",
8255 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008256 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008257 }
8258
8259 apex_key {
8260 name: "myapex.key",
8261 public_key: "testkey.avbpubkey",
8262 private_key: "testkey.pem",
8263 }
8264
8265 cc_library {
8266 name: "mylib",
8267 srcs: ["mylib.cpp"],
8268 apex_available: ["myapex"],
8269 shared_libs: ["otherlib"],
8270 system_shared_libs: [],
8271 }
8272
8273 cc_library {
8274 name: "otherlib",
8275 srcs: ["mylib.cpp"],
8276 stubs: {
8277 versions: ["current"],
8278 },
8279 }
8280
8281 cc_prebuilt_library_shared {
8282 name: "otherlib",
8283 prefer: true,
8284 srcs: ["prebuilt.so"],
8285 stubs: {
8286 versions: ["current"],
8287 },
8288 }
8289 `)
8290
8291 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008292 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008293 var builder strings.Builder
8294 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8295 androidMk := builder.String()
8296
8297 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8298 // a thing there.
8299 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
8300}
8301
Jiyong Parke3867542020-12-03 17:28:25 +09008302func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008303 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008304 apex {
8305 name: "myapex",
8306 key: "myapex.key",
8307 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008308 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008309 }
8310
8311 apex_key {
8312 name: "myapex.key",
8313 public_key: "testkey.avbpubkey",
8314 private_key: "testkey.pem",
8315 }
8316
8317 cc_library {
8318 name: "mylib",
8319 srcs: ["mylib.cpp"],
8320 system_shared_libs: [],
8321 stl: "none",
8322 apex_available: ["myapex"],
8323 shared_libs: ["mylib2"],
8324 target: {
8325 apex: {
8326 exclude_shared_libs: ["mylib2"],
8327 },
8328 },
8329 }
8330
8331 cc_library {
8332 name: "mylib2",
8333 srcs: ["mylib.cpp"],
8334 system_shared_libs: [],
8335 stl: "none",
8336 }
8337 `)
8338
8339 // Check if mylib is linked to mylib2 for the non-apex target
8340 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8341 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8342
8343 // Make sure that the link doesn't occur for the apex target
8344 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8345 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8346
8347 // It shouldn't appear in the copy cmd as well.
8348 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8349 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8350}
8351
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008352func TestPrebuiltStubLibDep(t *testing.T) {
8353 bpBase := `
8354 apex {
8355 name: "myapex",
8356 key: "myapex.key",
8357 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008358 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008359 }
8360 apex_key {
8361 name: "myapex.key",
8362 public_key: "testkey.avbpubkey",
8363 private_key: "testkey.pem",
8364 }
8365 cc_library {
8366 name: "mylib",
8367 srcs: ["mylib.cpp"],
8368 apex_available: ["myapex"],
8369 shared_libs: ["stublib"],
8370 system_shared_libs: [],
8371 }
8372 apex {
8373 name: "otherapex",
8374 enabled: %s,
8375 key: "myapex.key",
8376 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008377 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008378 }
8379 `
8380
8381 stublibSourceBp := `
8382 cc_library {
8383 name: "stublib",
8384 srcs: ["mylib.cpp"],
8385 apex_available: ["otherapex"],
8386 system_shared_libs: [],
8387 stl: "none",
8388 stubs: {
8389 versions: ["1"],
8390 },
8391 }
8392 `
8393
8394 stublibPrebuiltBp := `
8395 cc_prebuilt_library_shared {
8396 name: "stublib",
8397 srcs: ["prebuilt.so"],
8398 apex_available: ["otherapex"],
8399 stubs: {
8400 versions: ["1"],
8401 },
8402 %s
8403 }
8404 `
8405
8406 tests := []struct {
8407 name string
8408 stublibBp string
8409 usePrebuilt bool
8410 modNames []string // Modules to collect AndroidMkEntries for
8411 otherApexEnabled []string
8412 }{
8413 {
8414 name: "only_source",
8415 stublibBp: stublibSourceBp,
8416 usePrebuilt: false,
8417 modNames: []string{"stublib"},
8418 otherApexEnabled: []string{"true", "false"},
8419 },
8420 {
8421 name: "source_preferred",
8422 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8423 usePrebuilt: false,
8424 modNames: []string{"stublib", "prebuilt_stublib"},
8425 otherApexEnabled: []string{"true", "false"},
8426 },
8427 {
8428 name: "prebuilt_preferred",
8429 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8430 usePrebuilt: true,
8431 modNames: []string{"stublib", "prebuilt_stublib"},
8432 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8433 },
8434 {
8435 name: "only_prebuilt",
8436 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8437 usePrebuilt: true,
8438 modNames: []string{"stublib"},
8439 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8440 },
8441 }
8442
8443 for _, test := range tests {
8444 t.Run(test.name, func(t *testing.T) {
8445 for _, otherApexEnabled := range test.otherApexEnabled {
8446 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008447 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008448
8449 type modAndMkEntries struct {
8450 mod *cc.Module
8451 mkEntries android.AndroidMkEntries
8452 }
8453 entries := []*modAndMkEntries{}
8454
8455 // Gather shared lib modules that are installable
8456 for _, modName := range test.modNames {
8457 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8458 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8459 continue
8460 }
8461 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008462 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008463 continue
8464 }
Colin Crossaa255532020-07-03 13:18:24 -07008465 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008466 if ent.Disabled {
8467 continue
8468 }
8469 entries = append(entries, &modAndMkEntries{
8470 mod: mod,
8471 mkEntries: ent,
8472 })
8473 }
8474 }
8475 }
8476
8477 var entry *modAndMkEntries = nil
8478 for _, ent := range entries {
8479 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8480 if entry != nil {
8481 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8482 } else {
8483 entry = ent
8484 }
8485 }
8486 }
8487
8488 if entry == nil {
8489 t.Errorf("AndroidMk entry for \"stublib\" missing")
8490 } else {
8491 isPrebuilt := entry.mod.Prebuilt() != nil
8492 if isPrebuilt != test.usePrebuilt {
8493 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8494 }
8495 if !entry.mod.IsStubs() {
8496 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8497 }
8498 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8499 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8500 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008501 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008502 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008503 if !android.InList(expected, cflags) {
8504 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8505 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008506 }
8507 })
8508 }
8509 })
8510 }
8511}
8512
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008513func TestHostApexInHostOnlyBuild(t *testing.T) {
8514 testApex(t, `
8515 apex {
8516 name: "myapex",
8517 host_supported: true,
8518 key: "myapex.key",
8519 updatable: false,
8520 payload_type: "zip",
8521 }
8522 apex_key {
8523 name: "myapex.key",
8524 public_key: "testkey.avbpubkey",
8525 private_key: "testkey.pem",
8526 }
8527 `,
8528 android.FixtureModifyConfig(func(config android.Config) {
8529 // We may not have device targets in all builds, e.g. in
8530 // prebuilts/build-tools/build-prebuilts.sh
8531 config.Targets[android.Android] = []android.Target{}
8532 }))
8533}
8534
Colin Crossc33e5212021-05-25 18:16:02 -07008535func TestApexJavaCoverage(t *testing.T) {
8536 bp := `
8537 apex {
8538 name: "myapex",
8539 key: "myapex.key",
8540 java_libs: ["mylib"],
8541 bootclasspath_fragments: ["mybootclasspathfragment"],
8542 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8543 updatable: false,
8544 }
8545
8546 apex_key {
8547 name: "myapex.key",
8548 public_key: "testkey.avbpubkey",
8549 private_key: "testkey.pem",
8550 }
8551
8552 java_library {
8553 name: "mylib",
8554 srcs: ["mylib.java"],
8555 apex_available: ["myapex"],
8556 compile_dex: true,
8557 }
8558
8559 bootclasspath_fragment {
8560 name: "mybootclasspathfragment",
8561 contents: ["mybootclasspathlib"],
8562 apex_available: ["myapex"],
8563 }
8564
8565 java_library {
8566 name: "mybootclasspathlib",
8567 srcs: ["mybootclasspathlib.java"],
8568 apex_available: ["myapex"],
8569 compile_dex: true,
8570 }
8571
8572 systemserverclasspath_fragment {
8573 name: "mysystemserverclasspathfragment",
8574 contents: ["mysystemserverclasspathlib"],
8575 apex_available: ["myapex"],
8576 }
8577
8578 java_library {
8579 name: "mysystemserverclasspathlib",
8580 srcs: ["mysystemserverclasspathlib.java"],
8581 apex_available: ["myapex"],
8582 compile_dex: true,
8583 }
8584 `
8585
8586 result := android.GroupFixturePreparers(
8587 PrepareForTestWithApexBuildComponents,
8588 prepareForTestWithMyapex,
8589 java.PrepareForTestWithJavaDefaultModules,
8590 android.PrepareForTestWithAndroidBuildComponents,
8591 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008592 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8593 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008594 android.FixtureMergeEnv(map[string]string{
8595 "EMMA_INSTRUMENT": "true",
8596 }),
8597 ).RunTest(t)
8598
8599 // Make sure jacoco ran on both mylib and mybootclasspathlib
8600 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8601 t.Errorf("Failed to find jacoco rule for mylib")
8602 }
8603 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8604 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8605 }
8606 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8607 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8608 }
8609}
8610
Jiyong Park192600a2021-08-03 07:52:17 +00008611func TestProhibitStaticExecutable(t *testing.T) {
8612 testApexError(t, `executable mybin is static`, `
8613 apex {
8614 name: "myapex",
8615 key: "myapex.key",
8616 binaries: ["mybin"],
8617 min_sdk_version: "29",
8618 }
8619
8620 apex_key {
8621 name: "myapex.key",
8622 public_key: "testkey.avbpubkey",
8623 private_key: "testkey.pem",
8624 }
8625
8626 cc_binary {
8627 name: "mybin",
8628 srcs: ["mylib.cpp"],
8629 relative_install_path: "foo/bar",
8630 static_executable: true,
8631 system_shared_libs: [],
8632 stl: "none",
8633 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008634 min_sdk_version: "29",
8635 }
8636 `)
8637
8638 testApexError(t, `executable mybin.rust is static`, `
8639 apex {
8640 name: "myapex",
8641 key: "myapex.key",
8642 binaries: ["mybin.rust"],
8643 min_sdk_version: "29",
8644 }
8645
8646 apex_key {
8647 name: "myapex.key",
8648 public_key: "testkey.avbpubkey",
8649 private_key: "testkey.pem",
8650 }
8651
8652 rust_binary {
8653 name: "mybin.rust",
8654 srcs: ["foo.rs"],
8655 static_executable: true,
8656 apex_available: ["myapex"],
8657 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008658 }
8659 `)
8660}
8661
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008662func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8663 ctx := testApex(t, `
8664 apex {
8665 name: "myapex",
8666 key: "myapex.key",
8667 updatable: false,
8668 java_libs: ["foo"],
8669 }
8670
8671 apex_key {
8672 name: "myapex.key",
8673 public_key: "testkey.avbpubkey",
8674 private_key: "testkey.pem",
8675 }
8676
8677 java_library {
8678 name: "foo",
8679 srcs: ["foo.java"],
8680 apex_available: ["myapex"],
8681 installable: true,
8682 }
8683 `,
8684 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8685 )
8686
8687 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8688 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8689 var builder strings.Builder
8690 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8691 androidMk := builder.String()
8692 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")
8693}
8694
8695func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8696 ctx := testApex(t, `
8697 prebuilt_apex {
8698 name: "myapex",
8699 arch: {
8700 arm64: {
8701 src: "myapex-arm64.apex",
8702 },
8703 arm: {
8704 src: "myapex-arm.apex",
8705 },
8706 },
8707 exported_java_libs: ["foo"],
8708 }
8709
8710 java_import {
8711 name: "foo",
8712 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00008713 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008714 }
8715 `,
8716 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8717 )
8718
8719 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8720 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8721 mainModuleEntries := entriesList[0]
8722 android.AssertArrayString(t,
8723 "LOCAL_REQUIRED_MODULES",
8724 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8725 []string{
8726 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8727 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8728 })
8729}
8730
Jiyong Parkcacc4f32021-10-28 14:26:03 +09008731func TestAndroidMk_RequiredModules(t *testing.T) {
8732 ctx := testApex(t, `
8733 apex {
8734 name: "myapex",
8735 key: "myapex.key",
8736 updatable: false,
8737 java_libs: ["foo"],
8738 required: ["otherapex"],
8739 }
8740
8741 apex {
8742 name: "otherapex",
8743 key: "myapex.key",
8744 updatable: false,
8745 java_libs: ["foo"],
8746 required: ["otherapex"],
8747 }
8748
8749 apex_key {
8750 name: "myapex.key",
8751 public_key: "testkey.avbpubkey",
8752 private_key: "testkey.pem",
8753 }
8754
8755 java_library {
8756 name: "foo",
8757 srcs: ["foo.java"],
8758 apex_available: ["myapex", "otherapex"],
8759 installable: true,
8760 }
8761 `)
8762
8763 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8764 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8765 var builder strings.Builder
8766 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8767 androidMk := builder.String()
8768 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherapex")
8769}
8770
Jiakai Zhangd70dff72022-02-24 15:06:05 +00008771func TestAndroidMk_RequiredDeps(t *testing.T) {
8772 ctx := testApex(t, `
8773 apex {
8774 name: "myapex",
8775 key: "myapex.key",
8776 updatable: false,
8777 }
8778
8779 apex_key {
8780 name: "myapex.key",
8781 public_key: "testkey.avbpubkey",
8782 private_key: "testkey.pem",
8783 }
8784 `)
8785
8786 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8787 bundle.requiredDeps = append(bundle.requiredDeps, "foo")
8788 data := android.AndroidMkDataForTest(t, ctx, bundle)
8789 var builder strings.Builder
8790 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
8791 androidMk := builder.String()
8792 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo")
8793
8794 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
8795 flattenedBundle.requiredDeps = append(flattenedBundle.requiredDeps, "foo")
8796 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
8797 var flattenedBuilder strings.Builder
8798 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
8799 flattenedAndroidMk := flattenedBuilder.String()
8800 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES += foo")
8801}
8802
Jooyung Hana6d36672022-02-24 13:58:07 +09008803func TestApexOutputFileProducer(t *testing.T) {
8804 for _, tc := range []struct {
8805 name string
8806 ref string
8807 expected_data []string
8808 }{
8809 {
8810 name: "test_using_output",
8811 ref: ":myapex",
8812 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
8813 },
8814 {
8815 name: "test_using_apex",
8816 ref: ":myapex{.apex}",
8817 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
8818 },
8819 } {
8820 t.Run(tc.name, func(t *testing.T) {
8821 ctx := testApex(t, `
8822 apex {
8823 name: "myapex",
8824 key: "myapex.key",
8825 compressible: true,
8826 updatable: false,
8827 }
8828
8829 apex_key {
8830 name: "myapex.key",
8831 public_key: "testkey.avbpubkey",
8832 private_key: "testkey.pem",
8833 }
8834
8835 java_test {
8836 name: "`+tc.name+`",
8837 srcs: ["a.java"],
8838 data: ["`+tc.ref+`"],
8839 }
8840 `,
8841 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8842 variables.CompressedApex = proptools.BoolPtr(true)
8843 }))
8844 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
8845 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
8846 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
8847 })
8848 }
8849}
8850
satayev758968a2021-12-06 11:42:40 +00008851func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
8852 preparer := android.GroupFixturePreparers(
8853 PrepareForTestWithApexBuildComponents,
8854 prepareForTestWithMyapex,
8855 java.PrepareForTestWithJavaSdkLibraryFiles,
8856 java.PrepareForTestWithJavaDefaultModules,
8857 android.PrepareForTestWithAndroidBuildComponents,
8858 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8859 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
8860 )
8861
8862 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
8863 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8864 preparer.RunTestWithBp(t, `
8865 apex {
8866 name: "myapex",
8867 key: "myapex.key",
8868 bootclasspath_fragments: ["mybootclasspathfragment"],
8869 min_sdk_version: "30",
8870 updatable: false,
8871 }
8872
8873 apex_key {
8874 name: "myapex.key",
8875 public_key: "testkey.avbpubkey",
8876 private_key: "testkey.pem",
8877 }
8878
8879 bootclasspath_fragment {
8880 name: "mybootclasspathfragment",
8881 contents: ["mybootclasspathlib"],
8882 apex_available: ["myapex"],
8883 }
8884
8885 java_sdk_library {
8886 name: "mybootclasspathlib",
8887 srcs: ["mybootclasspathlib.java"],
8888 apex_available: ["myapex"],
8889 compile_dex: true,
8890 unsafe_ignore_missing_latest_api: true,
8891 min_sdk_version: "31",
8892 static_libs: ["util"],
8893 }
8894
8895 java_library {
8896 name: "util",
8897 srcs: ["a.java"],
8898 apex_available: ["myapex"],
8899 min_sdk_version: "31",
8900 static_libs: ["another_util"],
8901 }
8902
8903 java_library {
8904 name: "another_util",
8905 srcs: ["a.java"],
8906 min_sdk_version: "31",
8907 apex_available: ["myapex"],
8908 }
8909 `)
8910 })
8911
8912 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
8913 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
8914 preparer.RunTestWithBp(t, `
8915 apex {
8916 name: "myapex",
8917 key: "myapex.key",
8918 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8919 min_sdk_version: "30",
8920 updatable: false,
8921 }
8922
8923 apex_key {
8924 name: "myapex.key",
8925 public_key: "testkey.avbpubkey",
8926 private_key: "testkey.pem",
8927 }
8928
8929 systemserverclasspath_fragment {
8930 name: "mysystemserverclasspathfragment",
8931 contents: ["mysystemserverclasspathlib"],
8932 apex_available: ["myapex"],
8933 }
8934
8935 java_sdk_library {
8936 name: "mysystemserverclasspathlib",
8937 srcs: ["mysystemserverclasspathlib.java"],
8938 apex_available: ["myapex"],
8939 compile_dex: true,
8940 min_sdk_version: "32",
8941 unsafe_ignore_missing_latest_api: true,
8942 static_libs: ["util"],
8943 }
8944
8945 java_library {
8946 name: "util",
8947 srcs: ["a.java"],
8948 apex_available: ["myapex"],
8949 min_sdk_version: "31",
8950 static_libs: ["another_util"],
8951 }
8952
8953 java_library {
8954 name: "another_util",
8955 srcs: ["a.java"],
8956 min_sdk_version: "31",
8957 apex_available: ["myapex"],
8958 }
8959 `)
8960 })
8961
8962 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8963 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
8964 RunTestWithBp(t, `
8965 apex {
8966 name: "myapex",
8967 key: "myapex.key",
8968 bootclasspath_fragments: ["mybootclasspathfragment"],
8969 min_sdk_version: "30",
8970 updatable: false,
8971 }
8972
8973 apex_key {
8974 name: "myapex.key",
8975 public_key: "testkey.avbpubkey",
8976 private_key: "testkey.pem",
8977 }
8978
8979 bootclasspath_fragment {
8980 name: "mybootclasspathfragment",
8981 contents: ["mybootclasspathlib"],
8982 apex_available: ["myapex"],
8983 }
8984
8985 java_sdk_library {
8986 name: "mybootclasspathlib",
8987 srcs: ["mybootclasspathlib.java"],
8988 apex_available: ["myapex"],
8989 compile_dex: true,
8990 unsafe_ignore_missing_latest_api: true,
8991 }
8992 `)
8993 })
8994
8995 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
8996 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
8997 RunTestWithBp(t, `
8998 apex {
8999 name: "myapex",
9000 key: "myapex.key",
9001 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9002 min_sdk_version: "30",
9003 updatable: false,
9004 }
9005
9006 apex_key {
9007 name: "myapex.key",
9008 public_key: "testkey.avbpubkey",
9009 private_key: "testkey.pem",
9010 }
9011
9012 systemserverclasspath_fragment {
9013 name: "mysystemserverclasspathfragment",
9014 contents: ["mysystemserverclasspathlib"],
9015 apex_available: ["myapex"],
9016 }
9017
9018 java_sdk_library {
9019 name: "mysystemserverclasspathlib",
9020 srcs: ["mysystemserverclasspathlib.java"],
9021 apex_available: ["myapex"],
9022 compile_dex: true,
9023 unsafe_ignore_missing_latest_api: true,
9024 }
9025 `)
9026 })
9027}
9028
Jiakai Zhang6decef92022-01-12 17:56:19 +00009029// Verifies that the APEX depends on all the Make modules in the list.
9030func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9031 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9032 for _, dep := range deps {
9033 android.AssertStringListContains(t, "", a.requiredDeps, dep)
9034 }
9035}
9036
9037// Verifies that the APEX does not depend on any of the Make modules in the list.
9038func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9039 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9040 for _, dep := range deps {
9041 android.AssertStringListDoesNotContain(t, "", a.requiredDeps, dep)
9042 }
9043}
9044
Spandan Das66773252022-01-15 00:23:18 +00009045func TestApexStrictUpdtabilityLint(t *testing.T) {
9046 bpTemplate := `
9047 apex {
9048 name: "myapex",
9049 key: "myapex.key",
9050 java_libs: ["myjavalib"],
9051 updatable: %v,
9052 min_sdk_version: "29",
9053 }
9054 apex_key {
9055 name: "myapex.key",
9056 }
9057 java_library {
9058 name: "myjavalib",
9059 srcs: ["MyClass.java"],
9060 apex_available: [ "myapex" ],
9061 lint: {
9062 strict_updatability_linting: %v,
9063 },
9064 sdk_version: "current",
9065 min_sdk_version: "29",
9066 }
9067 `
9068 fs := android.MockFS{
9069 "lint-baseline.xml": nil,
9070 }
9071
9072 testCases := []struct {
9073 testCaseName string
9074 apexUpdatable bool
9075 javaStrictUpdtabilityLint bool
9076 lintFileExists bool
9077 disallowedFlagExpected bool
9078 }{
9079 {
9080 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9081 apexUpdatable: true,
9082 javaStrictUpdtabilityLint: true,
9083 lintFileExists: false,
9084 disallowedFlagExpected: false,
9085 },
9086 {
9087 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9088 apexUpdatable: false,
9089 javaStrictUpdtabilityLint: false,
9090 lintFileExists: true,
9091 disallowedFlagExpected: false,
9092 },
9093 {
9094 testCaseName: "non-updatable apex respects strict updatability of javalib",
9095 apexUpdatable: false,
9096 javaStrictUpdtabilityLint: true,
9097 lintFileExists: true,
9098 disallowedFlagExpected: true,
9099 },
9100 {
9101 testCaseName: "updatable apex sets strict updatability of javalib to true",
9102 apexUpdatable: true,
9103 javaStrictUpdtabilityLint: false, // will be set to true by mutator
9104 lintFileExists: true,
9105 disallowedFlagExpected: true,
9106 },
9107 }
9108
9109 for _, testCase := range testCases {
9110 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9111 fixtures := []android.FixturePreparer{}
9112 if testCase.lintFileExists {
9113 fixtures = append(fixtures, fs.AddToFixture())
9114 }
9115
9116 result := testApex(t, bp, fixtures...)
9117 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9118 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9119 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9120
9121 if disallowedFlagActual != testCase.disallowedFlagExpected {
9122 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9123 }
9124 }
9125}
9126
Spandan Dasd9c23ab2022-02-10 02:34:13 +00009127func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9128 bp := `
9129 apex {
9130 name: "myapex",
9131 key: "myapex.key",
9132 java_libs: ["myjavalib"],
9133 updatable: true,
9134 min_sdk_version: "29",
9135 }
9136 apex_key {
9137 name: "myapex.key",
9138 }
9139 java_library {
9140 name: "myjavalib",
9141 srcs: ["MyClass.java"],
9142 apex_available: [ "myapex" ],
9143 sdk_version: "current",
9144 min_sdk_version: "29",
9145 }
9146 `
9147
9148 testCases := []struct {
9149 testCaseName string
9150 moduleDirectory string
9151 disallowedFlagExpected bool
9152 }{
9153 {
9154 testCaseName: "lintable module defined outside libcore",
9155 moduleDirectory: "",
9156 disallowedFlagExpected: true,
9157 },
9158 {
9159 testCaseName: "lintable module defined in libcore root directory",
9160 moduleDirectory: "libcore/",
9161 disallowedFlagExpected: false,
9162 },
9163 {
9164 testCaseName: "lintable module defined in libcore child directory",
9165 moduleDirectory: "libcore/childdir/",
9166 disallowedFlagExpected: true,
9167 },
9168 }
9169
9170 for _, testCase := range testCases {
9171 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9172 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9173 result := testApex(t, "", lintFileCreator, bpFileCreator)
9174 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9175 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9176 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9177 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9178
9179 if disallowedFlagActual != testCase.disallowedFlagExpected {
9180 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9181 }
9182 }
9183}
9184
Spandan Das66773252022-01-15 00:23:18 +00009185// checks transtive deps of an apex coming from bootclasspath_fragment
9186func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9187 bp := `
9188 apex {
9189 name: "myapex",
9190 key: "myapex.key",
9191 bootclasspath_fragments: ["mybootclasspathfragment"],
9192 updatable: true,
9193 min_sdk_version: "29",
9194 }
9195 apex_key {
9196 name: "myapex.key",
9197 }
9198 bootclasspath_fragment {
9199 name: "mybootclasspathfragment",
9200 contents: ["myjavalib"],
9201 apex_available: ["myapex"],
9202 }
9203 java_library {
9204 name: "myjavalib",
9205 srcs: ["MyClass.java"],
9206 apex_available: [ "myapex" ],
9207 sdk_version: "current",
9208 min_sdk_version: "29",
9209 compile_dex: true,
9210 }
9211 `
9212 fs := android.MockFS{
9213 "lint-baseline.xml": nil,
9214 }
9215
9216 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9217 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9218 sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9219 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9220 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9221 }
9222}
9223
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009224func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01009225 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07009226}